From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web09.2202.1573614173618846222 for ; Tue, 12 Nov 2019 19:02:53 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: zhijux.fan@intel.com) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Nov 2019 19:02:53 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,299,1569308400"; d="dat'59?scan'59,208,59";a="235110396" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by fmsmga002.fm.intel.com with ESMTP; 12 Nov 2019 19:02:53 -0800 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 12 Nov 2019 19:02:52 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.213]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.41]) with mapi id 14.03.0439.000; Wed, 13 Nov 2019 11:02:51 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH] BaseTools:Add [packages] section in dsc file Thread-Topic: [PATCH] BaseTools:Add [packages] section in dsc file Thread-Index: AdWZzs68Lsz4j3ZPRxaZaijaxM1wHQ== Date: Wed, 13 Nov 2019 03:02:50 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYTRkYzg4OWMtOTA2MC00NTEzLTg0NzAtZTA1OGZhOTU2YThhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoieUJWMnVTZmlyWHpxb1JuQStibjlvU3A0dGZLd2haUkpWZ3RGd3d4TmlDbVBkK0huUlZJQWpKc3NhUzEwYURXbiJ9 dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 50499 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE00A7SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE00A7SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2270 Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional statement in a DSC/FDF file without a module in the build referencing the PCD package DEC file. An example implementation that to support this is to allow a [Packages] section in the DSC file to list additional package dependencies for PCD references in the package DSC/FDF files. this patch is going to add the ability to have the [packages] section defined in the DSC file Cc: Liming Gao Cc: Bob Feng Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 28 +++++++++++++++++-= ---- BaseTools/Source/Python/AutoGen/PlatformAutoGen.py | 1 + .../Source/Python/AutoGen/WorkspaceAutoGen.py | 1 + BaseTools/Source/Python/Common/DataType.py | 1 + BaseTools/Source/Python/Workspace/DscBuildData.py | 23 +++++++++++++++++- .../Source/Python/Workspace/MetaFileParser.py | 14 +++++++++++ .../Source/Python/Workspace/WorkspaceCommon.py | 2 ++ .../Source/Python/Workspace/WorkspaceDatabase.py | 5 ++++ 8 files changed, 68 insertions(+), 7 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/S= ource/Python/AutoGen/ModuleAutoGen.py index f0812b6887..112707edb1 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -462,13 +462,29 @@ class ModuleAutoGen(AutoGen): def BuildCommand(self): return self.PlatformInfo.BuildCommand =20 - ## Get object list of all packages the module and its dependent librar= ies belong to + ## Get Module package and Platform package + # + # @retval list The list of package object + # + @cached_property + def PackageList(self): + PkagList =3D [] + if self.Module.Packages: + PkagList.extend(self.Module.Packages) + Platform =3D self.BuildDatabase[self.PlatformInfo.MetaFile, self.A= rch, self.BuildTarget, self.ToolChain] + for Package in Platform.Packages: + if Package in PkagList: + continue + PkagList.append(Package) + return PkagList + + ## Get object list of all packages the module and its dependent librar= ies belong to and the Platform depends on # # @retval list The list of package object # @cached_property def DerivedPackageList(self): - PackageList =3D [] + PackageList =3D self.PackageList for M in [self.Module] + self.DependentLibraryList: for Package in M.Packages: if Package in PackageList: @@ -938,13 +954,13 @@ class ModuleAutoGen(AutoGen): self.Targets return self._FileTypes =20 - ## Get the list of package object the module depends on + ## Get the list of package object the module depends on and the Platfo= rm depends on # # @retval list The package object list # @cached_property def DependentPackageList(self): - return self.Module.Packages + return self.PackageList =20 ## Return the list of auto-generated code file # @@ -1101,7 +1117,7 @@ class ModuleAutoGen(AutoGen): RetVal.append(self.MetaFile.Dir) RetVal.append(self.DebugDir) =20 - for Package in self.Module.Packages: + for Package in self.PackageList: PackageDir =3D mws.join(self.WorkspaceDir, Package.MetaFile.Di= r) if PackageDir not in RetVal: RetVal.append(PackageDir) @@ -1125,7 +1141,7 @@ class ModuleAutoGen(AutoGen): @cached_property def PackageIncludePathList(self): IncludesList =3D [] - for Package in self.Module.Packages: + for Package in self.PackageList: PackageDir =3D mws.join(self.WorkspaceDir, Package.MetaFile.Di= r) IncludesList =3D Package.Includes if Package._PrivateIncludes: diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools= /Source/Python/AutoGen/PlatformAutoGen.py index debeb46f58..4c3cdf82d5 100644 --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py @@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen): continue ModuleData =3D self.BuildDatabase[ModuleFile, self.Arch, self.= BuildTarget, self.ToolChain] RetVal.update(ModuleData.Packages) + RetVal.update(self.Platform.Packages) return list(RetVal) =20 @cached_property diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py b/BaseTool= s/Source/Python/AutoGen/WorkspaceAutoGen.py index 9d8040905e..fde48b4b27 100644 --- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py @@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen): continue ModuleData =3D self.BuildDatabase[ModuleFile, Arch, self.B= uildTarget, self.ToolChain] PkgSet.update(ModuleData.Packages) + PkgSet.update(Platform.Packages) Pkgs[Arch] =3D list(PkgSet) return Pkgs =20 diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/= Python/Common/DataType.py index 5d49afb0a9..8d80b41089 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET =3D {TAB_LIBRARY_CLAS= SES.upper(), TAB_DEPEX.uppe PCDS_DYNAMICEX_VPD.upper(), PCDS_DYNAMICEX_HII.upper(), TAB_BUILD_OPTIONS.upper(), + TAB_PACKAGES.upper(), TAB_INCLUDES.upper()} =20 # diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/= Source/Python/Workspace/DscBuildData.py index 9192077f90..03a15bbf3e 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject): self._RawData.DisableOverrideComponent(Components[(file_gu= id_str,str(ModuleFile))]) Components[(file_guid_str,str(ModuleFile))] =3D ModuleId self._RawData._PostProcessed =3D False + + ## Retrieve packages this Platform depends on + @cached_property + def Packages(self): + RetVal =3D set() + RecordList =3D self._RawData[MODEL_META_DATA_PACKAGE, self._Arch] + Macros =3D self._Macros + for Record in RecordList: + File =3D PathClass(NormPath(Record[0], Macros), GlobalData.gWo= rkspace, Arch=3Dself._Arch) + # check the file validation + ErrorCode, ErrorInfo =3D File.Validate('.dec') + if ErrorCode !=3D 0: + LineNo =3D Record[-1] + EdkLogger.error('build', ErrorCode, ExtraData=3DErrorInfo,= File=3Dself.MetaFile, Line=3DLineNo) + # parse this package now. we need it to get protocol/ppi/guid = value + RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Too= lchain]) + return RetVal + ## Retrieve [Components] section information @property def Modules(self): @@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject): continue ModuleData =3D self._Bdb[ModuleFile, self._Arch, self._Tar= get, self._Toolchain] PkgSet.update(ModuleData.Packages) - + if self.Packages: + PkgSet.update(self.Packages) self._DecPcds, self._GuidDict =3D GetDeclaredPcd(self, self._B= db, self._Arch, self._Target, self._Toolchain, PkgSet) self._GuidDict.update(GlobalData.gPlatformPcds) =20 @@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject): continue ModuleData =3D self._Bdb[ModuleFile, self._Arch, self._Tar= get, self._Toolchain] PkgSet.update(ModuleData.Packages) + if self.Packages: + PkgSet.update(self.Packages) self._DecPcds, self._GuidDict =3D GetDeclaredPcd(self, self._B= db, self._Arch, self._Target, self._Toolchain, PkgSet) self._GuidDict.update(GlobalData.gPlatformPcds) return self._DecPcds diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTool= s/Source/Python/Workspace/MetaFileParser.py index 806fc322c5..3f96ce0564 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -160,6 +160,7 @@ class MetaFileParser(object): self.MetaFile =3D FilePath self._FileDir =3D self.MetaFile.Dir self._Defines =3D {} + self._Packages =3D [] self._FileLocalMacros =3D {} self._SectionsMacroDict =3D defaultdict(dict) =20 @@ -351,6 +352,13 @@ class MetaFileParser(object): # If the section information is needed later, it should be stored = in database self._ValueList[0] =3D self._SectionName =20 + ## [packages] section parser + @ParseMacro + def _PackageParser(self): + self._CurrentLine =3D CleanString(self._CurrentLine) + self._Packages.append(self._CurrentLine) + self._ValueList[0] =3D self._CurrentLine + ## [defines] section parser @ParseMacro def _DefineParser(self): @@ -848,6 +856,7 @@ class DscParser(MetaFileParser): TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_= INSTANCE, TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_= CLASS, TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BU= ILD_OPTION, + TAB_PACKAGES.upper() : MODEL_META_DATA_PA= CKAGE, TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT= _BUILD, TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABL= E_IN_MODULE, TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_= FLAG, @@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser): MODEL_META_DATA_DEFINE : self.__Pro= cessDefine, MODEL_META_DATA_GLOBAL_DEFINE : self.__Pro= cessDefine, MODEL_META_DATA_INCLUDE : self.__Pro= cessDirective, + MODEL_META_DATA_PACKAGE : self.__Pro= cessPackages, MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__Pro= cessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__Pro= cessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__Pro= cessDirective, @@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser): self._ValueList =3D None self._ContentIndex -=3D 1 =20 + def __ProcessPackages(self): + self._ValueList[0] =3D ReplaceMacro(self._ValueList[0], self._Macr= os) + def __ProcessSkuId(self): self._ValueList =3D [ReplaceMacro(Value, self._Macros, RaiseError= =3DTrue) for Value in self._ValueList] @@ -1720,6 +1733,7 @@ class DscParser(MetaFileParser): MODEL_META_DATA_COMPONENT : _ComponentPars= er, MODEL_META_DATA_BUILD_OPTION : _BuildOptionPa= rser, MODEL_UNKNOWN : MetaFileParser= ._Skip, + MODEL_META_DATA_PACKAGE : MetaFileParser= ._PackageParser, MODEL_META_DATA_USER_EXTENSION : MetaFileParser= ._SkipUserExtension, MODEL_META_DATA_SECTION_HEADER : MetaFileParser= ._SectionHeaderParser, MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHea= derParser, diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseToo= ls/Source/Python/Workspace/WorkspaceCommon.py index 0b11ec2d59..913e710fd9 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py @@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict): # def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain): PkgSet =3D set() + if Platform.Packages: + PkgSet.update(Platform.Packages) for ModuleFile in Platform.Modules: Data =3D BuildDatabase[ModuleFile, Arch, Target, Toolchain] PkgSet.update(Data.Packages) diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseT= ools/Source/Python/Workspace/WorkspaceDatabase.py index ab7b4506c1..37a6f9f7be 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -186,6 +186,11 @@ class WorkspaceDatabase(object): for Package in LibObj.Packages: if Package not in PackageList: PackageList.append(Package) + DscPlatform =3D self.BuildObject[self.Platform, Arch, TargetName, = ToolChainTag] + for Package in DscPlatform.Packages: + if Package in PackageList: + continue + PackageList.append(Package) =20 return PackageList =20 --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE00A7SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IolXAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAAEQxMzIxREM5 ODUzNjY2NDU5NjRDMDczRUE1Q0JFNURDADcHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHCwANAAMA AgAyAAMAPAEBIIADAA4AAADjBwsADQADAAIAMgADADwBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABADUAAABbUEFUQ0hdIEJhc2VUb29sczpBZGQgW3BhY2thZ2VzXSBzZWN0 aW9uIGluIGRzYyBmaWxlAFQSAQuAAQAhAAAARDEzMjFEQzk4NTM2NjY0NTk2NEMwNzNFQTVDQkU1 REMANwcBA5AGAPAiAAA5AAAAAgF/AAEAAABIAAAAPEZBRDBEN0UwQUUwRkE1NEQ5ODdGNkU3MjQz NUNBRkQ1MEFGRTAwQTdAU0hTTVNYMTAxLmNjci5jb3JwLmludGVsLmNvbT4ACwAfDgEAAAACAQkQ AQAAAOQSAADgEgAAWjsAAExaRnWJWUw9YQAKZmJpZAQAAGNjwHBnMTI1MgD+A0PwdGV4dAH3AqQD 4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCWfQqACMg7CWIxOQ7AvwnDFnIKMhZxAoAVYioJ sHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZSdgSQF7YCEHIAwHR9CFBuGjEQIAXABaAbZGSa IANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAKcRfyYmttawZzAZAAICBCTV9C4EVHSU59CvwB 8QvxER+wWjpoAkBwczrALy9idWd6AxALYCQudAcwbm8FoWUuAQWwZy9zaG93X0EiUS5jZ2k/DdA9 qDIyNwFAbAuAZQqBHSUUQwhwCXACMGx5IIBhIFBDRCAoI2CxJDAgRmUYgAhwZSahXikb0ABwIxAF QGIZ4HX/EgAcYAuAJnEb4Q3gIuACIH8HQCUFH2EQIAeAAjAo5ETAU0MvRkRGHHADEOsZ4APwdCPQ dQVAJoAEYf51K/Eo8SxAGeAiUAMQHGCtCXBmBJAJ8GMLgGclBUctYiaiCrBja2EZ0UTURUMrwy4l DEEDoBAw/GFtC1AtETHyKrIYgCmhBy1RGIAcwG8gc3Vw/nAJES1RBAAo4AQgM4EHQCcJAAfgJoBb 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 AAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A 5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBt AAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAB8MAQAAACoAAAB6AGgA aQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AHgwBAAAACgAAAFMATQBU AFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgA aQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBv AG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AI0ABAAAAKgAAAHoAaABp AGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAiQAEAAAAKAAAAUwBNAFQA UAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABp AGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8A bQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAA AAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAuAE4AbwB0AGUAAAAAAAMA8T8JBAAACwBAOgEA AAADAP0/5AQAAAIBCzABAAAAEAAAANEyHcmFNmZFlkwHPqXL5dwDABcAAQAAAEAAOQAAaWjVzpnV AUAACDBw8ZrVzpnVAR8AAICGAwIAAAAAAMAAAAAAAABGAQAAAB4AAABhAGMAYwBlAHAAdABsAGEA bgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0AVQBTAAAAHwA3AAEAAABqAAAAWwBQAEEAVABD AEgAXQAgAEIAYQBzAGUAVABvAG8AbABzADoAQQBkAGQAIABbAHAAYQBjAGsAYQBnAGUAcwBdACAA cwBlAGMAdABpAG8AbgAgAGkAbgAgAGQAcwBjACAAZgBpAGwAZQAAAAAAHwA9AAEAAAACAAAAAAAA AAMANgAAAAAAAgFxAAEAAAAWAAAAAdWZzs68Lsz4j3ZPRxaZaijaxM1wHQAAHwBwAAEAAABqAAAA WwBQAEEAVABDAEgAXQAgAEIAYQBzAGUAVABvAG8AbABzADoAQQBkAGQAIABbAHAAYQBjAGsAYQBn AGUAcwBdACAAcwBlAGMAdABpAG8AbgAgAGkAbgAgAGQAcwBjACAAZgBpAGwAZQAAAAAAHwA1EAEA AACQAAAAPABGAEEARAAwAEQANwBFADAAQQBFADAARgBBADUANABEADkAOAA3AEYANgBFADcAMgA0 ADMANQBDAEEARgBEADUAMABBAEYARQAwADAAQQA3AEAAUwBIAFMATQBTAFgAMQAwADEALgBjAGMA cgAuAGMAbwByAHAALgBpAG4AdABlAGwALgBjAG8AbQA+AAAAAwDeP59OAABAAAcwOZqV1c6Z1QEC AQsAAQAAABAAAADRMh3JhTZmRZZMBz6ly+XcAwAmAAAAAAACAUcAAQAAADMAAABjPVVTO2E9TUNJ O3A9SW50ZWw7bD1TSFNNU1gxMDEtMTkxMTEzMDMwMjUwWi0xMzQyMwAAAgEQMAEAAABGAAAAAAAA ACZ3vTk77DhJpKYVPcule0IHAPrQ1+CuD6VNmH9uckNcr9UAAABEEV4AAKaTaDaIdmxLp0rT60ea TGQAAAlUwC0AAAAAHwD6PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAAwAJWQEAAABA AACACCAGAAAAAADAAAAAAAAARgAAAAC/hQAAMEKI1M6Z1QELAACACCAGAAAAAADAAAAAAAAARgAA AACChQAAAAAAAAIBAIAIIAYAAAAAAMAAAAAAAABGAAAAAECFAAABAAAAggEAAAMBAQAAAEEAAAAI AAAAAAARAEMAVABQAEMAbABhAHMAcwBpAGYAaQBjAGEAdABpAG8AbgARQ1RQQ2xhc3NpZmljYXRp b24AAAAAAAAAACMAAAARQwBUAFAAQwBsAGEAcwBzAGkAZgBpAGMAYQB0AGkAbwBuAAAAAABBAAAA CAAAAAAAFgBUAGkAdAB1AHMAQwBUAFAAQwBsAGEAcwBzAGkAZgBpAGMAYQB0AGkAbwBuABZUaXR1 c0NUUENsYXNzaWZpY2F0aW9uAAAAAAAAAAAtAAAAFlQAaQB0AHUAcwBDAFQAUABDAGwAYQBzAHMA aQBmAGkAYwBhAHQAaQBvAG4AAAAAAEEAAAAIAAAAAAATAFgALQBUAEkAVABVAFMALQBNAGUAdABh AGQAYQB0AGEALQA0ADAAE1gtVElUVVMtTWV0YWRhdGEtNDAAAAAAAAAAACcAAAATWAAtAFQASQBU AFUAUwAtAE0AZQB0AGEAZABhAHQAYQAtADQAMAAAAAAAAAADAACACCAGAAAAAADAAAAAAAAARgAA AADrhQAACQQAAB8AAIApAwIAAAAAAMAAAAAAAABGAQAAACQAAABDAFQAUABDAGwAYQBzAHMAaQBm AGkAYwBhAHQAaQBvAG4AAAABAAAADgAAAEMAVABQAF8ATgBUAAAAAAAfAACAhgMCAAAAAADAAAAA AAAARgEAAAAoAAAAeAAtAGMAdABwAGMAbABhAHMAcwBpAGYAaQBjAGEAdABpAG8AbgAAAAEAAAAO AAAAQwBUAFAAXwBOAFQAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACgAAAB4AC0AdABpAHQA dQBzAC0AbQBlAHQAYQBkAGEAdABhAC0ANAAwAAAAAQAAAFIDAABlAHkASgBEAFkAWABSAGwAWgAy ADkAeQBlAFUAeABoAFkAbQBWAHMAYwB5AEkANgBJAGkASQBzAEkAawAxAGwAZABHAEYAawBZAFgA UgBoAEkAagBwADcASQBtADUAegBJAGoAbwBpAGEASABSADAAYwBEAHAAYwBMADEAdwB2AGQAMwBk ADMATABuAFIAcABkAEgAVgB6AEwAbQBOAHYAYgBWAHcAdgBiAG4ATgBjAEwAMABsAHUAZABHAFYA cwBNAHkASQBzAEkAbQBsAGsASQBqAG8AaQBZAFQAUgBrAFkAegBnADQATwBXAE0AdABPAFQAQQAy AE0AQwAwADAATgBUAEUAegBMAFQAZwAwAE4AegBBAHQAWgBUAEEAMQBPAEcAWgBoAE8AVABVADIA WQBUAGgAaABJAGkAdwBpAGMASABKAHYAYwBIAE0AaQBPAGwAdAA3AEkAbQA0AGkATwBpAEoARABW AEYAQgBEAGIARwBGAHoAYwAyAGwAbQBhAFcATgBoAGQARwBsAHYAYgBpAEkAcwBJAG4AWgBoAGIA SABNAGkATwBsAHQANwBJAG4AWgBoAGIASABWAGwASQBqAG8AaQBRADEAUgBRAFgAMAA1AFUASQBu ADEAZABmAFYAMQA5AEwAQwBKAFQAZABXAEoAcQBaAFcATgAwAFQARwBGAGkAWgBXAHgAegBJAGoA cABiAFgAUwB3AGkAVgBFADEARABWAG0AVgB5AGMAMgBsAHYAYgBpAEkANgBJAGoARQAzAEwAagBF AHcATABqAEUANABNAEQAUQB1AE4ARABrAGkATABDAEoAVQBjAG4AVgB6AGQARwBWAGsAVABHAEYA aQBaAFcAeABJAFkAWABOAG8ASQBqAG8AaQBlAFUASgBXAE0AbgBWAFQAWgBtAGwAeQBXAEgAcAB4 AGIAMQBKAHUAUQBTAHQAaQBiAGoAbAB2AFUAMwBBADAAZABHAFoATABkADIAaABhAFUAawBwAFcA WgAzAFIARwBkADMAZAA0AFQAbQBsAEQAYgBWAEIAawBLADAAaAB1AFUAbABaAEoAUQBXAHAASwBj ADMATgBoAFUAegBFAHcAWQBVAFIAWABiAGkASgA5AAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEA AAAYAAAAZABsAHAALQBwAHIAbwBkAHUAYwB0AAAAAQAAABoAAABkAGwAcABlAC0AdwBpAG4AZABv AHcAcwAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AdgBlAHIAcwBpAG8A bgAAAAEAAAASAAAAMQAxAC4AMgAuADAALgA2AAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAa AAAAZABsAHAALQByAGUAYQBjAHQAaQBvAG4AAAAAAAEAAAAUAAAAbgBvAC0AYQBjAHQAaQBvAG4A AAACAQCACCAGAAAAAADAAAAAAAAARgEAAAA2AAAASQBuAFQAcgBhAG4AcwBpAHQATQBlAHMAcwBh AGcAZQBDAG8AcgByAGUAbABhAHQAbwByAAAAAAABAAAAEAAAAE11evOHg8RNibX7+TqGyUsDAA00 /T8AAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACAAAAB4AC0AbQBzAC0AaABhAHMALQBhAHQAdABh AGMAaAAAAAEAAAACAAAAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACIAAAB4AC0AbwByAGkA ZwBpAG4AYQB0AGkAbgBnAC0AaQBwAAAAAAABAAAAIAAAAFsAMQAwAC4AMgAzADkALgAxADIANwAu ADQAMABdAAAAZgQ= --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AFE00A7SHSMSX101ccrcor_--