diff --git a/Microsoft.Bot.Builder.sln b/Microsoft.Bot.Builder.sln index c167f6f67b..ddc92ee7ca 100644 --- a/Microsoft.Bot.Builder.sln +++ b/Microsoft.Bot.Builder.sln @@ -248,715 +248,1431 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Debug-Windows|Any CPU = Debug-Windows|Any CPU + Debug-Windows|x64 = Debug-Windows|x64 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 Release-Windows|Any CPU = Release-Windows|Any CPU + Release-Windows|x64 = Release-Windows|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|x64.ActiveCfg = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|x64.Build.0 = Debug|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|x64.Build.0 = Debug|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.ActiveCfg = Release|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.Build.0 = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|x64.ActiveCfg = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|x64.Build.0 = Release|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|x64.Build.0 = Release|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|x64.Build.0 = Debug|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|x64.Build.0 = Debug|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.Build.0 = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|x64.ActiveCfg = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|x64.Build.0 = Release|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|x64.Build.0 = Release|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|x64.ActiveCfg = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|x64.Build.0 = Debug|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.Build.0 = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|x64.ActiveCfg = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|x64.Build.0 = Release|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|x64.Build.0 = Release|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|x64.Build.0 = Debug|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.Build.0 = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|x64.ActiveCfg = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|x64.Build.0 = Release|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|x64.Build.0 = Release|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|x64.ActiveCfg = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|x64.Build.0 = Debug|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|x64.Build.0 = Debug|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.Build.0 = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|x64.ActiveCfg = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|x64.Build.0 = Release|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|x64.Build.0 = Release|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|x64.ActiveCfg = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|x64.Build.0 = Debug|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|x64.Build.0 = Debug|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.ActiveCfg = Release|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.Build.0 = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|x64.ActiveCfg = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|x64.Build.0 = Release|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|x64.Build.0 = Release|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|x64.ActiveCfg = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|x64.Build.0 = Debug|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|x64.Build.0 = Debug|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.ActiveCfg = Release|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.Build.0 = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|x64.ActiveCfg = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|x64.Build.0 = Release|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|x64.Build.0 = Release|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|x64.Build.0 = Debug|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|x64.Build.0 = Debug|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.Build.0 = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|x64.ActiveCfg = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|x64.Build.0 = Release|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|x64.Build.0 = Release|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|x64.Build.0 = Debug|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|x64.Build.0 = Debug|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.Build.0 = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|x64.ActiveCfg = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|x64.Build.0 = Release|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|x64.Build.0 = Release|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|x64.ActiveCfg = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|x64.Build.0 = Debug|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|x64.Build.0 = Debug|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.ActiveCfg = Release|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.Build.0 = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|x64.ActiveCfg = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|x64.Build.0 = Release|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|x64.Build.0 = Release|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|x64.ActiveCfg = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|x64.Build.0 = Debug|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|x64.Build.0 = Debug|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.ActiveCfg = Release|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.Build.0 = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|x64.ActiveCfg = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|x64.Build.0 = Release|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|x64.Build.0 = Release|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|x64.ActiveCfg = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|x64.Build.0 = Debug|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|x64.Build.0 = Debug|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.Build.0 = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|x64.ActiveCfg = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|x64.Build.0 = Release|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|x64.Build.0 = Release|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|x64.ActiveCfg = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|x64.Build.0 = Debug|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|x64.Build.0 = Debug|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.ActiveCfg = Release|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.Build.0 = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|x64.ActiveCfg = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|x64.Build.0 = Release|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|x64.Build.0 = Release|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|x64.Build.0 = Debug|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|x64.Build.0 = Debug|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.Build.0 = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|x64.ActiveCfg = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|x64.Build.0 = Release|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|x64.Build.0 = Release|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|x64.ActiveCfg = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|x64.Build.0 = Debug|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|x64.Build.0 = Debug|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.ActiveCfg = Release|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.Build.0 = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|x64.ActiveCfg = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|x64.Build.0 = Release|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|x64.Build.0 = Release|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|x64.ActiveCfg = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|x64.Build.0 = Debug|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.Build.0 = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|x64.ActiveCfg = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|x64.Build.0 = Release|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|x64.Build.0 = Release|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|x64.Build.0 = Debug|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|x64.Build.0 = Debug|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.Build.0 = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|x64.ActiveCfg = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|x64.Build.0 = Release|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|x64.Build.0 = Release|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|x64.Build.0 = Debug|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|x64.Build.0 = Debug|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.Build.0 = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|x64.ActiveCfg = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|x64.Build.0 = Release|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|x64.Build.0 = Release|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|x64.ActiveCfg = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|x64.Build.0 = Debug|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|x64.Build.0 = Debug|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.Build.0 = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|x64.ActiveCfg = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|x64.Build.0 = Release|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|x64.Build.0 = Release|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|x64.ActiveCfg = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|x64.Build.0 = Debug|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|x64.Build.0 = Debug|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.Build.0 = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|x64.ActiveCfg = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|x64.Build.0 = Release|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|x64.Build.0 = Release|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|x64.ActiveCfg = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|x64.Build.0 = Debug|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.ActiveCfg = Release|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.Build.0 = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|x64.ActiveCfg = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|x64.Build.0 = Release|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|x64.Build.0 = Release|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|x64.ActiveCfg = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|x64.Build.0 = Debug|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|x64.Build.0 = Debug|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.ActiveCfg = Release|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.Build.0 = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|x64.ActiveCfg = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|x64.Build.0 = Release|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|x64.Build.0 = Release|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|x64.ActiveCfg = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|x64.Build.0 = Debug|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|x64.Build.0 = Debug|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.Build.0 = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|x64.ActiveCfg = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|x64.Build.0 = Release|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|x64.Build.0 = Release|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|x64.ActiveCfg = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|x64.Build.0 = Debug|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|x64.Build.0 = Debug|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.Build.0 = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|x64.ActiveCfg = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|x64.Build.0 = Release|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|x64.Build.0 = Release|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|x64.Build.0 = Debug|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.Build.0 = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|x64.ActiveCfg = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|x64.Build.0 = Release|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|x64.Build.0 = Release|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|x64.ActiveCfg = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|x64.Build.0 = Debug|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|x64.Build.0 = Debug|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.Build.0 = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|x64.ActiveCfg = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|x64.Build.0 = Release|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|x64.Build.0 = Release|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|x64.ActiveCfg = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|x64.Build.0 = Debug|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.ActiveCfg = Release|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.Build.0 = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|x64.ActiveCfg = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|x64.Build.0 = Release|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|x64.Build.0 = Release|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|x64.ActiveCfg = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|x64.Build.0 = Debug|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|x64.Build.0 = Debug|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.ActiveCfg = Release|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.Build.0 = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release|x64.ActiveCfg = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release|x64.Build.0 = Release|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|x64.Build.0 = Release|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|x64.Build.0 = Debug|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|x64.Build.0 = Debug|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.Build.0 = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|x64.ActiveCfg = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|x64.Build.0 = Release|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|x64.Build.0 = Release|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.Build.0 = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|x64.ActiveCfg = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|x64.Build.0 = Debug|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|x64.Build.0 = Debug|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.ActiveCfg = Release|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.Build.0 = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release|x64.ActiveCfg = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release|x64.Build.0 = Release|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|x64.Build.0 = Release|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|x64.Build.0 = Debug|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.Build.0 = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|x64.ActiveCfg = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|x64.Build.0 = Release|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|x64.Build.0 = Release|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|x64.ActiveCfg = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|x64.Build.0 = Debug|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|x64.Build.0 = Debug|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.ActiveCfg = Release|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.Build.0 = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|x64.ActiveCfg = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|x64.Build.0 = Release|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|x64.Build.0 = Release|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|x64.ActiveCfg = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|x64.Build.0 = Debug|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|x64.Build.0 = Debug|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.ActiveCfg = Release|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.Build.0 = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|x64.ActiveCfg = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|x64.Build.0 = Release|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|x64.Build.0 = Release|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|x64.Build.0 = Debug|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|x64.Build.0 = Debug|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.Build.0 = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|x64.ActiveCfg = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|x64.Build.0 = Release|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|x64.Build.0 = Release|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|x64.ActiveCfg = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|x64.Build.0 = Debug|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.Build.0 = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|x64.ActiveCfg = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|x64.Build.0 = Release|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|x64.Build.0 = Release|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|x64.ActiveCfg = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|x64.Build.0 = Debug|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.ActiveCfg = Release|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.Build.0 = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release|x64.ActiveCfg = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release|x64.Build.0 = Release|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|x64.Build.0 = Release|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|x64.ActiveCfg = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|x64.Build.0 = Debug|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|x64.Build.0 = Debug|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.ActiveCfg = Release|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.Build.0 = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|x64.ActiveCfg = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|x64.Build.0 = Release|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|x64.Build.0 = Release|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|x64.ActiveCfg = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|x64.Build.0 = Debug|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|x64.Build.0 = Debug|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.ActiveCfg = Release|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.Build.0 = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|x64.ActiveCfg = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|x64.Build.0 = Release|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|x64.Build.0 = Release|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|x64.ActiveCfg = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|x64.Build.0 = Debug|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|x64.Build.0 = Debug|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.ActiveCfg = Release|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.Build.0 = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|x64.ActiveCfg = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|x64.Build.0 = Release|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|x64.Build.0 = Release|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|x64.ActiveCfg = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|x64.Build.0 = Debug|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|x64.Build.0 = Debug|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.ActiveCfg = Release|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.Build.0 = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|x64.ActiveCfg = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|x64.Build.0 = Release|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|x64.Build.0 = Release|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|x64.Build.0 = Debug|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|x64.Build.0 = Debug|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.Build.0 = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|x64.ActiveCfg = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|x64.Build.0 = Release|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|x64.Build.0 = Release|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|x64.ActiveCfg = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|x64.Build.0 = Debug|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.Build.0 = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|x64.ActiveCfg = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|x64.Build.0 = Release|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|x64.Build.0 = Release|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|x64.Build.0 = Debug|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|x64.Build.0 = Debug|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.Build.0 = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|x64.ActiveCfg = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|x64.Build.0 = Release|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|x64.Build.0 = Release|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|x64.ActiveCfg = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|x64.Build.0 = Debug|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|x64.Build.0 = Debug|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.ActiveCfg = Release|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.Build.0 = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|x64.ActiveCfg = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|x64.Build.0 = Release|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|x64.Build.0 = Release|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|x64.Build.0 = Debug|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|x64.Build.0 = Debug|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.Build.0 = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|x64.ActiveCfg = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|x64.Build.0 = Release|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|x64.Build.0 = Release|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug|x64.ActiveCfg = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug|x64.Build.0 = Debug|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|x64.Build.0 = Debug|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release|x64.ActiveCfg = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release|x64.Build.0 = Release|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|x64.Build.0 = Release|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug|x64.ActiveCfg = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug|x64.Build.0 = Debug|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|x64.Build.0 = Debug|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release|x64.ActiveCfg = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release|x64.Build.0 = Release|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|x64.Build.0 = Release|Any CPU {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug|x64.ActiveCfg = Debug|x64 + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug|x64.Build.0 = Debug|x64 {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|x64.ActiveCfg = Debug-Windows|x64 + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|x64.Build.0 = Debug-Windows|x64 {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release|x64.ActiveCfg = Release|x64 + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release|x64.Build.0 = Release|x64 {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|x64.ActiveCfg = Release-Windows|x64 + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|x64.Build.0 = Release-Windows|x64 {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug|x64.ActiveCfg = Debug|x64 + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug|x64.Build.0 = Debug|x64 {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|x64.ActiveCfg = Debug-Windows|x64 + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|x64.Build.0 = Debug-Windows|x64 {2614D290-1345-4A41-BE90-F85F817CEADE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release|x64.ActiveCfg = Release|x64 + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release|x64.Build.0 = Release|x64 {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|x64.ActiveCfg = Release-Windows|x64 + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|x64.Build.0 = Release-Windows|x64 {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|x64.Build.0 = Debug|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|x64.Build.0 = Debug|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.Build.0 = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release|x64.ActiveCfg = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release|x64.Build.0 = Release|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|x64.Build.0 = Release|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|x64.Build.0 = Debug|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|x64.Build.0 = Debug|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.Build.0 = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|x64.ActiveCfg = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|x64.Build.0 = Release|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|x64.Build.0 = Release|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|x64.Build.0 = Debug|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|x64.Build.0 = Debug|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.Build.0 = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|x64.ActiveCfg = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|x64.Build.0 = Release|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|x64.Build.0 = Release|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|x64.ActiveCfg = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|x64.Build.0 = Debug|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|x64.Build.0 = Debug|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.ActiveCfg = Release|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.Build.0 = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|x64.ActiveCfg = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|x64.Build.0 = Release|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|x64.Build.0 = Release|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|x64.Build.0 = Debug|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|x64.Build.0 = Debug|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.Build.0 = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|x64.ActiveCfg = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|x64.Build.0 = Release|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|x64.Build.0 = Release|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|x64.ActiveCfg = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|x64.Build.0 = Debug|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.Build.0 = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|x64.ActiveCfg = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|x64.Build.0 = Release|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|x64.Build.0 = Release|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|x64.Build.0 = Debug|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.Build.0 = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|x64.ActiveCfg = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|x64.Build.0 = Release|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|x64.Build.0 = Release|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|x64.ActiveCfg = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|x64.Build.0 = Debug|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|x64.Build.0 = Debug|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.ActiveCfg = Release|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.Build.0 = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|x64.ActiveCfg = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|x64.Build.0 = Release|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|x64.Build.0 = Release|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|x64.ActiveCfg = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|x64.Build.0 = Debug|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|x64.Build.0 = Debug|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.ActiveCfg = Release|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.Build.0 = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|x64.ActiveCfg = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|x64.Build.0 = Release|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|x64.Build.0 = Release|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|x64.ActiveCfg = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|x64.Build.0 = Debug|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|x64.Build.0 = Debug|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.Build.0 = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|x64.ActiveCfg = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|x64.Build.0 = Release|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|x64.Build.0 = Release|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|x64.ActiveCfg = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|x64.Build.0 = Debug|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|x64.Build.0 = Debug|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.ActiveCfg = Release|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.Build.0 = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|x64.ActiveCfg = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|x64.Build.0 = Release|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|x64.Build.0 = Release|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|x64.ActiveCfg = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|x64.Build.0 = Debug|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|x64.Build.0 = Debug|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.ActiveCfg = Release|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.Build.0 = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|x64.ActiveCfg = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|x64.Build.0 = Release|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|x64.Build.0 = Release|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|x64.Build.0 = Debug|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|x64.Build.0 = Debug|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.Build.0 = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|x64.ActiveCfg = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|x64.Build.0 = Release|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|x64.Build.0 = Release|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|x64.Build.0 = Debug|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|x64.Build.0 = Debug|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.Build.0 = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|x64.ActiveCfg = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|x64.Build.0 = Release|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|x64.Build.0 = Release|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|x64.ActiveCfg = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|x64.Build.0 = Debug|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.Build.0 = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|x64.ActiveCfg = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|x64.Build.0 = Release|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|x64.Build.0 = Release|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|x64.ActiveCfg = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|x64.Build.0 = Debug|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|x64.Build.0 = Debug|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.ActiveCfg = Release|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.Build.0 = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|x64.ActiveCfg = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|x64.Build.0 = Release|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|x64.Build.0 = Release|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|x64.ActiveCfg = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|x64.Build.0 = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.ActiveCfg = Release|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.Build.0 = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|x64.ActiveCfg = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|x64.Build.0 = Release|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|x64.Build.0 = Release|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|x64.ActiveCfg = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|x64.Build.0 = Debug|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|x64.Build.0 = Debug|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.ActiveCfg = Release|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.Build.0 = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|x64.ActiveCfg = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|x64.Build.0 = Release|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|x64.Build.0 = Release|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|x64.ActiveCfg = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|x64.Build.0 = Debug|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|x64.Build.0 = Debug|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.ActiveCfg = Release|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.Build.0 = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|x64.ActiveCfg = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|x64.Build.0 = Release|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|x64.Build.0 = Release|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|x64.ActiveCfg = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|x64.Build.0 = Debug|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.Build.0 = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|x64.ActiveCfg = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|x64.Build.0 = Release|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|x64.Build.0 = Release|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|x64.ActiveCfg = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|x64.Build.0 = Debug|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|x64.Build.0 = Debug|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.ActiveCfg = Release|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.Build.0 = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|x64.ActiveCfg = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|x64.Build.0 = Release|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|x64.Build.0 = Release|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|x64.ActiveCfg = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|x64.Build.0 = Debug|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.ActiveCfg = Release|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.Build.0 = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release|x64.ActiveCfg = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release|x64.Build.0 = Release|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|x64.Build.0 = Release|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|x64.ActiveCfg = Debug|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|x64.Build.0 = Debug|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|x64.Build.0 = Debug|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.ActiveCfg = Release|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.Build.0 = Release|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|x64.ActiveCfg = Release|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|x64.Build.0 = Release|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|x64.Build.0 = Release|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|x64.ActiveCfg = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|x64.Build.0 = Debug|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|x64.Build.0 = Debug|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.Build.0 = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|x64.ActiveCfg = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|x64.Build.0 = Release|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|x64.Build.0 = Release|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|x64.Build.0 = Debug|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|x64.Build.0 = Debug|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.ActiveCfg = Release|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.Build.0 = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|x64.ActiveCfg = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|x64.Build.0 = Release|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|x64.Build.0 = Release|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|x64.ActiveCfg = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|x64.Build.0 = Debug|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|x64.Build.0 = Debug|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.ActiveCfg = Release|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.Build.0 = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|x64.ActiveCfg = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|x64.Build.0 = Release|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|x64.Build.0 = Release|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|x64.ActiveCfg = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|x64.Build.0 = Debug|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|x64.Build.0 = Debug|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|Any CPU.ActiveCfg = Release|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|Any CPU.Build.0 = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|x64.ActiveCfg = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|x64.Build.0 = Release|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|x64.Build.0 = Release|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug|x64.ActiveCfg = Debug|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug|x64.Build.0 = Debug|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Debug-Windows|x64.Build.0 = Debug|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release|Any CPU.ActiveCfg = Release|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release|Any CPU.Build.0 = Release|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release|x64.ActiveCfg = Release|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release|x64.Build.0 = Release|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {C395D6D2-DF99-4FD9-B5C5-04E8BB866509}.Release-Windows|x64.Build.0 = Release|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug|x64.ActiveCfg = Debug|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug|x64.Build.0 = Debug|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release|Any CPU.Build.0 = Release|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release|x64.ActiveCfg = Release|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release|x64.Build.0 = Release|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D7FFAB17-C7BE-490F-A974-584B5E37CF6D}.Release-Windows|x64.Build.0 = Release|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug|x64.ActiveCfg = Debug|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug|x64.Build.0 = Debug|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Debug-Windows|x64.Build.0 = Debug|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Release|Any CPU.ActiveCfg = Release|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Release|Any CPU.Build.0 = Release|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Release|x64.ActiveCfg = Release|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Release|x64.Build.0 = Release|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {0BF5E92D-D034-4D80-8921-07627F55F412}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {0BF5E92D-D034-4D80-8921-07627F55F412}.Release-Windows|x64.Build.0 = Release|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug|x64.ActiveCfg = Debug|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug|x64.Build.0 = Debug|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Debug-Windows|x64.Build.0 = Debug|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release|Any CPU.Build.0 = Release|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release|x64.ActiveCfg = Release|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release|x64.Build.0 = Release|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {D611AC03-9859-4EB6-BAB9-C26F493DFDB3}.Release-Windows|x64.Build.0 = Release|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug|x64.ActiveCfg = Debug|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug|x64.Build.0 = Debug|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Debug-Windows|x64.Build.0 = Debug|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release|Any CPU.Build.0 = Release|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release|x64.ActiveCfg = Release|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release|x64.Build.0 = Release|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {2DB4E5B0-3209-425E-A912-005A330CC66A}.Release-Windows|x64.Build.0 = Release|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug|x64.ActiveCfg = Debug|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug|x64.Build.0 = Debug|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Debug-Windows|x64.Build.0 = Debug|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release|Any CPU.ActiveCfg = Release|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release|Any CPU.Build.0 = Release|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release|x64.ActiveCfg = Release|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release|x64.Build.0 = Release|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {80FA0E50-8F81-4C60-B265-1039391C1CEE}.Release-Windows|x64.Build.0 = Release|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug|x64.ActiveCfg = Debug|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug|x64.Build.0 = Debug|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Debug-Windows|x64.Build.0 = Debug|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release|Any CPU.Build.0 = Release|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release|x64.ActiveCfg = Release|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release|x64.Build.0 = Release|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {9EBA6EDB-7D67-4BC5-9F94-E0162A538CC7}.Release-Windows|x64.Build.0 = Release|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug|x64.Build.0 = Debug|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Debug-Windows|x64.Build.0 = Debug|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release|Any CPU.Build.0 = Release|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release|x64.ActiveCfg = Release|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release|x64.Build.0 = Release|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {FB7ADCDF-C0A5-49EA-8ADC-CC77B6FB9D71}.Release-Windows|x64.Build.0 = Release|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug|x64.Build.0 = Debug|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Debug-Windows|x64.Build.0 = Debug|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release|Any CPU.Build.0 = Release|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release|x64.ActiveCfg = Release|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release|x64.Build.0 = Release|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {2E5AD07C-4F6E-4B6B-BEFE-9FBE9F789161}.Release-Windows|x64.Build.0 = Release|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug|x64.ActiveCfg = Debug|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug|x64.Build.0 = Debug|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Debug-Windows|x64.Build.0 = Debug|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Release|Any CPU.ActiveCfg = Release|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Release|Any CPU.Build.0 = Release|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Release|x64.ActiveCfg = Release|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Release|x64.Build.0 = Release|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {B49A3201-5BEE-426C-A082-D92D52172E06}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {B49A3201-5BEE-426C-A082-D92D52172E06}.Release-Windows|x64.Build.0 = Release|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug|x64.ActiveCfg = Debug|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug|x64.Build.0 = Debug|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Debug-Windows|x64.Build.0 = Debug|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release|Any CPU.Build.0 = Release|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release|x64.ActiveCfg = Release|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release|x64.Build.0 = Release|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {17CAA9AD-F85F-4EF2-A897-48F4185C1BC3}.Release-Windows|x64.Build.0 = Release|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug|x64.Build.0 = Debug|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Debug-Windows|x64.Build.0 = Debug|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release|Any CPU.Build.0 = Release|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release|x64.ActiveCfg = Release|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release|x64.Build.0 = Release|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {56294451-3BC7-4D78-B3E8-1D55A430B8E0}.Release-Windows|x64.Build.0 = Release|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug|x64.Build.0 = Debug|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug-Windows|x64.ActiveCfg = Debug|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Debug-Windows|x64.Build.0 = Debug|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release|Any CPU.Build.0 = Release|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release|x64.ActiveCfg = Release|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release|x64.Build.0 = Release|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release-Windows|x64.ActiveCfg = Release|Any CPU + {7E423183-8E0C-4BF5-9BFB-064C333B0BB1}.Release-Windows|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1014,7 +1730,7 @@ Global {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} {E0223463-97C6-4108-B5A9-AFBA16B9D5CC} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} {EE76BD65-FB01-498F-B053-4E1B2693D85F} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} - {873BCC1F-ED12-424E-93FA-D76F4BA022C2} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} + {873BCC1F-ED12-424E-93FA-D76F4BA022C2} = {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} {2614D290-1345-4A41-BE90-F85F817CEADE} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} {F3669415-319E-4C4C-A398-89321589B3A9} = {6230B915-B238-4E57-AAC4-06B4498F540F} {9878B523-BD1E-4285-A875-3CAB4127F7E6} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationBotFrameworkAuthentication.cs b/libraries/Microsoft.Bot.Connector/Authentication/ConfigurationBotFrameworkAuthentication.cs similarity index 97% rename from libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationBotFrameworkAuthentication.cs rename to libraries/Microsoft.Bot.Connector/Authentication/ConfigurationBotFrameworkAuthentication.cs index 92d8fc1802..29cb6163d3 100644 --- a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationBotFrameworkAuthentication.cs +++ b/libraries/Microsoft.Bot.Connector/Authentication/ConfigurationBotFrameworkAuthentication.cs @@ -6,12 +6,11 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; using Microsoft.Bot.Schema; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -namespace Microsoft.Bot.Builder.Integration.AspNet.Core +namespace Microsoft.Bot.Connector.Authentication { /// /// Creates a instance from configuration. diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationServiceClientCredentialFactory.cs b/libraries/Microsoft.Bot.Connector/Authentication/ConfigurationServiceClientCredentialFactory.cs similarity index 94% rename from libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationServiceClientCredentialFactory.cs rename to libraries/Microsoft.Bot.Connector/Authentication/ConfigurationServiceClientCredentialFactory.cs index cfb4e1bed8..a0a9d3fbad 100644 --- a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/ConfigurationServiceClientCredentialFactory.cs +++ b/libraries/Microsoft.Bot.Connector/Authentication/ConfigurationServiceClientCredentialFactory.cs @@ -5,12 +5,11 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Rest; -namespace Microsoft.Bot.Builder.Integration.AspNet.Core +namespace Microsoft.Bot.Connector.Authentication { internal enum MicrosoftAppType { @@ -31,7 +30,7 @@ internal enum MicrosoftAppType } /// - /// Credential provider which uses to lookup app credentials. + /// Credential provider which uses to lookup app credentials. /// public class ConfigurationServiceClientCredentialFactory : ServiceClientCredentialsFactory { @@ -95,7 +94,7 @@ public ConfigurationServiceClientCredentialFactory(IConfiguration configuration, break; default: // MultiTenant - _inner = new PasswordServiceClientCredentialFactory(appId, password, tenantId: string.Empty, httpClient, logger); + _inner = new PasswordServiceClientCredentialFactory(appId, password, tenantId: string.Empty, httpClient, logger); break; } } diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/Microsoft.Bot.Builder.Integration.AspNet.Core.csproj b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/Microsoft.Bot.Builder.Integration.AspNet.Core.csproj index 58c39f2ae2..7583466482 100644 --- a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/Microsoft.Bot.Builder.Integration.AspNet.Core.csproj +++ b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/Microsoft.Bot.Builder.Integration.AspNet.Core.csproj @@ -59,6 +59,7 @@ + diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/TypeForwarders.cs b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/TypeForwarders.cs new file mode 100644 index 0000000000..2430b544e8 --- /dev/null +++ b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.Core/TypeForwarders.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Runtime.CompilerServices; +using Microsoft.Bot.Connector.Authentication; + +// These classes were moved from Microsoft.Bot.Builder.Integration.AspNet.Core to +// Microsoft.Bot.Connector. To avoid breaking changes in any bot that could be referencing +// the classes, we are adding these TypeForwardedTo attributes. + +[assembly: TypeForwardedTo(typeof(ConfigurationBotFrameworkAuthentication))] +[assembly: TypeForwardedTo(typeof(ConfigurationServiceClientCredentialFactory))] diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/CloudAdapter.cs b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/CloudAdapter.cs new file mode 100644 index 0000000000..e4ae5390e2 --- /dev/null +++ b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/CloudAdapter.cs @@ -0,0 +1,403 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.WebSockets; +using System.Security.Claims; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using System.Web.WebSockets; +using Microsoft.Bot.Builder.Streaming; +using Microsoft.Bot.Connector; +using Microsoft.Bot.Connector.Authentication; +using Microsoft.Bot.Connector.Streaming.Application; +using Microsoft.Bot.Schema; +using Microsoft.Bot.Streaming; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Bot.Builder.Integration.AspNet.WebApi +{ + /// + /// An adapter that implements the Bot Framework Protocol and can be hosted in different cloud environmens both public and private. + /// + public class CloudAdapter : CloudAdapterBase, IBotFrameworkHttpAdapter + { + private const string AuthHeaderName = "authorization"; + private const string ChannelIdHeaderName = "channelid"; + private readonly ConcurrentDictionary _streamingConnections = new ConcurrentDictionary(); + + /// + /// Initializes a new instance of the class. (Public cloud. No auth. For testing.) + /// + public CloudAdapter() + : this(BotFrameworkAuthenticationFactory.Create()) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The this adapter should use. + /// The implementation this adapter should use. + public CloudAdapter( + BotFrameworkAuthentication botFrameworkAuthentication, + ILogger logger = null) + : base(botFrameworkAuthentication, logger) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The instance. + /// The this adapter should use. + /// The implementation this adapter should use. + public CloudAdapter( + IConfiguration configuration, + IHttpClientFactory httpClientFactory = null, + ILogger logger = null) + : this(new ConfigurationBotFrameworkAuthentication(configuration, httpClientFactory: httpClientFactory, logger: logger), logger) + { + } + + /// + public async Task ProcessAsync(HttpRequestMessage httpRequest, HttpResponseMessage httpResponse, IBot bot, CancellationToken cancellationToken = default) + { + _ = httpRequest ?? throw new ArgumentNullException(nameof(httpRequest)); + _ = httpResponse ?? throw new ArgumentNullException(nameof(httpResponse)); + _ = bot ?? throw new ArgumentNullException(nameof(bot)); + + try + { + HttpContextWrapper httpContext = null; + httpRequest.Properties.TryGetValue("MS_HttpContext", out var value); + if (value != null) + { + httpContext = value as HttpContextWrapper; + } + else if (HttpContext.Current != null) + { + httpContext = new HttpContextWrapper(HttpContext.Current); + } + + // Only GET requests for web socket connects are allowed + if (httpRequest.Method == HttpMethod.Get && httpContext?.IsWebSocketRequest == true) + { + httpContext.AcceptWebSocketRequest(async context => + { + // All socket communication will be handled by the internal streaming-specific BotAdapter + await ConnectAsync(context, httpRequest, bot, cancellationToken).ConfigureAwait(false); + }); + httpResponse.StatusCode = HttpStatusCode.SwitchingProtocols; + } + else if (httpRequest.Method == HttpMethod.Post) + { + // deserialize the incoming Activity + var activity = await HttpHelper.ReadRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); + + if (string.IsNullOrEmpty(activity?.Type)) + { + httpResponse.StatusCode = HttpStatusCode.BadRequest; + Logger.LogWarning("BadRequest: Missing activity or activity type."); + return; + } + + // grab the auth header from the inbound http request + var authHeader = httpRequest.Headers.Authorization?.ToString(); + + // process the inbound activity with the bot + var invokeResponse = await ProcessActivityAsync(authHeader, activity, bot.OnTurnAsync, cancellationToken).ConfigureAwait(false); + + // write the response, potentially serializing the InvokeResponse + HttpHelper.WriteResponse(httpRequest, httpResponse, invokeResponse); + } + else + { + httpResponse.StatusCode = HttpStatusCode.MethodNotAllowed; + } + } + catch (UnauthorizedAccessException ex) + { + // handle unauthorized here as this layer creates the http response + httpResponse.StatusCode = HttpStatusCode.Unauthorized; + + Logger.LogError(ex.ToString()); + } + } + + /// + /// Used to connect the adapter to a named pipe. + /// + /// The name of the named pipe. + /// The bot instance to use. + /// The bot's application id. + /// The audience to use for outbound communication. This will vary by cloud environment. + /// The callerId, this may be NULL. + /// A that represents the work queued to execute. + public async Task ConnectNamedPipeAsync(string pipeName, IBot bot, string appId, string audience, string callerId) + { + if (string.IsNullOrEmpty(pipeName)) + { + throw new ArgumentNullException(nameof(pipeName)); + } + + _ = bot ?? throw new ArgumentNullException(nameof(bot)); + + if (string.IsNullOrEmpty(audience)) + { + throw new ArgumentNullException(nameof(audience)); + } + + // The named pipe is local and so there is no network authentication to perform: so we can create the result here. + var authenticationRequestResult = new AuthenticateRequestResult + { + Audience = audience, + ClaimsIdentity = appId != null ? CreateClaimsIdentity(appId) : new ClaimsIdentity(), + CallerId = callerId + }; + + // Tie the authentication results, the named pipe, the adapter and the bot together to be ready to handle any inbound activities + var connectionId = Guid.NewGuid(); + using (var scope = Logger.BeginScope(connectionId)) + { + while (true) + { +#pragma warning disable CA2000 // Dispose objects before losing scope: StreamingRequestHandler is responsible for disposing StreamingConnection + var connection = new NamedPipeStreamingConnection(pipeName, Logger); +#pragma warning restore CA2000 // Dispose objects before losing scope + + using (var streamingActivityProcessor = new StreamingActivityProcessor(authenticationRequestResult, connection, this, bot)) + { + // Start receiving activities on the named pipe + _streamingConnections.TryAdd(connectionId, streamingActivityProcessor); + Log.NamedPipeConnectionStarted(Logger); + await streamingActivityProcessor.ListenAsync(CancellationToken.None).ConfigureAwait(false); + _streamingConnections.TryRemove(connectionId, out _); + Log.NamedPipeConnectionCompleted(Logger); + Logger.LogWarning("Named pipe got disconnected. Reconnecting."); + } + } + } + } + + /// + protected override ConnectorFactory GetStreamingConnectorFactory(Activity activity) + { + foreach (var connection in _streamingConnections.Values) + { + if (connection.HandlesActivity(activity)) + { + return connection.GetConnectorFactory(); + } + } + + throw new ApplicationException($"No streaming connection found for activity: {activity}"); + } + + /// + /// Creates a that uses web sockets. + /// + /// instance on which streams are transported between client and server. + /// Logger implementation for tracing and debugging information. + /// that uses web socket. + protected virtual StreamingConnection CreateWebSocketConnection(WebSocket socket, ILogger logger) + { + if (socket == null) + { + throw new ArgumentNullException(nameof(socket)); + } + + return new WebSocketStreamingConnection(socket, logger); + } + + private async Task ConnectAsync(AspNetWebSocketContext context, HttpRequestMessage httpRequest, IBot bot, CancellationToken cancellationToken) + { + Logger.LogInformation($"Received request for web socket connect."); + + // Grab the auth header from the inbound http request + var authHeader = httpRequest.Headers.GetValues(AuthHeaderName.ToLowerInvariant()).FirstOrDefault(); + + // Grab the channelId which should be in the http headers + var channelIdHeader = httpRequest.Headers.GetValues(ChannelIdHeaderName.ToLowerInvariant()).FirstOrDefault(); + + var authenticationRequestResult = await BotFrameworkAuthentication.AuthenticateStreamingRequestAsync(authHeader, channelIdHeader, cancellationToken).ConfigureAwait(false); + + var connectionId = Guid.NewGuid(); + using (var scope = Logger.BeginScope(connectionId)) + { + var connection = CreateWebSocketConnection(context.WebSocket, Logger); + + using (var streamingActivityProcessor = new StreamingActivityProcessor(authenticationRequestResult, connection, this, bot)) + { + // Start receiving activities on the socket + _streamingConnections.TryAdd(connectionId, streamingActivityProcessor); + Log.WebSocketConnectionStarted(Logger); + await streamingActivityProcessor.ListenAsync(cancellationToken).ConfigureAwait(false); + _streamingConnections.TryRemove(connectionId, out _); + Log.WebSocketConnectionCompleted(Logger); + } + } + } + + private class StreamingActivityProcessor : IStreamingActivityProcessor, IDisposable + { + private readonly AuthenticateRequestResult _authenticateRequestResult; + private readonly CloudAdapter _adapter; + private readonly StreamingRequestHandler _requestHandler; + + public StreamingActivityProcessor(AuthenticateRequestResult authenticateRequestResult, StreamingConnection connection, CloudAdapter adapter, IBot bot) + { + _authenticateRequestResult = authenticateRequestResult; + _adapter = adapter; + + // Internal reuse of the existing StreamingRequestHandler class + _requestHandler = new StreamingRequestHandler(bot, this, connection, authenticateRequestResult.Audience, logger: adapter.Logger); + + // Fix up the connector factory so connector create from it will send over this connection + _authenticateRequestResult.ConnectorFactory = new StreamingConnectorFactory(_requestHandler); + } + + public StreamingActivityProcessor(AuthenticateRequestResult authenticateRequestResult, string pipeName, CloudAdapter adapter, IBot bot) + { + _authenticateRequestResult = authenticateRequestResult; + _adapter = adapter; + + // Internal reuse of the existing StreamingRequestHandler class + _requestHandler = new StreamingRequestHandler(bot, this, pipeName, _authenticateRequestResult.Audience, adapter.Logger); + + // Fix up the connector factory so connector create from it will send over this connection + _authenticateRequestResult.ConnectorFactory = new StreamingConnectorFactory(_requestHandler); + } + + public bool HandlesActivity(Activity activity) + { + if (string.IsNullOrWhiteSpace(_requestHandler.ServiceUrl)) + { + return false; + } + + if (string.IsNullOrWhiteSpace(activity.ServiceUrl)) + { + return false; + } + + return _requestHandler.ServiceUrl.Equals(activity.ServiceUrl, StringComparison.OrdinalIgnoreCase) && + _requestHandler.HasConversation(activity.Conversation.Id); + } + + public ConnectorFactory GetConnectorFactory() + { + return _authenticateRequestResult.ConnectorFactory; + } + + public void Dispose() + { + _requestHandler?.Dispose(); + } + + public Task ListenAsync(CancellationToken cancellationToken) => _requestHandler.ListenAsync(cancellationToken); + + Task IStreamingActivityProcessor.ProcessStreamingActivityAsync(Activity activity, BotCallbackHandler callback, CancellationToken cancellationToken) + => _adapter.ProcessActivityAsync(_authenticateRequestResult, activity, callback, cancellationToken); + + private class StreamingConnectorFactory : ConnectorFactory + { + private readonly StreamingRequestHandler _requestHandler; + private string _serviceUrl = null; + + public StreamingConnectorFactory(StreamingRequestHandler requestHandler) + { + _requestHandler = requestHandler; + } + + public override Task CreateAsync(string serviceUrl, string audience, CancellationToken cancellationToken) + { + if (_serviceUrl == null) + { + _serviceUrl = serviceUrl; + } + else if (!_serviceUrl.Equals(serviceUrl, StringComparison.OrdinalIgnoreCase)) + { + throw new NotSupportedException("This is a streaming scenario, all connectors from this factory must all be for the same url."); + } + +#pragma warning disable CA2000 // Dispose objects before losing scope + var streamingHttpClient = new StreamingHttpClient(_requestHandler); +#pragma warning restore CA2000 // Dispose objects before losing scope + + return Task.FromResult(new ConnectorClient(MicrosoftAppCredentials.Empty, streamingHttpClient, false)); + } + + private class StreamingHttpClient : HttpClient + { + private readonly StreamingRequestHandler _requestHandler; + + public StreamingHttpClient(StreamingRequestHandler requestHandler) + { + _requestHandler = requestHandler ?? throw new ArgumentNullException(nameof(requestHandler)); + } + + public override async Task SendAsync(HttpRequestMessage httpRequestMessage, CancellationToken cancellationToken) + { + var streamingRequest = await CreateSteamingRequestAsync(httpRequestMessage).ConfigureAwait(false); + var receiveResponse = await _requestHandler.SendStreamingRequestAsync(streamingRequest, cancellationToken).ConfigureAwait(false); + var httpResponseMessage = await CreateHttpResponseAsync(receiveResponse).ConfigureAwait(false); + return httpResponseMessage; + } + + private async Task CreateSteamingRequestAsync(HttpRequestMessage httpRequestMessage) + { + var streamingRequest = new StreamingRequest + { + Path = httpRequestMessage.RequestUri.OriginalString.Substring(httpRequestMessage.RequestUri.OriginalString.IndexOf("/v3", StringComparison.Ordinal)), + Verb = httpRequestMessage.Method.ToString(), + }; + + if (httpRequestMessage.Content != null) + { + streamingRequest.SetBody(await httpRequestMessage.Content.ReadAsStringAsync().ConfigureAwait(false)); + } + + return streamingRequest; + } + + private async Task CreateHttpResponseAsync(ReceiveResponse receiveResponse) + { + var httpResponseMessage = new HttpResponseMessage((HttpStatusCode)receiveResponse.StatusCode); + httpResponseMessage.Content = new StringContent(await receiveResponse.ReadBodyAsStringAsync().ConfigureAwait(false)); + return httpResponseMessage; + } + } + } + } + + private class Log + { + private static readonly Action _namedPipeConnectionStarted = + LoggerMessage.Define(LogLevel.Information, new EventId(1, nameof(NamedPipeConnectionStarted)), "NamedPipe connection started."); + + private static readonly Action _namedConnectionCompleted = + LoggerMessage.Define(LogLevel.Information, new EventId(2, nameof(NamedPipeConnectionCompleted)), "NamedPipe connection completed."); + + private static readonly Action _webSocketConnectionStarted = + LoggerMessage.Define(LogLevel.Information, new EventId(1, nameof(WebSocketConnectionStarted)), "WebSocket connection started."); + + private static readonly Action _webSocketConnectionCompleted = + LoggerMessage.Define(LogLevel.Information, new EventId(2, nameof(WebSocketConnectionCompleted)), "WebSocket connection completed."); + + public static void NamedPipeConnectionStarted(ILogger logger) => _namedPipeConnectionStarted(logger, null); + + public static void NamedPipeConnectionCompleted(ILogger logger) => _namedConnectionCompleted(logger, null); + + public static void WebSocketConnectionStarted(ILogger logger) => _webSocketConnectionStarted(logger, null); + + public static void WebSocketConnectionCompleted(ILogger logger) => _webSocketConnectionCompleted(logger, null); + } + } +} diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationChannelProvider.cs b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationChannelProvider.cs index 253e418a7c..dbee683e3b 100644 --- a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationChannelProvider.cs +++ b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationChannelProvider.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.Configuration; using Microsoft.Bot.Connector.Authentication; @@ -14,6 +15,7 @@ namespace Microsoft.Bot.Builder.BotFramework /// /// NOTE: if the keys are not present, a null value will be used. /// + [Obsolete("Use `ConfigurationBotFrameworkAuthentication` instead to configure channel.", false)] public sealed class ConfigurationChannelProvider : SimpleChannelProvider { /// diff --git a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationCredentialProvider.cs b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationCredentialProvider.cs index f0d4221380..ec2f37ae99 100644 --- a/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationCredentialProvider.cs +++ b/libraries/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi/ConfigurationCredentialProvider.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.Configuration; using Microsoft.Bot.Connector.Authentication; @@ -15,6 +16,7 @@ namespace Microsoft.Bot.Builder.BotFramework /// /// NOTE: if the keys are not present, a null value will be used. /// + [Obsolete("Use `ConfigurationBotFrameworkAuthentication` instead to configure credentials.", false)] public sealed class ConfigurationCredentialProvider : SimpleCredentialProvider { /// diff --git a/tests/Microsoft.Bot.Connector.Streaming.Tests.Client/Program.cs b/tests/Microsoft.Bot.Connector.Streaming.Tests.Client/Program.cs index e8b0a3f8c0..2e90444a70 100644 --- a/tests/Microsoft.Bot.Connector.Streaming.Tests.Client/Program.cs +++ b/tests/Microsoft.Bot.Connector.Streaming.Tests.Client/Program.cs @@ -109,7 +109,7 @@ private static async Task ConnectAsync(bool automaticallyReconnect = false, bool } else { - var url = AskUser("Bot url:"); + var url = AskUser("Bot url (e.g ws://localhost:3978/api/messages):"); var appId = AskUser("Bot app id:"); var appPassword = AskUser("Bot app password:"); diff --git a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.Core.Tests/ConfigurationServiceClientCredentialFactoryTests.cs b/tests/Microsoft.Bot.Connector.Tests/Authentication/ConfigurationServiceClientCredentialFactoryTests.cs similarity index 99% rename from tests/integration/Microsoft.Bot.Builder.Integration.AspNet.Core.Tests/ConfigurationServiceClientCredentialFactoryTests.cs rename to tests/Microsoft.Bot.Connector.Tests/Authentication/ConfigurationServiceClientCredentialFactoryTests.cs index 2b440ff80e..1705c2a8b2 100644 --- a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.Core.Tests/ConfigurationServiceClientCredentialFactoryTests.cs +++ b/tests/Microsoft.Bot.Connector.Tests/Authentication/ConfigurationServiceClientCredentialFactoryTests.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Configuration.Memory; using Xunit; -namespace Microsoft.Bot.Builder.Integration.AspNet.Core.Tests +namespace Microsoft.Bot.Connector.Tests.Authentication { public class ConfigurationServiceClientCredentialFactoryTests { diff --git a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/CloudAdapterTests.cs b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/CloudAdapterTests.cs new file mode 100644 index 0000000000..858f86231e --- /dev/null +++ b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/CloudAdapterTests.cs @@ -0,0 +1,953 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Net.WebSockets; +using System.Reflection; +using System.Security.Claims; +using System.Security.Principal; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using System.Web.WebSockets; +using Microsoft.Bot.Connector; +using Microsoft.Bot.Connector.Authentication; +using Microsoft.Bot.Connector.Streaming.Application; +using Microsoft.Bot.Schema; +using Microsoft.Bot.Streaming; +using Microsoft.Bot.Streaming.Payloads; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.Rest; +using Moq; +using Moq.Protected; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Xunit; + +namespace Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests +{ + public class CloudAdapterTests + { + [Fact] + public async Task BasicMessageActivity() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var botMock = new Mock(); + botMock.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); + + // Act + var adapter = new CloudAdapter(); + await adapter.ProcessAsync(httpRequest, httpResponse, botMock.Object); + + // Assert + botMock.Verify(m => m.OnTurnAsync(It.Is(tc => true), It.Is(ct => true)), Times.Once()); + } + + [Fact] + public async Task InvokeActivity() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateInvokeActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var bot = new InvokeResponseBot(); + + // Act + var adapter = new CloudAdapter(); + await adapter.ProcessAsync(httpRequest, httpResponse, bot); + + // Assert + var response = await httpResponse.Content.ReadAsStringAsync(); + var json = JObject.Parse(response); + Assert.Equal("im.feeling.really.attacked.right.now", json["quite.honestly"]); + } + + [Fact] + public async Task MethodNotAllowed() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Delete, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var botMock = new Mock(); + botMock.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); + + // Act + var adapter = new CloudAdapter(); + await adapter.ProcessAsync(httpRequest, httpResponse, botMock.Object); + + // Assert + Assert.Equal(HttpStatusCode.MethodNotAllowed, httpResponse.StatusCode); + } + + [Fact] + public async Task MessageActivityWithHttpClient() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var mockHttpMessageHandler = new Mock(); + mockHttpMessageHandler.Protected() + .Setup>("SendAsync", ItExpr.IsAny(), ItExpr.IsAny()) + .Returns((HttpRequestMessage request, CancellationToken cancellationToken) => Task.FromResult(CreateInternalHttpResponse())); + + var httpClient = new HttpClient(mockHttpMessageHandler.Object); + + var httpClientFactoryMock = new Mock(); + httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpClient); + + var bot = new MessageBot(); + + // Act + var cloudEnvironment = BotFrameworkAuthenticationFactory.Create(null, false, null, null, null, null, null, null, null, new PasswordServiceClientCredentialFactory(), new AuthenticationConfiguration(), httpClientFactoryMock.Object, null); + var adapter = new CloudAdapter(cloudEnvironment); + await adapter.ProcessAsync(httpRequest, httpResponse, bot); + + // Assert + mockHttpMessageHandler.Protected().Verify>("SendAsync", Times.Once(), ItExpr.IsAny(), ItExpr.IsAny()); + } + + [Fact] + public async Task BadRequest() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = new StringContent("this.is.not.json", Encoding.UTF8, "application/json") + }; + + var httpResponse = new HttpResponseMessage(); + + var botMock = new Mock(); + botMock.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); + + // Act + var adapter = new CloudAdapter(); + await adapter.ProcessAsync(httpRequest, httpResponse, botMock.Object); + + // Assert + botMock.Verify(m => m.OnTurnAsync(It.Is(tc => true), It.Is(ct => true)), Times.Never()); + Assert.Equal(HttpStatusCode.BadRequest, httpResponse.StatusCode); + } + + [Fact] + public async Task WebSocketRequestShouldCallAuthenticateStreamingRequestAsync() + { + // Note this test only checks that a GET request will result in an auth call and a socket accept + // it doesn't valid that activities over that socket get to the bot or back + + // Arrange + var wsMocks = CreateWebSocketMocks(); + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + // Act + var bot = new MessageBot(); + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.ProcessAsync(wsMocks.httpRequestMock.Object, wsMocks.httpResponseMock.Object, bot); + + // Assert + wsMocks.httpContextWrapperMock.Verify(m => m.AcceptWebSocketRequest(It.IsAny>()), Times.Once()); + authMocks.botFrameworkAuthenticationMock.Verify(x => x.AuthenticateStreamingRequestAsync(It.Is(v => true), It.Is(v => true), It.Is(ct => true)), Times.Once()); + Assert.Equal(HttpStatusCode.SwitchingProtocols, wsMocks.httpResponseMock.Object.StatusCode); + } + + [Fact] + public async void CanContinueConversationOverWebSocket() + { + // Arrange + var continueConversationWaiter = new AutoResetEvent(false); + var verifiedValidContinuation = false; + + var nullUrlMocks = CreateWebSocketMocks(); + var validUrlMocks = CreateWebSocketMocks(); + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + var activity = new Activity + { + Id = Guid.NewGuid().ToString("N"), + Type = ActivityTypes.Message, + From = new ChannelAccount { Id = "testUser" }, + Conversation = new ConversationAccount { Id = Guid.NewGuid().ToString("N") }, + Recipient = new ChannelAccount { Id = "testBot" }, + ServiceUrl = null, + ChannelId = "channelId", + Text = "hi", + }; + var nullUrlContent = new StringContent(JsonConvert.SerializeObject(activity), Encoding.UTF8, "application/json"); + activity.ServiceUrl = "wss://localhost/api/messages"; + var validUrlContent = new StringContent(JsonConvert.SerializeObject(activity), Encoding.UTF8, "application/json"); + + var nullUrlConnection = CreateStreamingConnectionMock(await nullUrlContent.ReadAsStreamAsync()); + var validUrlConnection = CreateStreamingConnectionMock(await validUrlContent.ReadAsStreamAsync()); + var connections = new Dictionary + { + { nullUrlMocks.webSocketMock.Object, nullUrlConnection.Object }, + { validUrlMocks.webSocketMock.Object, validUrlConnection.Object } + }; + + var bot = new Mock(); + bot.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())) + .Returns(Task.Factory.StartNew(() => { continueConversationWaiter.WaitOne(); })); // Simulate listening on web socket + + // Act + var adapter = new StreamingTestCloudAdapter(authMocks.botFrameworkAuthenticationMock.Object, connections); + var nullUrlProcessRequest = adapter.ProcessAsync(nullUrlMocks.httpRequestMock.Object, nullUrlMocks.httpResponseMock.Object, bot.Object, CancellationToken.None); + var validUrlProcessRequest = adapter.ProcessAsync(validUrlMocks.httpRequestMock.Object, validUrlMocks.httpResponseMock.Object, bot.Object, CancellationToken.None); + + var validContinuation = adapter.ContinueConversationAsync( + authMocks.authenticateRequestResult.ClaimsIdentity, + activity, + (turn, cancellationToken) => + { + var connectorFactory = turn.TurnState.Get(); + Assert.NotNull(connectorFactory); + var connectorFactoryTypeName = connectorFactory.GetType().FullName ?? string.Empty; + Assert.EndsWith("StreamingConnectorFactory", connectorFactoryTypeName); + verifiedValidContinuation = true; + + return Task.CompletedTask; + }, + CancellationToken.None); + + continueConversationWaiter.Set(); + nullUrlProcessRequest.Wait(); + validUrlProcessRequest.Wait(); + + // Assert + Assert.True(validUrlProcessRequest.IsCompleted); + Assert.True(verifiedValidContinuation); + Assert.True(validContinuation.IsCompleted); + Assert.Null(validContinuation.Exception); + } + + [Fact] + public async void ContinueConversationWillThrowOnInvalidActivity() + { + // Arrange + var continueConversationWaiter = new AutoResetEvent(false); + + var wsMocks = CreateWebSocketMocks(); + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + var activity = new Activity + { + Id = Guid.NewGuid().ToString("N"), + Type = ActivityTypes.Message, + From = new ChannelAccount { Id = "testUser" }, + Recipient = new ChannelAccount { Id = "testBot" }, + ServiceUrl = "wss://InvalidServiceUrl/api/messages", + ChannelId = "channelId", + Text = "hi", + }; + var content = new StringContent(JsonConvert.SerializeObject(activity), Encoding.UTF8, "application/json"); + + var connection = CreateStreamingConnectionMock(await content.ReadAsStreamAsync()); + var connections = new Dictionary + { + { wsMocks.webSocketMock.Object, connection.Object }, + }; + + var bot = new Mock(); + bot.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())) + .Returns(Task.Factory.StartNew(() => { continueConversationWaiter.WaitOne(); })); // Simulate listening on web socket + + // Act + var adapter = new StreamingTestCloudAdapter(authMocks.botFrameworkAuthenticationMock.Object, connections); + var processRequest = adapter.ProcessAsync(wsMocks.httpRequestMock.Object, wsMocks.httpResponseMock.Object, bot.Object, CancellationToken.None); + + // Assert + Assert.True(processRequest.IsCompleted); + + await Assert.ThrowsAsync(() => + adapter.ContinueConversationAsync( + authMocks.authenticateRequestResult.ClaimsIdentity, activity, (turn, cancellationToken) => Task.CompletedTask, CancellationToken.None)); + + continueConversationWaiter.Set(); + processRequest.Wait(); + } + + [Fact] + public void ConstructorWithConfiguration() + { + // Arrange + var appSettings = new Dictionary + { + { "MicrosoftAppId", "appId" }, + { "MicrosoftAppPassword", "appPassword" }, + { "ChannelService", GovernmentAuthenticationConstants.ChannelService } + }; + + var configuration = new ConfigurationBuilder() + .AddInMemoryCollection(appSettings) + .Build(); + + // Act + _ = new CloudAdapter(configuration); + } + + [Fact] + public async Task InjectCloudEnvironment() + { + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var botMock = new Mock(); + botMock.Setup(b => b.OnTurnAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); + + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + // Act + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.ProcessAsync(httpRequest, httpResponse, botMock.Object); + + // Assert + botMock.Verify(m => m.OnTurnAsync(It.Is(tc => true), It.Is(ct => true)), Times.Once()); + authMocks.botFrameworkAuthenticationMock.Verify(ce => ce.AuthenticateRequestAsync(It.Is(tc => true), It.Is(tc => true), It.Is(ct => true)), Times.Once()); + } + + [Fact] + public async Task CloudAdapterProvidesUserTokenClient() + { + // this is just a basic test to verify the wire-up of a UserTokenClient in the CloudAdapter + // there is also some coverage for the internal code that creates the TokenExchangeState string + + // Arrange + var appId = "appId"; + var userId = "userId"; + var channelId = "channelId"; + var conversationId = "conversationId"; + var recipientId = "botId"; + var relatesToActivityId = "relatesToActivityId"; + var connectionName = "connectionName"; + + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + var bot = new UserTokenClientBot(connectionName); + + // Act + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.ProcessAsync(httpRequest, httpResponse, bot); + + // Assert + var args_ExchangeTokenAsync = authMocks.userTokenClient.Record["ExchangeTokenAsync"]; + Assert.Equal(userId, (string)args_ExchangeTokenAsync[0]); + Assert.Equal(connectionName, (string)args_ExchangeTokenAsync[1]); + Assert.Equal(channelId, (string)args_ExchangeTokenAsync[2]); + Assert.Equal("TokenExchangeRequest", args_ExchangeTokenAsync[3].GetType().Name); + + var args_GetAadTokensAsync = authMocks.userTokenClient.Record["GetAadTokensAsync"]; + Assert.Equal(userId, (string)args_GetAadTokensAsync[0]); + Assert.Equal(connectionName, (string)args_GetAadTokensAsync[1]); + Assert.Equal("x", ((string[])args_GetAadTokensAsync[2])[0]); + Assert.Equal("y", ((string[])args_GetAadTokensAsync[2])[1]); + + Assert.Equal(channelId, (string)args_GetAadTokensAsync[3]); + + var args_GetSignInResourceAsync = authMocks.userTokenClient.Record["GetSignInResourceAsync"]; + + // this code is testing the internal CreateTokenExchangeState function by doing the work in reverse + var state = (string)args_GetSignInResourceAsync[0]; + var json = Encoding.UTF8.GetString(Convert.FromBase64String(state)); + var tokenExchangeState = JsonConvert.DeserializeObject(json); + Assert.Equal(connectionName, tokenExchangeState.ConnectionName); + Assert.Equal(appId, tokenExchangeState.MsAppId); + Assert.Equal(conversationId, tokenExchangeState.Conversation.Conversation.Id); + Assert.Equal(recipientId, tokenExchangeState.Conversation.Bot.Id); + Assert.Equal(relatesToActivityId, tokenExchangeState.RelatesTo.ActivityId); + + Assert.Equal("finalRedirect", (string)args_GetSignInResourceAsync[1]); + + var args_GetTokenStatusAsync = authMocks.userTokenClient.Record["GetTokenStatusAsync"]; + Assert.Equal(userId, (string)args_GetTokenStatusAsync[0]); + Assert.Equal(channelId, (string)args_GetTokenStatusAsync[1]); + Assert.Equal("includeFilter", (string)args_GetTokenStatusAsync[2]); + + var args_GetUserTokenAsync = authMocks.userTokenClient.Record["GetUserTokenAsync"]; + Assert.Equal(userId, (string)args_GetUserTokenAsync[0]); + Assert.Equal(connectionName, (string)args_GetUserTokenAsync[1]); + Assert.Equal(channelId, (string)args_GetUserTokenAsync[2]); + Assert.Equal("magicCode", (string)args_GetUserTokenAsync[3]); + + var args_SignOutUserAsync = authMocks.userTokenClient.Record["SignOutUserAsync"]; + Assert.Equal(userId, (string)args_SignOutUserAsync[0]); + Assert.Equal(connectionName, (string)args_SignOutUserAsync[1]); + Assert.Equal(channelId, (string)args_SignOutUserAsync[2]); + } + + [Fact] + public async Task CloudAdapterConnectorFactory() + { + // this is just a basic test to verify the wire-up of a ConnectorFactory in the CloudAdapter. + + // Arrange + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + + var httpResponse = new HttpResponseMessage(); + + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + var bot = new ConnectorFactoryBot(); + + // Act + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.ProcessAsync(httpRequest, httpResponse, bot); + + // Assert + Assert.Equal("audience", bot.Authorization.Parameter); + Assert.Equal(authMocks.authenticateRequestResult.ClaimsIdentity, bot.Identity); + Assert.Equal(authMocks.userTokenClient, bot.UserTokenClient); + Assert.True(bot.ConnectorClient != null); + Assert.True(bot.BotCallbackHandler != null); + } + + [Fact] + public async Task CloudAdapterContinueConversation() + { + // Arrange + var claimsIdentity = new ClaimsIdentity(); + + var authMocks = CreateBotFrameworkAuthenticationMocks(); + + var bot = new ConnectorFactoryBot(); + + var expectedServiceUrl = "http://serviceUrl"; + + var conversationAccount = new ConversationAccount { Id = "conversation Id" }; + var continuationActivity = new Activity { Type = ActivityTypes.Event, ServiceUrl = expectedServiceUrl, Conversation = conversationAccount }; + var conversationReference = new ConversationReference { ServiceUrl = expectedServiceUrl, Conversation = conversationAccount }; + + var actualServiceUrl1 = string.Empty; + var actualServiceUrl2 = string.Empty; + var actualServiceUrl3 = string.Empty; + var actualServiceUrl4 = string.Empty; + var actualServiceUrl5 = string.Empty; + var actualServiceUrl6 = string.Empty; + + BotCallbackHandler callback1 = (t, c) => + { + actualServiceUrl1 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + BotCallbackHandler callback2 = (t, c) => + { + actualServiceUrl2 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + BotCallbackHandler callback3 = (t, c) => + { + actualServiceUrl3 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + BotCallbackHandler callback4 = (t, c) => + { + actualServiceUrl4 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + BotCallbackHandler callback5 = (t, c) => + { + actualServiceUrl5 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + BotCallbackHandler callback6 = (t, c) => + { + actualServiceUrl6 = t.Activity.ServiceUrl; + return Task.CompletedTask; + }; + + // Act + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.ContinueConversationAsync("botAppId", continuationActivity, callback1, CancellationToken.None); + await adapter.ContinueConversationAsync(claimsIdentity, continuationActivity, callback2, CancellationToken.None); + await adapter.ContinueConversationAsync(claimsIdentity, continuationActivity, "audience", callback3, CancellationToken.None); + await adapter.ContinueConversationAsync("botAppId", conversationReference, callback4, CancellationToken.None); + await adapter.ContinueConversationAsync(claimsIdentity, conversationReference, callback5, CancellationToken.None); + await adapter.ContinueConversationAsync(claimsIdentity, conversationReference, "audience", callback6, CancellationToken.None); + + // Assert + Assert.Equal(expectedServiceUrl, actualServiceUrl1); + Assert.Equal(expectedServiceUrl, actualServiceUrl2); + Assert.Equal(expectedServiceUrl, actualServiceUrl3); + Assert.Equal(expectedServiceUrl, actualServiceUrl4); + Assert.Equal(expectedServiceUrl, actualServiceUrl5); + Assert.Equal(expectedServiceUrl, actualServiceUrl6); + } + + [Fact] + public async Task CloudAdapterDelay() + { + await DelayHelper.Test(new CloudAdapter()); + } + + [Fact] + public async Task CloudAdapterCreateConversation() + { + // Arrange + var conversationResourceResponse = new ConversationResourceResponse(); + var createResponse = new HttpOperationResponse { Body = conversationResourceResponse }; + + // note Moq doesn't support extension methods used in the implementation so we are actually mocking the underlying CreateConversationWithHttpMessagesAsync method + var conversationsMock = new Mock(); + conversationsMock.Setup(cm => cm.CreateConversationWithHttpMessagesAsync(It.IsAny(), It.IsAny>>(), It.IsAny())).Returns(Task.FromResult(createResponse)); + + var connectorMock = new Mock(); + connectorMock.SetupGet(m => m.Conversations).Returns(conversationsMock.Object); + + var expectedServiceUrl = "http://serviceUrl"; + var expectedAudience = "audience"; + + var connectorFactoryMock = new Mock(); + connectorFactoryMock + .Setup(cf => cf.CreateAsync(It.Is(serviceUrl => serviceUrl == expectedServiceUrl), It.Is(audience => audience == expectedAudience), It.IsAny())) + .ReturnsAsync(connectorMock.Object); + + var authMocks = CreateBotFrameworkAuthenticationMocks(connectorFactoryMock.Object); + + var expectedChannelId = "expected-channel-id"; + var actualChannelId = string.Empty; + + BotCallbackHandler callback1 = (t, c) => + { + actualChannelId = t.Activity.ChannelId; + + return Task.CompletedTask; + }; + + var conversationParameters = new ConversationParameters + { + IsGroup = false, + Bot = new ChannelAccount { }, + Members = new ChannelAccount[] { }, + TenantId = "tenantId", + }; + + // Act + var adapter = new CloudAdapter(authMocks.botFrameworkAuthenticationMock.Object); + await adapter.CreateConversationAsync("botAppId", expectedChannelId, expectedServiceUrl, expectedAudience, conversationParameters, callback1, CancellationToken.None); + + // Assert + Assert.Equal(expectedChannelId, actualChannelId); + } + + [Fact(Skip = "Expired token not working anymore, disabling it until fixed.")] + public async Task ExpiredTokenShouldThrowUnauthorizedAccessException() + { + // Arrange + + // Expired token with removed AppID + // This token will be validated against real endpoint https://login.microsoftonline.com/common/discovery/v2.0/keys + // So when the signing key is removed in endpoint, it will not be Expired exception, we need to generate a new token + // - create a new app registration: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/CreateApplicationBlade/quickStartType~/null/isMSAApp~/false + // - create an access token via powershell script (need to wait for one day so it is expired) + // $Form = @{ + // client_id = "YOUR_APP_ID" + // scope = "https://api.botframework.com/.default" + // client_secret = "YOUR_APP_SECRET" + // grant_type = "client_credentials" + // } + // (Invoke-WebRequest -Uri 'https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token' -Method Post -Form $Form).Content + // - delete the app + var token = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL2FwaS5ib3RmcmFtZXdvcmsuY29tIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZDZkNDk0MjAtZjM5Yi00ZGY3LWExZGMtZDU5YTkzNTg3MWRiLyIsImlhdCI6MTY5Mjg3MDMwMiwibmJmIjoxNjkyODcwMzAyLCJleHAiOjE2OTI5NTcwMDIsImFpbyI6IkUyRmdZUGhhdFZ6czVydGFFYTlWbDN2ZnIyQ2JBZ0E9IiwiYXBwaWQiOiIxNWYwMTZmZS00ODhjLTQwZTktOWNiZS00Yjk0OGY5OGUyMmMiLCJhcHBpZGFjciI6IjEiLCJpZHAiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9kNmQ0OTQyMC1mMzliLTRkZjctYTFkYy1kNTlhOTM1ODcxZGIvIiwicmgiOiIwLkFXNEFJSlRVMXB2ejkwMmgzTldhazFoeDIwSXpMWTBwejFsSmxYY09EcS05RnJ4dUFBQS4iLCJ0aWQiOiJkNmQ0OTQyMC1mMzliLTRkZjctYTFkYy1kNTlhOTM1ODcxZGIiLCJ1dGkiOiJkenVwa1dWd2FVT2x1RldkbnlvLUFBIiwidmVyIjoiMS4wIn0.sbQH997Q2GDKiiYd6l5MIz_XNfXypJd6zLY9xjtvEgXMBB0x0Vu3fv9W0nM57_ZipQiZDTZuSQA5BE30KBBwU-ZVqQ7MgiTkmE9eF6Ngie_5HwSr9xMK3EiDghHiOP9pIj3oEwGOSyjR5L9n-7tLSdUbKVyV14nS8OQtoPd1LZfoZI3e7tVu3vx8Lx3KzudanXX8Vz7RKaYndj3RyRi4wEN5hV9ab40d7fQsUzygFd5n_PXC2rs0OhjZJzjCOTC0VLQEn1KwiTkSH1E-OSzkrMltn1sbhD2tv_H-4rqQd51vAEJ7esC76qQjz_pfDRLs6T2jvJyhd5MZrN_MT0TqlA"; + + var httpRequest = new HttpRequestMessage + { + Method = HttpMethod.Post, + Content = CreateMessageActivityContent() + }; + httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + + var httpResponse = new HttpResponseMessage(); + + var loggerMock = new Mock>(); + + var bot = new InvokeResponseBot(); + + // Act + var adapter = new CloudAdapter(BotFrameworkAuthenticationFactory.Create(), loggerMock.Object); + await adapter.ProcessAsync(httpRequest, httpResponse, bot); + + // Assert + Assert.Equal(HttpStatusCode.Unauthorized, httpResponse.StatusCode); + + loggerMock.Verify( + x => x.Log( + LogLevel.Error, + It.IsAny(), + It.Is((o, t) => o.ToString().Contains("The token has expired")), + It.IsAny(), + (Func)It.IsAny()), + Times.Once); + } + + private static HttpContent CreateMessageActivityContent() + { + return CreateContent(new Activity + { + Type = ActivityTypes.Message, + Text = "hi", + ServiceUrl = "http://localhost", + ChannelId = "channelId", + Conversation = new ConversationAccount { Id = "conversationId" }, + From = new ChannelAccount { Id = "userId" }, + Locale = "locale", + Recipient = new ChannelAccount { Id = "botId" }, + RelatesTo = new ConversationReference { ActivityId = "relatesToActivityId" } + }); + } + + private static HttpContent CreateInvokeActivityContent() + { + return CreateContent(new Activity { Type = ActivityTypes.Invoke, ServiceUrl = "http://localhost" }); + } + + private static HttpResponseMessage CreateInternalHttpResponse() + { + var response = new HttpResponseMessage(HttpStatusCode.OK); + response.Content = new StringContent(new JObject { { "id", "SendActivityId" } }.ToString()); + return response; + } + + private static HttpContent CreateContent(Activity activity) + { + var json = JsonConvert.SerializeObject(activity, MessageSerializerSettings.Create()); + return new StringContent(json, Encoding.UTF8, "application/json"); + } + + private static Mock CreateStreamingConnectionMock(Stream content) + { + var streamingConnectionMock = new Mock(null); + streamingConnectionMock + .Setup(c => c.ListenAsync(It.IsAny(), It.IsAny())) + .Returns((handler, cancellationToken) => handler.ProcessRequestAsync( + new ReceiveRequest + { + Verb = "POST", + Path = "/api/messages", + Streams = new List + { + new TestContentStream + { + Id = Guid.NewGuid(), + ContentType = "application/json", + Length = (int?)content.Length, + Stream = content + } + } + }, + null, + cancellationToken: cancellationToken)); + + return streamingConnectionMock; + } + + private static (TestUserTokenClient userTokenClient, AuthenticateRequestResult authenticateRequestResult, Mock botFrameworkAuthenticationMock) CreateBotFrameworkAuthenticationMocks(ConnectorFactory connectorFactory = null) + { + var userTokenClient = new TestUserTokenClient("appId"); + var authenticateRequestResult = new AuthenticateRequestResult + { + Audience = "audience", + CallerId = "callerId", + ConnectorFactory = new TestConnectorFactory(), + ClaimsIdentity = new ClaimsIdentity(new List + { + new Claim("aud", "audience"), + new Claim("iss", $"https://login.microsoftonline.com/{"tenantId"}/"), + new Claim("azp", "appId"), + new Claim("tid", "tenantId"), + new Claim("ver", "2.0") + }) + }; + var botFrameworkAuthenticationMock = new Mock(); + botFrameworkAuthenticationMock + .Setup(ce => ce.AuthenticateRequestAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(authenticateRequestResult); + botFrameworkAuthenticationMock + .Setup(x => x.AuthenticateStreamingRequestAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(authenticateRequestResult); + botFrameworkAuthenticationMock + .Setup(a => a.CreateUserTokenClientAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(userTokenClient); + botFrameworkAuthenticationMock + .Setup(ce => ce.CreateConnectorFactory(It.IsAny())) + .Returns(connectorFactory ?? new TestConnectorFactory()); + + return (userTokenClient, authenticateRequestResult, botFrameworkAuthenticationMock); + } + + private static (Mock httpContextWrapperMock, Mock webSocketReceiveResultMock, Mock webSocketMock, Mock aspNetWebSocketContextMock, Mock httpRequestMock, Mock httpResponseMock) CreateWebSocketMocks() + { + var httpContext = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null)); + var httpContextWrapperMock = new Mock(httpContext); + httpContextWrapperMock.Setup(e => e.IsWebSocketRequest).Returns(true); + + var webSocketReceiveResultMock = new Mock(1, WebSocketMessageType.Close, true); + var webSocketMock = new Mock(); + webSocketMock.Setup(e => e.ReceiveAsync(It.IsAny>(), It.IsAny())).ReturnsAsync(webSocketReceiveResultMock.Object); + + var aspNetWebSocketContextMock = new Mock(); + aspNetWebSocketContextMock.Setup(e => e.WebSocket).Returns(webSocketMock.Object); + httpContextWrapperMock + .Setup(e => e.AcceptWebSocketRequest(It.IsAny>())) + .Callback>((cb) => cb(aspNetWebSocketContextMock.Object)); + + var httpRequestMock = new Mock(HttpMethod.Get, string.Empty); + httpRequestMock.SetupAllProperties(); + httpRequestMock.Object.Headers.Add("authorization", "Bearer token"); + httpRequestMock.Object.Headers.Add("channelid", "channel-id"); + httpRequestMock.Object.Properties.Add("MS_HttpContext", httpContextWrapperMock.Object); + httpRequestMock.Object.Content = CreateMessageActivityContent(); + + var httpResponseMock = new Mock().SetupAllProperties(); + + return (httpContextWrapperMock, webSocketReceiveResultMock, webSocketMock, aspNetWebSocketContextMock, httpRequestMock, httpResponseMock); + } + + private class InvokeResponseBot : IBot + { + public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) + { + await turnContext.SendActivityAsync(CreateInvokeResponseActivity()); + } + + private static Activity CreateInvokeResponseActivity() + { + return new Activity + { + Type = ActivityTypesEx.InvokeResponse, + Value = new InvokeResponse + { + Status = 200, + Body = new JObject { { "quite.honestly", "im.feeling.really.attacked.right.now" } }, + }, + }; + } + } + + private class MessageBot : IBot + { + public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) + { + await turnContext.SendActivityAsync(MessageFactory.Text("rage.rage.against.the.dying.of.the.light")); + } + } + + private class UserTokenClientBot : IBot + { + private string _connectionName; + + public UserTokenClientBot(string connectionName) + { + _connectionName = connectionName; + } + + public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) + { + // in the product the following calls ae made from witin the sign-in prompt begin and continue methods + + var userTokenClient = turnContext.TurnState.Get(); + + _ = await userTokenClient.ExchangeTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, new TokenExchangeRequest { }, cancellationToken); + + _ = await userTokenClient.GetAadTokensAsync(turnContext.Activity.From.Id, _connectionName, new string[] { "x", "y" }, turnContext.Activity.ChannelId, cancellationToken); + + _ = await userTokenClient.GetSignInResourceAsync(_connectionName, turnContext.Activity, "finalRedirect", cancellationToken); + + _ = await userTokenClient.GetTokenStatusAsync(turnContext.Activity.From.Id, turnContext.Activity.ChannelId, "includeFilter", cancellationToken); + + _ = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, "magicCode", cancellationToken); + + // in the product code the sign-out call is generally run as a general intercept before any dialog logic + + await userTokenClient.SignOutUserAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, cancellationToken); + } + } + + private class TestUserTokenClient : UserTokenClient + { + private string _appId; + + public TestUserTokenClient(string appId) + { + _appId = appId; + } + + public IDictionary Record { get; } = new Dictionary(); + + public override Task ExchangeTokenAsync(string userId, string connectionName, string channelId, TokenExchangeRequest exchangeRequest, CancellationToken cancellationToken) + { + Capture(MethodBase.GetCurrentMethod().Name, userId, connectionName, channelId, exchangeRequest); + return Task.FromResult(new TokenResponse { }); + } + + public override Task> GetAadTokensAsync(string userId, string connectionName, string[] resourceUrls, string channelId, CancellationToken cancellationToken) + { + Capture(MethodBase.GetCurrentMethod().Name, userId, connectionName, resourceUrls, channelId); + return Task.FromResult(new Dictionary { }); + } + + public override Task GetSignInResourceAsync(string connectionName, Activity activity, string finalRedirect, CancellationToken cancellationToken) + { + var state = CreateTokenExchangeState(_appId, connectionName, activity); + Capture(MethodBase.GetCurrentMethod().Name, state, finalRedirect); + return Task.FromResult(new SignInResource { }); + } + + public override Task GetTokenStatusAsync(string userId, string channelId, string includeFilter, CancellationToken cancellationToken) + { + Capture(MethodBase.GetCurrentMethod().Name, userId, channelId, includeFilter); + return Task.FromResult(new TokenStatus[0]); + } + + public override Task GetUserTokenAsync(string userId, string connectionName, string channelId, string magicCode, CancellationToken cancellationToken) + { + Capture(MethodBase.GetCurrentMethod().Name, userId, connectionName, channelId, magicCode); + return Task.FromResult(new TokenResponse()); + } + + public override Task SignOutUserAsync(string userId, string connectionName, string channelId, CancellationToken cancellationToken) + { + Capture(MethodBase.GetCurrentMethod().Name, userId, connectionName, channelId); + return Task.CompletedTask; + } + + private void Capture(string name, params object[] args) + { + Record.Add(name, args); + } + } + + private class ConnectorFactoryBot : IBot + { + public IIdentity Identity { get; private set; } + + public IConnectorClient ConnectorClient { get; private set; } + + public UserTokenClient UserTokenClient { get; private set; } + + public BotCallbackHandler BotCallbackHandler { get; private set; } + + public string OAuthScope { get; private set; } + + public AuthenticationHeaderValue Authorization { get; private set; } + + public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) + { + // verify the bot-framework protocol TurnState has been setup by the adapter + Identity = turnContext.TurnState.Get("BotIdentity"); + ConnectorClient = turnContext.TurnState.Get(); + UserTokenClient = turnContext.TurnState.Get(); + BotCallbackHandler = turnContext.TurnState.Get(); + OAuthScope = turnContext.TurnState.Get("Microsoft.Bot.Builder.BotAdapter.OAuthScope"); + + var connectorFactory = turnContext.TurnState.Get(); + + var connector = await connectorFactory.CreateAsync("http://localhost/originalServiceUrl", OAuthScope, cancellationToken); + + var request = new HttpRequestMessage(); + await connector.Credentials.ProcessHttpRequestAsync(request, cancellationToken); + Authorization = request.Headers.Authorization; + } + } + + private class TestCredentials : ServiceClientCredentials + { + private string _testToken; + + public TestCredentials(string testToken) + { + _testToken = testToken; + } + + public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _testToken); + return Task.CompletedTask; + } + } + + private class TestConnectorFactory : ConnectorFactory + { + public override Task CreateAsync(string serviceUrl, string audience, CancellationToken cancellationToken) + { + var credentials = new TestCredentials(audience ?? "test-token"); + return Task.FromResult((IConnectorClient)new ConnectorClient(new Uri(serviceUrl), credentials, null, disposeHttpClient: true)); + } + } + + private class TestContentStream : IContentStream + { + public Guid Id { get; set; } + + public string ContentType { get; set; } + + public int? Length { get; set; } + + public Stream Stream { get; set; } + } + + private class StreamingTestCloudAdapter : CloudAdapter + { + private readonly Dictionary _connections; + + public StreamingTestCloudAdapter(BotFrameworkAuthentication auth, Dictionary connections) + : base(auth) + { + _connections = connections; + } + + protected override StreamingConnection CreateWebSocketConnection(WebSocket socket, ILogger logger) + { + return _connections[socket]; + } + } + } +} diff --git a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/DelayHelper.cs b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/DelayHelper.cs new file mode 100644 index 0000000000..9683f5e47c --- /dev/null +++ b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/DelayHelper.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Diagnostics; +using System.Threading.Tasks; +using Microsoft.Bot.Schema; +using Xunit; +using Activity = Microsoft.Bot.Schema.Activity; + +namespace Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests +{ + public static class DelayHelper + { + public static async Task Test(BotAdapter adapter) + { + using var turnContext = new TurnContext(adapter, new Activity()); + + var activities = new[] + { + new Activity(ActivityTypes.Delay, value: 275), + new Activity(ActivityTypes.Delay, value: 275L), + new Activity(ActivityTypes.Delay, value: 275F), + new Activity(ActivityTypes.Delay, value: 275D), + }; + + Stopwatch sw = new Stopwatch(); + + sw.Start(); + + await adapter.SendActivitiesAsync(turnContext, activities, default); + + sw.Stop(); + + Assert.True(sw.Elapsed.TotalSeconds > 1, $"Delay only lasted {sw.Elapsed}"); + } + } +} diff --git a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj index e1eaaca72b..d70801fd42 100644 --- a/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj +++ b/tests/integration/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests/Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj @@ -73,11 +73,14 @@ + + + @@ -93,6 +96,10 @@ {ada8ab8b-2066-4193-b8f7-985669b23e00} Microsoft.Bot.Builder + + {80FA0E50-8F81-4C60-B265-1039391C1CEE} + Microsoft.Bot.Connector.Streaming + {6462da5d-27dc-4cd5-9467-5efb998fd838} Microsoft.Bot.Connector @@ -101,6 +108,10 @@ {c1f54cdc-ad1d-45bb-8f7d-f49e411afaf1} Microsoft.Bot.Schema + + {4C82FD14-418F-43E4-AC59-3D926B55CEA3} + Microsoft.Bot.Streaming +