From b39df5fb24fd91225dc0047dd32d9e04acb6e5c6 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 00:27:29 -0700 Subject: [PATCH 001/334] Initial commit for struct records --- src/fsharp/TastOps.fs | 6 +++++- src/fsharp/TastPickle.fs | 8 ++++++-- src/fsharp/TypeChecker.fs | 33 ++++++++++++++++++++++++++------- src/fsharp/TypeRelations.fs | 2 +- src/fsharp/tast.fs | 29 +++++++++++++++++++++++++++-- 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 847fab054f2..e0f5138c89e 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -4699,11 +4699,15 @@ and remapFsObjData g tmenv x = fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv); fsobjmodel_rfields = x.fsobjmodel_rfields |> remapRecdFields g tmenv } +and remapRecdData g tmenv x = + { x with + recd_kind = x.recd_kind + recd_fields = remapRecdFields g tmenv x.recd_fields } and remapTyconRepr g tmenv repr = match repr with | TFsObjModelRepr x -> TFsObjModelRepr (remapFsObjData g tmenv x) - | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) + | TRecdRepr x -> TRecdRepr (remapRecdData g tmenv x) | TFiniteUnionRepr x -> TFiniteUnionRepr (remapUnionCases g tmenv x) | TILObjModelRepr _ -> failwith "cannot remap IL type definitions" #if EXTENSIONTYPING diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 3d37b36b46b..9f43e961008 100644 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -1670,11 +1670,12 @@ let rec dummy x = x and p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. match x with - | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false + | TRecdRepr {recd_kind=TyconRecdKind.TyconClass;recd_fields=fields} -> p_byte 1 st; p_byte 0 st; p_rfield_table fields st; false | TFiniteUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false | TFsObjModelRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_typ ty st; false + | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct;recd_fields=fields} -> p_byte 1 st; p_byte 5 st; p_rfield_table fields st; false | TNoRepr -> p_byte 0 st; false #if EXTENSIONTYPING | TProvidedTypeExtensionPoint info -> @@ -1875,7 +1876,7 @@ and u_tycon_repr st = match tag2 with | 0 -> let v = u_rfield_table st - (fun _flagBit -> TRecdRepr v) + (fun _flagBit -> TRecdRepr {recd_kind=TyconRecdKind.TyconClass;recd_fields=v}) | 1 -> let v = u_list u_unioncase_spec st (fun _flagBit -> MakeUnionRepr v) @@ -1906,6 +1907,9 @@ and u_tycon_repr st = | 4 -> let v = u_typ st (fun _flagBit -> TMeasureableRepr v) + | 5 -> + let v = u_rfield_table st + (fun _flagBit -> TRecdRepr {recd_kind=TyconRecdKind.TyconStruct;recd_fields=v}) | _ -> ufailwith st "u_tycon_repr" | _ -> ufailwith st "u_tycon_repr" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 4596a830f76..186accb58ed 100644 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13417,7 +13417,7 @@ module EstablishTypeDefinitionCores = begin if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || - hasStructAttr && not (match k with TyconStruct -> true | _ -> false) then + hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(),m)) k @@ -13577,10 +13577,15 @@ module EstablishTypeDefinitionCores = begin TAsmRepr s | SynTypeDefnSimpleRepr.Record (_,_,m) -> - // Run InferTyconKind to raise errors on inconsistent attribute sets - InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) |> ignore + let kind = + match InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) with + | TyconClass -> TyconRecdKind.TyconClass + | TyconStruct -> TyconRecdKind.TyconStruct + | _ -> error(InternalError("should have inferred tycon kind",m)) // Note: the table of record fields is initially empty - TRecdRepr (MakeRecdFieldsTable []) + TRecdRepr + { recd_kind=kind + recd_fields=MakeRecdFieldsTable [] } | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -13931,7 +13936,11 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None - | SynTypeDefnSimpleRepr.Record _ -> None + | SynTypeDefnSimpleRepr.Record (_,_,m) -> + match InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) with + | TyconClass -> None + | TyconStruct -> Some(cenv.g.system_Value_typ) + | _ -> error(InternalError("should have inferred tycon kind",m)) | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14126,7 +14135,7 @@ module EstablishTypeDefinitionCores = begin writeFakeUnionCtorsToSink unionCases MakeUnionRepr unionCases, None, NoSafeInitInfo - | SynTypeDefnSimpleRepr.Record (_,fields,_) -> + | SynTypeDefnSimpleRepr.Record (_,fields,m) -> noMeasureAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedRecord noAbstractClassAttributeCheck() @@ -14135,7 +14144,17 @@ module EstablishTypeDefinitionCores = begin let recdFields = TcRecdUnionAndEnumDeclarations.TcNamedFieldDecls cenv envinner innerParent false tpenv fields recdFields |> CheckDuplicates (fun f -> f.Id) "field" |> ignore writeFakeRecordFieldsToSink recdFields - TRecdRepr (MakeRecdFieldsTable recdFields), None, NoSafeInitInfo + + let kind = InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) + let kind = + match kind with + | TyconClass -> TyconRecdKind.TyconClass + | TyconStruct -> TyconRecdKind.TyconStruct + | _ -> + error(InternalError("should have inferred tycon kind",m)) + + let fields = MakeRecdFieldsTable recdFields + TRecdRepr { recd_kind = kind; recd_fields = fields }, None, NoSafeInitInfo | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly (s,_) -> noCLIMutableAttributeCheck() diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs index 3abc3980b3f..cc2ea05344a 100644 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -719,7 +719,7 @@ module SignatureConformance = begin let names (l: UnionCase list) = l |> List.map (fun c -> c.Id.idText) reportNiceError "union case" (names ucases1) (names ucases2) else List.forall2 (checkUnionCase aenv) ucases1 ucases2 - | (TRecdRepr implFields), (TRecdRepr sigFields) -> + | (TRecdRepr {recd_fields=implFields}), (TRecdRepr {recd_fields=sigFields}) -> checkRecordFields g amap denv err aenv implFields sigFields | (TFsObjModelRepr r1), (TFsObjModelRepr r2) -> if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 17496380228..725dba2e48d 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -653,7 +653,7 @@ type Entity = /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. member x.AllFieldTable = match x.TypeReprInfo with - | TRecdRepr x | TFsObjModelRepr {fsobjmodel_rfields=x} -> x + | TRecdRepr {recd_fields=x} | TFsObjModelRepr {fsobjmodel_rfields=x} -> x | _ -> match x.ExceptionInfo with | TExnFresh x -> x @@ -790,6 +790,10 @@ type Entity = /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition member x.IsFSharpStructOrEnumTycon = + (x.IsRecordTycon && + match x.TypeReprInfo with + | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> true + | _ -> false) || x.IsFSharpObjectModelTycon && match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> false @@ -1089,7 +1093,7 @@ and | TFsObjModelRepr of TyconObjModelData /// Indicates the type is a record - | TRecdRepr of TyconRecdFields + | TRecdRepr of TyconRecdData /// Indicates the type is a discriminated union | TFiniteUnionRepr of TyconUnionData @@ -1232,6 +1236,27 @@ and member x.TrueFieldsAsList = x.AllFieldsAsList |> List.filter (fun f -> not f.IsCompilerGenerated) member x.TrueInstanceFieldsAsList = x.AllFieldsAsList |> List.filter (fun f -> not f.IsStatic && not f.IsCompilerGenerated) +and + [] + TyconRecdKind = + /// Indicates the type is a class + | TyconClass + /// Indicates the type is a struct + | TyconStruct + + member x.IsValueType = + match x with + | TyconClass -> false + | TyconStruct -> true + +and + [] + TyconRecdData = + { /// Indicates whether the type declaration is a class or struct + recd_kind: TyconRecdKind + /// The fields of the record. + recd_fields: TyconRecdFields } + and [] TyconUnionCases = From 82d4cbcd2c9b4b6b10217da9c3ed319bdeef6d4a Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 01:17:37 -0700 Subject: [PATCH 002/334] Fixed crash --- src/fsharp/TypeChecker.fs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 186accb58ed..2d399fae915 100644 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13413,11 +13413,13 @@ module EstablishTypeDefinitionCores = begin elif isConcrete || nonNil fields then TyconClass elif isNil slotsigs && inSig then TyconHiddenRepr else TyconInterface + | TyconRecord -> + if hasStructAttr then TyconStruct + else TyconClass | k -> if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || - hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || - hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then + hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(),m)) k From 2d34236293190599501f49eec15b123010dadab1 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 13:26:26 -0700 Subject: [PATCH 003/334] It's better to do it this way --- src/fsharp/TypeChecker.fs | 36 ++++++++++++++---------------------- src/fsharp/tast.fs | 15 +++++++-------- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 2d399fae915..a730b85416c 100644 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13413,13 +13413,11 @@ module EstablishTypeDefinitionCores = begin elif isConcrete || nonNil fields then TyconClass elif isNil slotsigs && inSig then TyconHiddenRepr else TyconInterface - | TyconRecord -> - if hasStructAttr then TyconStruct - else TyconClass | k -> if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || - hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) then + hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || + hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(),m)) k @@ -13578,12 +13576,12 @@ module EstablishTypeDefinitionCores = begin InferTyconKind cenv.g (TyconILAssemblyCode,attrs,[],[],inSig,true,m) |> ignore TAsmRepr s - | SynTypeDefnSimpleRepr.Record (_,_,m) -> + | SynTypeDefnSimpleRepr.Record (_,_,m) -> + // Run InferTyconKind to raise errors on inconsistent attribute sets + InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) |> ignore let kind = - match InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) with - | TyconClass -> TyconRecdKind.TyconClass - | TyconStruct -> TyconRecdKind.TyconStruct - | _ -> error(InternalError("should have inferred tycon kind",m)) + if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then TyconRecdKind.TyconStruct + else TyconRecdKind.TyconClass // Note: the table of record fields is initially empty TRecdRepr { recd_kind=kind @@ -13938,11 +13936,9 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None - | SynTypeDefnSimpleRepr.Record (_,_,m) -> - match InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) with - | TyconClass -> None - | TyconStruct -> Some(cenv.g.system_Value_typ) - | _ -> error(InternalError("should have inferred tycon kind",m)) + | SynTypeDefnSimpleRepr.Record _ -> + if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then Some(cenv.g.system_Value_typ) + else None | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14137,7 +14133,7 @@ module EstablishTypeDefinitionCores = begin writeFakeUnionCtorsToSink unionCases MakeUnionRepr unionCases, None, NoSafeInitInfo - | SynTypeDefnSimpleRepr.Record (_,fields,m) -> + | SynTypeDefnSimpleRepr.Record (_,fields,_) -> noMeasureAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedRecord noAbstractClassAttributeCheck() @@ -14147,13 +14143,9 @@ module EstablishTypeDefinitionCores = begin recdFields |> CheckDuplicates (fun f -> f.Id) "field" |> ignore writeFakeRecordFieldsToSink recdFields - let kind = InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) - let kind = - match kind with - | TyconClass -> TyconRecdKind.TyconClass - | TyconStruct -> TyconRecdKind.TyconStruct - | _ -> - error(InternalError("should have inferred tycon kind",m)) + let kind = + if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then TyconRecdKind.TyconStruct + else TyconRecdKind.TyconClass let fields = MakeRecdFieldsTable recdFields TRecdRepr { recd_kind = kind; recd_fields = fields }, None, NoSafeInitInfo diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 725dba2e48d..8f6fdd12a3b 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -790,14 +790,13 @@ type Entity = /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition member x.IsFSharpStructOrEnumTycon = - (x.IsRecordTycon && - match x.TypeReprInfo with - | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> true - | _ -> false) || - x.IsFSharpObjectModelTycon && - match x.FSharpObjectModelTypeInfo.fsobjmodel_kind with - | TTyconClass | TTyconInterface | TTyconDelegate _ -> false - | TTyconStruct | TTyconEnum -> true + match x.TypeReprInfo with + | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> true + | TFsObjModelRepr info -> + match info.fsobjmodel_kind with + | TTyconClass | TTyconInterface | TTyconDelegate _ -> false + | TTyconStruct | TTyconEnum -> true + | _ -> false /// Indicates if this is a .NET-defined struct or enum type definition , i.e. a value type definition member x.IsILStructOrEnumTycon = From 1540116a09cd2d99ec16d23fd0b2614df6afb545 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 14:17:26 -0700 Subject: [PATCH 004/334] Records that are structs are not ref types. Struct is a sealed type --- src/fsharp/TastOps.fs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index e0f5138c89e..cd0cc2a27a7 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -7071,6 +7071,7 @@ let MemberIsCompiledAsInstance g parent isExtensionMember (membInfo:ValMemberInf let isSealedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty not (isRefTy g ty) || + isStructTy g ty || isUnitTy g ty || isArrayTy g ty || From 75b1f81873bedea9b661493e3b0018209c46718c Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 14:35:22 -0700 Subject: [PATCH 005/334] Gen type properly for struct records --- src/fsharp/IlxGen.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 059060cf7cc..545dfcad99f 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6299,7 +6299,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TTyconInterface -> ILTypeDefKind.Interface | TTyconEnum -> ILTypeDefKind.Enum | TTyconDelegate _ -> ILTypeDefKind.Delegate - + | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class let requiresExtraField = @@ -6630,7 +6630,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = ILTypeDefLayout.Sequential { Size=Some 1; Pack=Some 0us }, ILDefaultPInvokeEncoding.Ansi | _ -> - ILTypeDefLayout.Auto, ILDefaultPInvokeEncoding.Ansi + ILTypeDefLayout.Sequential { Size=None; Pack=None }, ILDefaultPInvokeEncoding.Ansi // if the type's layout is Explicit, ensure that each field has a valid offset let validateExplicit fdef = From b3a37801deeff9dbfac5585a1a25a6263b3ddad6 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 14:56:01 -0700 Subject: [PATCH 006/334] Struct record should not call base ctor --- src/fsharp/IlxGen.fs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 545dfcad99f..ee7e87e1031 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6490,7 +6490,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // Build record constructors and the funky methods that go with records and delegate types. // Constructors and delegate methods have the same access as the representation match tyconRepr with - | TRecdRepr _ when not (tycon.IsEnumTycon) -> + | TRecdRepr {recd_kind=kind} when not (tycon.IsEnumTycon) -> // No constructor for enum types // Otherwise find all the non-static, non zero-init fields and build a constructor let relevantFields = @@ -6501,7 +6501,9 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = relevantFields |> List.map (fun (_,ilFieldName,_,_,_,ilPropType,_,fspec) -> (fspec.Name,ilFieldName,ilPropType)) - let ilMethodDef = mkILSimpleStorageCtorWithParamNames(None, Some cenv.g.ilg.tspec_Object, ilThisTy, ChooseParamNames fieldNamesAndTypes, reprAccess) + // No type spec if the record is a value type + let spec = if kind.IsValueType then None else Some(cenv.g.ilg.tspec_Object) + let ilMethodDef = mkILSimpleStorageCtorWithParamNames(None, spec, ilThisTy, ChooseParamNames fieldNamesAndTypes, reprAccess) yield ilMethodDef // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios From bc8484c4c8e85e7b301fa6edb153fd08e41c9651 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 18:50:12 -0700 Subject: [PATCH 007/334] Fixed bad il generation for struct records --- src/fsharp/TastOps.fs | 12 ++++++------ src/fsharp/infos.fs | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index cd0cc2a27a7..48b46700402 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1546,19 +1546,19 @@ let isClassTy g ty = | ILTypeMetadata (_,td) -> (td.tdKind = ILTypeDefKind.Class) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> isFSharpClassTy g ty +let isStructTy g ty = + (isAppTy g ty && (tyconOfAppTy g ty).IsStructOrEnumTycon) || isTupleStructTy g ty + let isRefTy g ty = isUnionTy g ty || - (isTupleTy g ty && not (isTupleStructTy g ty)) || - isRecdTy g ty || + (isTupleTy g ty && not (isStructTy g ty)) || + (isRecdTy g ty && not (isStructTy g ty)) || isILReferenceTy g ty || isFunTy g ty || isReprHiddenTy g ty || isFSharpObjModelRefTy g ty || isUnitTy g ty -let isStructTy g ty = - (isAppTy g ty && (tyconOfAppTy g ty).IsStructOrEnumTycon) || isTupleStructTy g ty - // ECMA C# LANGUAGE SPECIFICATION, 27.2 // An unmanaged-type is any type that isn’t a reference-type, a type-parameter, or a generic struct-type and // contains no fields whose type is not an unmanaged-type. In other words, an unmanaged-type is one of the @@ -7071,7 +7071,7 @@ let MemberIsCompiledAsInstance g parent isExtensionMember (membInfo:ValMemberInf let isSealedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty not (isRefTy g ty) || - isStructTy g ty || + isRecdTy g ty || isUnitTy g ty || isArrayTy g ty || diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 31ebb9b6a1f..6fbb5550574 100644 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -73,7 +73,7 @@ let GetSuperTypeOfType g amap m typ = | Some ilty -> Some (ImportType scoref amap m tinst ilty) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - + if isFSharpObjModelTy g typ || isExnDeclTy g typ then let tcref,_tinst = destAppTy g typ Some (instType (mkInstForAppTy g typ) (superOfTycon g tcref.Deref)) @@ -83,6 +83,8 @@ let GetSuperTypeOfType g amap m typ = Some g.obj_ty elif isTupleStructTy g typ then Some g.obj_ty + elif isRecdTy g typ then + Some g.obj_ty else None From b9f735dd959b782ba42f1c6b11ca017126fa514c Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 20:16:53 -0700 Subject: [PATCH 008/334] Don't create default ctor for record structs with CLIMutable --- src/fsharp/IlxGen.fs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index ee7e87e1031..d0ec9d72482 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6508,7 +6508,8 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield ilMethodDef // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios // FSharp 3.0 feature: adding CLIMutable to a record type causes emit of default constructor, and all fields get property setters - if isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true) then + // Records that are value types do not create a default constructor with CLIMutable + if not (kind.IsValueType) && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.tspec_Object, ilThisTy, [], reprAccess) | TFsObjModelRepr r when tycon.IsFSharpDelegateTycon -> From 19c98f30c3a8aef0a97986596bfdaeed4aead7eb Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 20:52:36 -0700 Subject: [PATCH 009/334] Prevent default ctor calls for struct records --- src/fsharp/NameResolution.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 50b1e4f0186..ee1c4f22cc1 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1354,7 +1354,7 @@ let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad success (resInfo, Item.FakeInterfaceCtor typ) else let defaultStructCtorInfo = - if (isStructTy g typ && not(ctorInfos |> List.exists (fun x -> x.IsNullary))) then + if (isStructTy g typ && not(isRecdTy g typ) && not(ctorInfos |> List.exists (fun x -> x.IsNullary))) then [DefaultStructCtor(g,typ)] else [] if (isNil defaultStructCtorInfo && isNil ctorInfos) || not (isAppTy g typ) then From 3938108ee1676918ebec227a46deee82d5de30a4 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 5 Sep 2015 23:10:10 -0700 Subject: [PATCH 010/334] Quick fix, should be Auto --- src/fsharp/IlxGen.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index d0ec9d72482..70b16bcecc8 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6633,7 +6633,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = ILTypeDefLayout.Sequential { Size=Some 1; Pack=Some 0us }, ILDefaultPInvokeEncoding.Ansi | _ -> - ILTypeDefLayout.Sequential { Size=None; Pack=None }, ILDefaultPInvokeEncoding.Ansi + ILTypeDefLayout.Auto, ILDefaultPInvokeEncoding.Ansi // if the type's layout is Explicit, ensure that each field has a valid offset let validateExplicit fdef = From 86e9af789fd00fa60d18a0179f4ffc7a7a146576 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 14:03:31 -0700 Subject: [PATCH 011/334] Added RecordTypes.fs to FSharp.Core.Unittests --- .../FSharp.Core.Unittests.fsproj | 11 ++--- .../FSharp.Core/RecordTypes.fs | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index dbedc5f326e..da247dbd889 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -1,4 +1,4 @@ - + @@ -84,7 +84,7 @@ - + @@ -99,7 +99,8 @@ - + + @@ -121,6 +122,6 @@ FSharp.Core.Unittests.dll.config - + - + \ No newline at end of file diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs new file mode 100644 index 00000000000..b11fb509011 --- /dev/null +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +namespace FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core + +open System +open System.Numerics +open FSharp.Core.Unittests.LibraryTestFx +open NUnit.Framework + +type Record = + { + A: float + B: float + } + +[] +type UseRecord() = + [] + member this.CanCompare() = + let r1 = { A = 0.; B = 12. } + let r2 = { A = 0.; B = 12. } + Assert.AreEqual(r1, r2) + Assert.AreNotEqual({ r1 with A = 1.}, r2) + Assert.IsTrue((r1 = r2)) + Assert.IsTrue(r1.Equals r2) + +[] +type StructRecord = + { + C: float + D: float + } + +[] +type UseStructRecord() = + [] + member this.CanCompare() = + let r1 = { C = 0.; D = 12. } + let r2 = { C = 0.; D = 12. } + Assert.AreEqual(r1, r2) + Assert.AreNotEqual({ r1 with C = 1.}, r2) + Assert.IsTrue((r1 = r2)) + Assert.IsTrue(r1.Equals r2) From e30439a5c48b1de4f1464476606cf4ad596ab168 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 14:58:09 -0700 Subject: [PATCH 012/334] Added typecheck error for cyclic reference for struct records --- tests/fsharp/typecheck/sigs/build.bat | 3 +++ tests/fsharp/typecheck/sigs/neg94.bsl | 2 ++ tests/fsharp/typecheck/sigs/neg94.fs | 9 +++++++++ 3 files changed, 14 insertions(+) create mode 100644 tests/fsharp/typecheck/sigs/neg94.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg94.fs diff --git a/tests/fsharp/typecheck/sigs/build.bat b/tests/fsharp/typecheck/sigs/build.bat index a09d7764459..6e435330c90 100644 --- a/tests/fsharp/typecheck/sigs/build.bat +++ b/tests/fsharp/typecheck/sigs/build.bat @@ -5,6 +5,9 @@ REM Configure the sample, i.e. where to find the F# compiler and C# compiler. call %~d0%~p0..\..\..\config.bat +call ..\..\single-neg-test.bat neg94 +@if ERRORLEVEL 1 goto Error + call ..\..\single-neg-test.bat neg93 @if ERRORLEVEL 1 goto Error diff --git a/tests/fsharp/typecheck/sigs/neg94.bsl b/tests/fsharp/typecheck/sigs/neg94.bsl new file mode 100644 index 00000000000..63c66b9823f --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg94.bsl @@ -0,0 +1,2 @@ + +neg94.fs(5,6,5,18): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg94.fs b/tests/fsharp/typecheck/sigs/neg94.fs new file mode 100644 index 00000000000..3a58778211b --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg94.fs @@ -0,0 +1,9 @@ + +module Test + +[] +type StructRecord = + { + X: float + Y: StructRecord + } From fb77ba191dd191e815f594d28bc58f50db603cab Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 15:21:37 -0700 Subject: [PATCH 013/334] Added typecheck error for trying to use a default ctor for a struct record --- tests/fsharp/typecheck/sigs/build.bat | 3 +++ tests/fsharp/typecheck/sigs/neg95.bsl | 2 ++ tests/fsharp/typecheck/sigs/neg95.fs | 11 +++++++++++ 3 files changed, 16 insertions(+) create mode 100644 tests/fsharp/typecheck/sigs/neg95.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg95.fs diff --git a/tests/fsharp/typecheck/sigs/build.bat b/tests/fsharp/typecheck/sigs/build.bat index 6e435330c90..9f0c4510c55 100644 --- a/tests/fsharp/typecheck/sigs/build.bat +++ b/tests/fsharp/typecheck/sigs/build.bat @@ -5,6 +5,9 @@ REM Configure the sample, i.e. where to find the F# compiler and C# compiler. call %~d0%~p0..\..\..\config.bat +call ..\..\single-neg-test.bat neg95 +@if ERRORLEVEL 1 goto Error + call ..\..\single-neg-test.bat neg94 @if ERRORLEVEL 1 goto Error diff --git a/tests/fsharp/typecheck/sigs/neg95.bsl b/tests/fsharp/typecheck/sigs/neg95.bsl new file mode 100644 index 00000000000..29902eb4c44 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg95.bsl @@ -0,0 +1,2 @@ + +neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg95.fs b/tests/fsharp/typecheck/sigs/neg95.fs new file mode 100644 index 00000000000..e46b8fb7fee --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg95.fs @@ -0,0 +1,11 @@ + +module Test + +[] +type StructRecord = + { + X: float + Y: float + } + +let x = StructRecord () From c3453589a1b46bc3a65b3119aeaeb81e3236dc21 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 15:41:29 -0700 Subject: [PATCH 014/334] Added struct record tests for inlining --- tests/fsharp/optimize/inline/lib.fs | 56 +++++++++++++++++++++++++++- tests/fsharp/optimize/inline/test.fs | 20 +++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/tests/fsharp/optimize/inline/lib.fs b/tests/fsharp/optimize/inline/lib.fs index f927f87f15d..6aff829772a 100644 --- a/tests/fsharp/optimize/inline/lib.fs +++ b/tests/fsharp/optimize/inline/lib.fs @@ -60,4 +60,58 @@ type Vector3Generic<'T> = [] module Vector3Generic = let inline test (v1: Vector3Generic) (v2: Vector3Generic) = - v1.x * v2.x + v1.y * v2.y + v1.z * v2.z \ No newline at end of file + v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + +[] +[] +type Vector3Record = + { + x: single + y: single + z: single + } + +[] +[] +module Vector3Record = + let inline dot (v1: Vector3Record) (v2: Vector3Record) = + v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + + let inline dot2 ({ x = x1; y = y1; z = z1}: Vector3Record) ({ x = x2; y = y2; z = z2}: Vector3Record) = + x1 * x2 + y1 * y2 + z1 * z2 + +[] +[] +type Vector3RecordMutableField = + { + x: single + mutable y: single + z: single + } + +[] +[] +module Vector3RecordMutableField = + let inline dot (v1: Vector3RecordMutableField) (v2: Vector3RecordMutableField) = + v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + + let inline dot2 ({ x = x1; y = y1; z = z1}: Vector3RecordMutableField) ({ x = x2; y = y2; z = z2}: Vector3RecordMutableField) = + x1 * x2 + y1 * y2 + z1 * z2 + +[] +[] +type Vector3RecordGeneric<'T> = + { + x: 'T + mutable y: 'T + z: 'T + } + +[] +[] +module Vector3RecordGeneric = + let inline dotObj (v1: Vector3RecordGeneric) (v2: Vector3RecordGeneric) = + v2.y + + let inline dot ({ x = x1; y = y1; z = z1}: Vector3RecordGeneric) ({ x = x2; y = y2; z = z2}: Vector3RecordGeneric) = + x1 * x2 + y1 * y2 + z1 * z2 \ No newline at end of file diff --git a/tests/fsharp/optimize/inline/test.fs b/tests/fsharp/optimize/inline/test.fs index 69354adb59d..4464f87bc29 100644 --- a/tests/fsharp/optimize/inline/test.fs +++ b/tests/fsharp/optimize/inline/test.fs @@ -12,4 +12,22 @@ let testVector3NestedMutableFieldTestInline (v1: Vector3NestedMutableField) = Vector3NestedMutableField.test v1 v1 let testVector3GenericInline (v1: Vector3Generic<'T>) = - Vector3Generic.test v1 v1 \ No newline at end of file + Vector3Generic.test v1 v1 + +let testVector3Record v1 v2 = + Vector3Record.dot v1 v2 + +let testVector3Record2 v1 v2 = + Vector3Record.dot2 v1 v2 + +let testVector3RecordMutableField v1 v2 = + Vector3RecordMutableField.dot v1 v2 + +let testVector3RecordMutableField2 v1 v2 = + Vector3RecordMutableField.dot2 v1 v2 + +let testVector3RecordGenericObj v1 v2 = + Vector3RecordGeneric.dotObj v1 v2 + +let testVector3RecordGeneric v1 v2 = + Vector3RecordGeneric.dot v1 v2 \ No newline at end of file From 3dc8d87e074be087278c75cddf69fe3ca637c805 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 16:27:15 -0700 Subject: [PATCH 015/334] Making tests pass for inline; records in general have inline issues, not related to structs --- tests/fsharp/optimize/inline/lib.fs | 29 ++++++++++------------------ tests/fsharp/optimize/inline/test.fs | 21 ++++++-------------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/tests/fsharp/optimize/inline/lib.fs b/tests/fsharp/optimize/inline/lib.fs index 6aff829772a..a52473b0bee 100644 --- a/tests/fsharp/optimize/inline/lib.fs +++ b/tests/fsharp/optimize/inline/lib.fs @@ -64,7 +64,7 @@ module Vector3Generic = [] [] -type Vector3Record = +type Vector3StructRecord = { x: single y: single @@ -73,16 +73,13 @@ type Vector3Record = [] [] -module Vector3Record = - let inline dot (v1: Vector3Record) (v2: Vector3Record) = +module Vector3StructRecord = + let inline dot (v1: Vector3StructRecord) (v2: Vector3StructRecord) = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z - let inline dot2 ({ x = x1; y = y1; z = z1}: Vector3Record) ({ x = x2; y = y2; z = z2}: Vector3Record) = - x1 * x2 + y1 * y2 + z1 * z2 - [] [] -type Vector3RecordMutableField = +type Vector3StructRecordMutableField = { x: single mutable y: single @@ -91,16 +88,13 @@ type Vector3RecordMutableField = [] [] -module Vector3RecordMutableField = - let inline dot (v1: Vector3RecordMutableField) (v2: Vector3RecordMutableField) = +module Vector3StructRecordMutableField = + let inline dot (v1: Vector3StructRecordMutableField) (v2: Vector3StructRecordMutableField) = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z - let inline dot2 ({ x = x1; y = y1; z = z1}: Vector3RecordMutableField) ({ x = x2; y = y2; z = z2}: Vector3RecordMutableField) = - x1 * x2 + y1 * y2 + z1 * z2 - [] [] -type Vector3RecordGeneric<'T> = +type Vector3StructRecordGeneric<'T> = { x: 'T mutable y: 'T @@ -109,9 +103,6 @@ type Vector3RecordGeneric<'T> = [] [] -module Vector3RecordGeneric = - let inline dotObj (v1: Vector3RecordGeneric) (v2: Vector3RecordGeneric) = - v2.y - - let inline dot ({ x = x1; y = y1; z = z1}: Vector3RecordGeneric) ({ x = x2; y = y2; z = z2}: Vector3RecordGeneric) = - x1 * x2 + y1 * y2 + z1 * z2 \ No newline at end of file +module Vector3StructRecordGeneric = + let inline dot (v1: Vector3StructRecordGeneric) (v2: Vector3StructRecordGeneric) = + v1.x * v2.x + v1.y * v2.y + v1.z * v2.z \ No newline at end of file diff --git a/tests/fsharp/optimize/inline/test.fs b/tests/fsharp/optimize/inline/test.fs index 4464f87bc29..c9e5893a75a 100644 --- a/tests/fsharp/optimize/inline/test.fs +++ b/tests/fsharp/optimize/inline/test.fs @@ -14,20 +14,11 @@ let testVector3NestedMutableFieldTestInline (v1: Vector3NestedMutableField) = let testVector3GenericInline (v1: Vector3Generic<'T>) = Vector3Generic.test v1 v1 -let testVector3Record v1 v2 = - Vector3Record.dot v1 v2 +let testVector3StructRecord v1 v2 = + Vector3StructRecord.dot v1 v2 -let testVector3Record2 v1 v2 = - Vector3Record.dot2 v1 v2 +let testVector3StructRecordMutableField v1 v2 = + Vector3StructRecordMutableField.dot v1 v2 -let testVector3RecordMutableField v1 v2 = - Vector3RecordMutableField.dot v1 v2 - -let testVector3RecordMutableField2 v1 v2 = - Vector3RecordMutableField.dot2 v1 v2 - -let testVector3RecordGenericObj v1 v2 = - Vector3RecordGeneric.dotObj v1 v2 - -let testVector3RecordGeneric v1 v2 = - Vector3RecordGeneric.dot v1 v2 \ No newline at end of file +let testVector3StructRecordGeneric v1 v2 = + Vector3StructRecordGeneric.dot v1 v2 \ No newline at end of file From ea07432df0999a4ae94ab4437e4f251f50cff6a8 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Mon, 7 Sep 2015 16:30:40 -0700 Subject: [PATCH 016/334] Added typecheck for struct record mutable field --- tests/fsharp/typecheck/sigs/build.bat | 3 +++ tests/fsharp/typecheck/sigs/neg96.bsl | 2 ++ tests/fsharp/typecheck/sigs/neg96.fs | 14 ++++++++++++++ 3 files changed, 19 insertions(+) create mode 100644 tests/fsharp/typecheck/sigs/neg96.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg96.fs diff --git a/tests/fsharp/typecheck/sigs/build.bat b/tests/fsharp/typecheck/sigs/build.bat index 9f0c4510c55..3c743fd78df 100644 --- a/tests/fsharp/typecheck/sigs/build.bat +++ b/tests/fsharp/typecheck/sigs/build.bat @@ -5,6 +5,9 @@ REM Configure the sample, i.e. where to find the F# compiler and C# compiler. call %~d0%~p0..\..\..\config.bat +call ..\..\single-neg-test.bat neg96 +@if ERRORLEVEL 1 goto Error + call ..\..\single-neg-test.bat neg95 @if ERRORLEVEL 1 goto Error diff --git a/tests/fsharp/typecheck/sigs/neg96.bsl b/tests/fsharp/typecheck/sigs/neg96.bsl new file mode 100644 index 00000000000..4353b29ffc2 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg96.bsl @@ -0,0 +1,2 @@ + +neg96.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg96.fs b/tests/fsharp/typecheck/sigs/neg96.fs new file mode 100644 index 00000000000..67a7b104b29 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg96.fs @@ -0,0 +1,14 @@ + +module Test + +[] +type StructRecord = + { + X: float + mutable Y: float + } + +let x = { X = 1.; Y = 1. } + +x.Y <- 5. + From aab5720de5b344ea7a1f6ba9da496011cfc454a4 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 9 Sep 2015 00:08:26 -0700 Subject: [PATCH 017/334] Reverted tast changes. Using EntityFlags to determine if a record is a struct. --- src/fsharp/IlxGen.fs | 12 ++++++---- src/fsharp/TastOps.fs | 6 +---- src/fsharp/TastPickle.fs | 10 +++----- src/fsharp/TypeChecker.fs | 32 ++++++++++++------------- src/fsharp/TypeRelations.fs | 2 +- src/fsharp/infos.fs | 2 +- src/fsharp/tast.fs | 47 ++++++++++++------------------------- 7 files changed, 43 insertions(+), 68 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 70b16bcecc8..4f18d85af11 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6299,7 +6299,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TTyconInterface -> ILTypeDefKind.Interface | TTyconEnum -> ILTypeDefKind.Enum | TTyconDelegate _ -> ILTypeDefKind.Delegate - | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> ILTypeDefKind.ValueType + | TRecdRepr _ when tycon.Data.entity_flags.IsStructRecordType -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class let requiresExtraField = @@ -6490,7 +6490,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // Build record constructors and the funky methods that go with records and delegate types. // Constructors and delegate methods have the same access as the representation match tyconRepr with - | TRecdRepr {recd_kind=kind} when not (tycon.IsEnumTycon) -> + | TRecdRepr _ when not (tycon.IsEnumTycon) -> // No constructor for enum types // Otherwise find all the non-static, non zero-init fields and build a constructor let relevantFields = @@ -6501,15 +6501,17 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = relevantFields |> List.map (fun (_,ilFieldName,_,_,_,ilPropType,_,fspec) -> (fspec.Name,ilFieldName,ilPropType)) + let isStructRecord = tycon.Data.entity_flags.IsStructRecordType + // No type spec if the record is a value type - let spec = if kind.IsValueType then None else Some(cenv.g.ilg.tspec_Object) + let spec = if isStructRecord then None else Some(cenv.g.ilg.tspec_Object) let ilMethodDef = mkILSimpleStorageCtorWithParamNames(None, spec, ilThisTy, ChooseParamNames fieldNamesAndTypes, reprAccess) yield ilMethodDef // FSharp 1.0 bug 1988: Explicitly setting the ComVisible(true) attribute on an F# type causes an F# record to be emitted in a way that enables mutation for COM interop scenarios // FSharp 3.0 feature: adding CLIMutable to a record type causes emit of default constructor, and all fields get property setters - // Records that are value types do not create a default constructor with CLIMutable - if not (kind.IsValueType) && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then + // Records that are value types do not create a default constructor with CLIMutable or ComVisible + if not isStructRecord && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.tspec_Object, ilThisTy, [], reprAccess) | TFsObjModelRepr r when tycon.IsFSharpDelegateTycon -> diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 48b46700402..e7de121315b 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -4699,15 +4699,11 @@ and remapFsObjData g tmenv x = fsobjmodel_vslots = x.fsobjmodel_vslots |> List.map (remapValRef tmenv); fsobjmodel_rfields = x.fsobjmodel_rfields |> remapRecdFields g tmenv } -and remapRecdData g tmenv x = - { x with - recd_kind = x.recd_kind - recd_fields = remapRecdFields g tmenv x.recd_fields } and remapTyconRepr g tmenv repr = match repr with | TFsObjModelRepr x -> TFsObjModelRepr (remapFsObjData g tmenv x) - | TRecdRepr x -> TRecdRepr (remapRecdData g tmenv x) + | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) | TFiniteUnionRepr x -> TFiniteUnionRepr (remapUnionCases g tmenv x) | TILObjModelRepr _ -> failwith "cannot remap IL type definitions" #if EXTENSIONTYPING diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 9f43e961008..8341f779e19 100644 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -1670,12 +1670,11 @@ let rec dummy x = x and p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. match x with - | TRecdRepr {recd_kind=TyconRecdKind.TyconClass;recd_fields=fields} -> p_byte 1 st; p_byte 0 st; p_rfield_table fields st; false + | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false | TFiniteUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false | TFsObjModelRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_typ ty st; false - | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct;recd_fields=fields} -> p_byte 1 st; p_byte 5 st; p_rfield_table fields st; false | TNoRepr -> p_byte 0 st; false #if EXTENSIONTYPING | TProvidedTypeExtensionPoint info -> @@ -1876,7 +1875,7 @@ and u_tycon_repr st = match tag2 with | 0 -> let v = u_rfield_table st - (fun _flagBit -> TRecdRepr {recd_kind=TyconRecdKind.TyconClass;recd_fields=v}) + (fun _flagBit -> TRecdRepr v) | 1 -> let v = u_list u_unioncase_spec st (fun _flagBit -> MakeUnionRepr v) @@ -1907,9 +1906,6 @@ and u_tycon_repr st = | 4 -> let v = u_typ st (fun _flagBit -> TMeasureableRepr v) - | 5 -> - let v = u_rfield_table st - (fun _flagBit -> TRecdRepr {recd_kind=TyconRecdKind.TyconStruct;recd_fields=v}) | _ -> ufailwith st "u_tycon_repr" | _ -> ufailwith st "u_tycon_repr" @@ -2540,4 +2536,4 @@ let unpickleModuleOrNamespace st = u_tycon_spec st let unpickleCcuInfo st = let a,b,c,_space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st - { mspec=a; compileTimeWorkingDir=b; usesQuotations=c } + { mspec=a; compileTimeWorkingDir=b; usesQuotations=c } \ No newline at end of file diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 818447d067c..eae8a6d9022 100644 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13488,7 +13488,7 @@ module EstablishTypeDefinitionCores = begin /// but /// - we don't yet 'properly' establish constraints on type parameters let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (TyconDefnCoreIndexed(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,_)) = - let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo + let (ComponentInfo(synAttrs,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) @@ -13516,7 +13516,16 @@ module EstablishTypeDefinitionCores = begin let visOfRepr = combineAccess vis visOfRepr // If we supported nested types and modules then additions would be needed here let lmtyp = notlazy (NewEmptyModuleOrNamespaceType ModuleOrType) - NewTycon(cpath, id.idText, id.idRange, vis, visOfRepr, TyparKind.Type, LazyWithContext.NotLazy checkedTypars, doc.ToXmlDoc(), preferPostfix, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, lmtyp) + + let isStructRecordType = + match synTyconRepr with + | SynTypeDefnSimpleRepr.Record _ -> + let attrs = TcAttributes cenv env AttributeTargets.TyconDecl synAttrs + HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs + | _ -> + false + + NewTycon(cpath, id.idText, id.idRange, vis, visOfRepr, TyparKind.Type, LazyWithContext.NotLazy checkedTypars, doc.ToXmlDoc(), preferPostfix, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType, lmtyp) //------------------------------------------------------------------------- /// Establishing type definitions: early phase: work out the basic kind of the type definition @@ -13579,13 +13588,8 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Record (_,_,m) -> // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) |> ignore - let kind = - if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then TyconRecdKind.TyconStruct - else TyconRecdKind.TyconClass // Note: the table of record fields is initially empty - TRecdRepr - { recd_kind=kind - recd_fields=MakeRecdFieldsTable [] } + TRecdRepr (MakeRecdFieldsTable []) | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -13937,8 +13941,8 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None | SynTypeDefnSimpleRepr.Record _ -> - if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then Some(cenv.g.system_Value_typ) - else None + if tycon.Data.entity_flags.IsStructRecordType then Some(cenv.g.system_Value_typ) + else None | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14142,13 +14146,7 @@ module EstablishTypeDefinitionCores = begin let recdFields = TcRecdUnionAndEnumDeclarations.TcNamedFieldDecls cenv envinner innerParent false tpenv fields recdFields |> CheckDuplicates (fun f -> f.Id) "field" |> ignore writeFakeRecordFieldsToSink recdFields - - let kind = - if HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs then TyconRecdKind.TyconStruct - else TyconRecdKind.TyconClass - - let fields = MakeRecdFieldsTable recdFields - TRecdRepr { recd_kind = kind; recd_fields = fields }, None, NoSafeInitInfo + TRecdRepr (MakeRecdFieldsTable recdFields), None, NoSafeInitInfo | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly (s,_) -> noCLIMutableAttributeCheck() diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs index d28c1974842..75f30694743 100644 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -719,7 +719,7 @@ module SignatureConformance = begin let names (l: UnionCase list) = l |> List.map (fun c -> c.Id.idText) reportNiceError "union case" (names ucases1) (names ucases2) else List.forall2 (checkUnionCase aenv) ucases1 ucases2 - | (TRecdRepr {recd_fields=implFields}), (TRecdRepr {recd_fields=sigFields}) -> + | (TRecdRepr implFields), (TRecdRepr sigFields) -> checkRecordFields g amap denv err aenv implFields sigFields | (TFsObjModelRepr r1), (TFsObjModelRepr r2) -> if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 553f3fdbb1e..7b1f422b2e7 100644 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -73,7 +73,7 @@ let GetSuperTypeOfType g amap m typ = | Some ilty -> Some (ImportType scoref amap m tinst ilty) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - + if isFSharpObjModelTy g typ || isExnDeclTy g typ then let tcref,_tinst = destAppTy g typ Some (instType (mkInstForAppTy g typ) (superOfTycon g tcref.Deref)) diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 2c73577a929..e7e5312683f 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -350,11 +350,12 @@ type TyparFlags(flags:int32) = [] type EntityFlags(flags:int64) = - new (usesPrefixDisplay, isModuleOrNamespace, preEstablishedHasDefaultCtor, hasSelfReferentialCtor) = + new (usesPrefixDisplay, isModuleOrNamespace, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType) = EntityFlags((if isModuleOrNamespace then 0b00000000001L else 0L) ||| (if usesPrefixDisplay then 0b00000000010L else 0L) ||| (if preEstablishedHasDefaultCtor then 0b00000000100L else 0L) ||| - (if hasSelfReferentialCtor then 0b00000001000L else 0L)) + (if hasSelfReferentialCtor then 0b00000001000L else 0L) ||| + (if isStructRecordType then 0b00000100000L else 0L)) member x.IsModuleOrNamespace = (flags &&& 0b00000000001L) <> 0x0L member x.IsPrefixDisplay = (flags &&& 0b00000000010L) <> 0x0L @@ -368,6 +369,9 @@ type EntityFlags(flags:int64) = // case sub-classes must protect themselves against early access to their contents. member x.HasSelfReferentialConstructor = (flags &&& 0b00000001000L) <> 0x0L + /// This bit represents a F# record that is a value type, or a struct record. + member x.IsStructRecordType = (flags &&& 0b00000100000L) <> 0x0L + /// This bit is reserved for us in the pickle format, see pickle.fs, it's bing listed here to stop it ever being used for anything else static member ReservedBitForPickleFormatTyconReprFlag = 0b00000010000L @@ -653,7 +657,7 @@ type Entity = /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. member x.AllFieldTable = match x.TypeReprInfo with - | TRecdRepr {recd_fields=x} | TFsObjModelRepr {fsobjmodel_rfields=x} -> x + | TRecdRepr x | TFsObjModelRepr {fsobjmodel_rfields=x} -> x | _ -> match x.ExceptionInfo with | TExnFresh x -> x @@ -791,7 +795,7 @@ type Entity = /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition member x.IsFSharpStructOrEnumTycon = match x.TypeReprInfo with - | TRecdRepr {recd_kind=TyconRecdKind.TyconStruct} -> true + | TRecdRepr _ -> x.Data.entity_flags.IsStructRecordType | TFsObjModelRepr info -> match info.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> false @@ -1092,7 +1096,7 @@ and | TFsObjModelRepr of TyconObjModelData /// Indicates the type is a record - | TRecdRepr of TyconRecdData + | TRecdRepr of TyconRecdFields /// Indicates the type is a discriminated union | TFiniteUnionRepr of TyconUnionData @@ -1235,27 +1239,6 @@ and member x.TrueFieldsAsList = x.AllFieldsAsList |> List.filter (fun f -> not f.IsCompilerGenerated) member x.TrueInstanceFieldsAsList = x.AllFieldsAsList |> List.filter (fun f -> not f.IsStatic && not f.IsCompilerGenerated) -and - [] - TyconRecdKind = - /// Indicates the type is a class - | TyconClass - /// Indicates the type is a struct - | TyconStruct - - member x.IsValueType = - match x with - | TyconClass -> false - | TyconStruct -> true - -and - [] - TyconRecdData = - { /// Indicates whether the type declaration is a class or struct - recd_kind: TyconRecdKind - /// The fields of the record. - recd_fields: TyconRecdFields } - and [] TyconUnionCases = @@ -1680,7 +1663,7 @@ and Construct = entity_compiled_name=None entity_kind=kind entity_range=m - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordType=false) entity_attribs=[] // fetched on demand via est.fs API entity_typars= LazyWithContext.NotLazy [] entity_tycon_abbrev = None @@ -1708,7 +1691,7 @@ and Construct = entity_stamp=stamp entity_kind=TyparKind.Type entity_modul_contents = mtype - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false,isStructRecordType=false) entity_typars=LazyWithContext.NotLazy [] entity_tycon_abbrev = None entity_tycon_repr = TNoRepr @@ -4482,7 +4465,7 @@ let NewExn cpath (id:Ident) access repr attribs doc = entity_typars=LazyWithContext.NotLazy [] entity_tycon_abbrev = None entity_tycon_repr = TNoRepr - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordType=false) entity_il_repr_cache= newCache() } let NewRecdField stat konst id ty isMutable isVolatile pattribs fattribs docOption access secret = @@ -4500,7 +4483,7 @@ let NewRecdField stat konst id ty isMutable isVolatile pattribs fattribs docOpt rfield_id=id } -let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPrefixDisplay, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, mtyp) = +let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPrefixDisplay, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType, mtyp) = let stamp = newStamp() Tycon.New "tycon" { entity_stamp=stamp @@ -4508,7 +4491,7 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre entity_compiled_name=None entity_kind=kind entity_range=m - entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor) + entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor, isStructRecordType=isStructRecordType) entity_attribs=[] // fixed up after entity_typars=typars entity_tycon_abbrev = None @@ -4529,7 +4512,7 @@ let NewILTycon nlpath (nm,m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = // NOTE: hasSelfReferentialCtor=false is an assumption about mscorlib let hasSelfReferentialCtor = tdef.IsClass && (not scoref.IsAssemblyRef && scoref.AssemblyRef.Name = "mscorlib") - let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, mtyp) + let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, false, mtyp) tycon.Data.entity_tycon_repr <- TILObjModelRepr (scoref,enc,tdef) tycon.TypeContents.tcaug_closed <- true From 83f0e862adee051d1b03df46d00132c67346969e Mon Sep 17 00:00:00 2001 From: TIHan Date: Fri, 22 Jan 2016 09:26:16 -0800 Subject: [PATCH 018/334] Fixing a few things before merging to master --- tests/fsharp/typecheck/sigs/build.bat | 3 +++ tests/fsharp/typecheck/sigs/neg94.bsl | 2 -- tests/fsharp/typecheck/sigs/neg94.fs | 9 --------- tests/fsharp/typecheck/sigs/neg95.bsl | 2 +- tests/fsharp/typecheck/sigs/neg95.fs | 6 ++---- tests/fsharp/typecheck/sigs/neg96.bsl | 2 +- tests/fsharp/typecheck/sigs/neg96.fs | 7 ++----- tests/fsharp/typecheck/sigs/neg97.bsl | 2 ++ tests/fsharp/typecheck/sigs/neg97.fs | 14 ++++++++++++++ 9 files changed, 25 insertions(+), 22 deletions(-) delete mode 100644 tests/fsharp/typecheck/sigs/neg94.bsl delete mode 100644 tests/fsharp/typecheck/sigs/neg94.fs create mode 100644 tests/fsharp/typecheck/sigs/neg97.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg97.fs diff --git a/tests/fsharp/typecheck/sigs/build.bat b/tests/fsharp/typecheck/sigs/build.bat index 3c743fd78df..4b0c4d4a5f8 100644 --- a/tests/fsharp/typecheck/sigs/build.bat +++ b/tests/fsharp/typecheck/sigs/build.bat @@ -5,6 +5,9 @@ REM Configure the sample, i.e. where to find the F# compiler and C# compiler. call %~d0%~p0..\..\..\config.bat +call ..\..\single-neg-test.bat neg97 +@if ERRORLEVEL 1 goto Error + call ..\..\single-neg-test.bat neg96 @if ERRORLEVEL 1 goto Error diff --git a/tests/fsharp/typecheck/sigs/neg94.bsl b/tests/fsharp/typecheck/sigs/neg94.bsl deleted file mode 100644 index 63c66b9823f..00000000000 --- a/tests/fsharp/typecheck/sigs/neg94.bsl +++ /dev/null @@ -1,2 +0,0 @@ - -neg94.fs(5,6,5,18): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg94.fs b/tests/fsharp/typecheck/sigs/neg94.fs deleted file mode 100644 index 3a58778211b..00000000000 --- a/tests/fsharp/typecheck/sigs/neg94.fs +++ /dev/null @@ -1,9 +0,0 @@ - -module Test - -[] -type StructRecord = - { - X: float - Y: StructRecord - } diff --git a/tests/fsharp/typecheck/sigs/neg95.bsl b/tests/fsharp/typecheck/sigs/neg95.bsl index 29902eb4c44..63c66b9823f 100644 --- a/tests/fsharp/typecheck/sigs/neg95.bsl +++ b/tests/fsharp/typecheck/sigs/neg95.bsl @@ -1,2 +1,2 @@ -neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined \ No newline at end of file +neg94.fs(5,6,5,18): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg95.fs b/tests/fsharp/typecheck/sigs/neg95.fs index e46b8fb7fee..3a58778211b 100644 --- a/tests/fsharp/typecheck/sigs/neg95.fs +++ b/tests/fsharp/typecheck/sigs/neg95.fs @@ -1,11 +1,9 @@ module Test -[] +[] type StructRecord = { X: float - Y: float + Y: StructRecord } - -let x = StructRecord () diff --git a/tests/fsharp/typecheck/sigs/neg96.bsl b/tests/fsharp/typecheck/sigs/neg96.bsl index 4353b29ffc2..29902eb4c44 100644 --- a/tests/fsharp/typecheck/sigs/neg96.bsl +++ b/tests/fsharp/typecheck/sigs/neg96.bsl @@ -1,2 +1,2 @@ -neg96.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' \ No newline at end of file +neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg96.fs b/tests/fsharp/typecheck/sigs/neg96.fs index 67a7b104b29..e46b8fb7fee 100644 --- a/tests/fsharp/typecheck/sigs/neg96.fs +++ b/tests/fsharp/typecheck/sigs/neg96.fs @@ -5,10 +5,7 @@ module Test type StructRecord = { X: float - mutable Y: float + Y: float } -let x = { X = 1.; Y = 1. } - -x.Y <- 5. - +let x = StructRecord () diff --git a/tests/fsharp/typecheck/sigs/neg97.bsl b/tests/fsharp/typecheck/sigs/neg97.bsl new file mode 100644 index 00000000000..4353b29ffc2 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg97.bsl @@ -0,0 +1,2 @@ + +neg96.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg97.fs b/tests/fsharp/typecheck/sigs/neg97.fs new file mode 100644 index 00000000000..67a7b104b29 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg97.fs @@ -0,0 +1,14 @@ + +module Test + +[] +type StructRecord = + { + X: float + mutable Y: float + } + +let x = { X = 1.; Y = 1. } + +x.Y <- 5. + From d5d4c49a30d924ff5388f11eb82cc770e8ca5839 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Fri, 5 Feb 2016 20:36:20 +1100 Subject: [PATCH 019/334] Replacement implementation for Range operators A lighter implementation of the range operators that conforms (i think?) to current impl --- src/fsharp/FSharp.Core/prim-types.fs | 109 ++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 10 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index bf1168b597d..48838e38f1d 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -6497,6 +6497,95 @@ namespace Microsoft.FSharp.Core interface IEnumerable with member x.GetEnumerator() = (gen() :> IEnumerator) } + [] + type VariableStepIntegralRangeState<'a> = { + mutable Started : bool + mutable Complete : bool + mutable Current : 'a + } + let inline variableStepIntegralRange n step m = + if step = LanguagePrimitives.GenericZero + then invalidArg "step" (SR.GetString(SR.stepCannotBeZero)); + else + let variableStepRangeEnumerator () = + let state = { + Started = false + Complete = false + Current = Unchecked.defaultof<'a> + } + + { new System.Collections.Generic.IEnumerator<'a> with + member __.Dispose () = () + + member __.Current = + // according to IEnumerator.Current documentation, the result of of Current + // is undefined prior to the first call of MoveNext and post called to MoveNext + // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) + // so we should be able to just return value here, and we could get rid of the + // complete variable which would be faster + if not state.Started then notStarted () + elif state.Complete then alreadyFinished () + else state.Current + + member this.Current = + box this.Current + + member __.Reset () = + state.Started <- false + state.Complete <- false + state.Current <- Unchecked.defaultof<_> + + member __.MoveNext () = + if not state.Started then + state.Started <- true + state.Current <- n + state.Complete <- + ( (step > LanguagePrimitives.GenericZero && state.Current > m) + || (step < LanguagePrimitives.GenericZero && state.Current < m)) + else + let next = state.Current + step + if (step > LanguagePrimitives.GenericZero && next > state.Current && next <= m) + || (step < LanguagePrimitives.GenericZero && next < state.Current && next >= m) + then + state.Current <- next + else + state.Complete <- true + + not state.Complete } + + { new System.Collections.Generic.IEnumerable<'a> with + member __. GetEnumerator () = variableStepRangeEnumerator () + member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } + + let inline simpleIntegralRange minValue maxValue n step m = + if step <> LanguagePrimitives.GenericOne || n > m || n = minValue || m = maxValue + then variableStepIntegralRange n step m + else + // a constrained, common simple iterator that is fast. + let singleStepRangeEnumerator () = + let mutable value : 'a = n - LanguagePrimitives.GenericOne + { new System.Collections.Generic.IEnumerator<'a> with + member __.Dispose () = () + member __.Current = + // according to IEnumerator.Current documentation, the result of of Current + // is undefined prior to the first call of MoveNext and post called to MoveNext + // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) + // so we should be able to just return value here, which would be faster + if value < n then notStarted () + elif value > m then alreadyFinished () + else value + member this.Current = box this.Current + member __.Reset () = value <- n - LanguagePrimitives.GenericOne + member __.MoveNext () = + if value < m then + value <- value + LanguagePrimitives.GenericOne + true + else false } + + { new System.Collections.Generic.IEnumerable<'a> with + member __. GetEnumerator () = singleStepRangeEnumerator () + member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } + // For RangeStepGeneric, zero and add are functions representing the static resolution of GenericZero and (+) // for the particular static type. let inline integralRangeStep<'T,'Step> (zero:'Step) (add:'T -> 'Step -> 'T) (n:'T, step:'Step, m:'T) = @@ -6576,16 +6665,16 @@ namespace Microsoft.FSharp.Core interface System.Collections.IEnumerable with member x.GetEnumerator() = (gen() :> System.Collections.IEnumerator) } - let RangeInt32 n step m : seq = integralRangeStep 0 (+) (n,step,m) - let RangeInt64 n step m : seq = integralRangeStep 0L (+) (n,step,m) - let RangeUInt64 n step m : seq = integralRangeStep 0UL (+) (n,step,m) - let RangeUInt32 n step m : seq = integralRangeStep 0ul (+) (n,step,m) - let RangeIntPtr n step m : seq = integralRangeStep 0n (+) (n,step,m) - let RangeUIntPtr n step m : seq = integralRangeStep 0un (+) (n,step,m) - let RangeInt16 n step m : seq = integralRangeStep 0s (+) (n,step,m) - let RangeUInt16 n step m : seq = integralRangeStep 0us (+) (n,step,m) - let RangeSByte n step m : seq = integralRangeStep 0y (+) (n,step,m) - let RangeByte n step m : seq = integralRangeStep 0uy (+) (n,step,m) + let RangeInt32 n step m : seq = simpleIntegralRange Int32.MinValue Int32.MaxValue n step m + let RangeInt64 n step m : seq = simpleIntegralRange Int64.MinValue Int64.MaxValue n step m + let RangeUInt64 n step m : seq = simpleIntegralRange UInt64.MinValue UInt64.MaxValue n step m + let RangeUInt32 n step m : seq = simpleIntegralRange UInt32.MinValue UInt32.MaxValue n step m + let RangeIntPtr n step m : seq = variableStepIntegralRange n step m + let RangeUIntPtr n step m : seq = variableStepIntegralRange n step m + let RangeInt16 n step m : seq = simpleIntegralRange Int16.MinValue Int16.MaxValue n step m + let RangeUInt16 n step m : seq = simpleIntegralRange UInt16.MinValue UInt16.MaxValue n step m + let RangeSByte n step m : seq = simpleIntegralRange SByte.MinValue SByte.MaxValue n step m + let RangeByte n step m : seq = simpleIntegralRange Byte.MinValue Byte.MaxValue n step m let RangeDouble n step m : seq = floatingRange float (n,step,m) let RangeSingle n step m : seq = floatingRange float32 (n,step,m) let RangeGeneric one add n m : seq<'T> = integralRange (one,add,n,m) From 6f6fabf03f4f9a1ad2f38dcd0a15cc317af3e607 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Fri, 5 Feb 2016 21:23:52 +1100 Subject: [PATCH 020/334] Removed indentation --- src/fsharp/FSharp.Core/prim-types.fs | 98 ++++++++++++++-------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 48838e38f1d..883e8c9db9e 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -6504,58 +6504,58 @@ namespace Microsoft.FSharp.Core mutable Current : 'a } let inline variableStepIntegralRange n step m = - if step = LanguagePrimitives.GenericZero - then invalidArg "step" (SR.GetString(SR.stepCannotBeZero)); - else - let variableStepRangeEnumerator () = - let state = { - Started = false - Complete = false - Current = Unchecked.defaultof<'a> - } - - { new System.Collections.Generic.IEnumerator<'a> with - member __.Dispose () = () - - member __.Current = - // according to IEnumerator.Current documentation, the result of of Current - // is undefined prior to the first call of MoveNext and post called to MoveNext - // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) - // so we should be able to just return value here, and we could get rid of the - // complete variable which would be faster - if not state.Started then notStarted () - elif state.Complete then alreadyFinished () - else state.Current - - member this.Current = - box this.Current - - member __.Reset () = - state.Started <- false - state.Complete <- false - state.Current <- Unchecked.defaultof<_> - - member __.MoveNext () = - if not state.Started then - state.Started <- true - state.Current <- n - state.Complete <- - ( (step > LanguagePrimitives.GenericZero && state.Current > m) - || (step < LanguagePrimitives.GenericZero && state.Current < m)) + if step = LanguagePrimitives.GenericZero then + invalidArg "step" (SR.GetString(SR.stepCannotBeZero)); + + let variableStepRangeEnumerator () = + let state = { + Started = false + Complete = false + Current = Unchecked.defaultof<'a> + } + + { new System.Collections.Generic.IEnumerator<'a> with + member __.Dispose () = () + + member __.Current = + // according to IEnumerator.Current documentation, the result of of Current + // is undefined prior to the first call of MoveNext and post called to MoveNext + // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) + // so we should be able to just return value here, and we could get rid of the + // complete variable which would be faster + if not state.Started then notStarted () + elif state.Complete then alreadyFinished () + else state.Current + + member this.Current = + box this.Current + + member __.Reset () = + state.Started <- false + state.Complete <- false + state.Current <- Unchecked.defaultof<_> + + member __.MoveNext () = + if not state.Started then + state.Started <- true + state.Current <- n + state.Complete <- + ( (step > LanguagePrimitives.GenericZero && state.Current > m) + || (step < LanguagePrimitives.GenericZero && state.Current < m)) + else + let next = state.Current + step + if (step > LanguagePrimitives.GenericZero && next > state.Current && next <= m) + || (step < LanguagePrimitives.GenericZero && next < state.Current && next >= m) + then + state.Current <- next else - let next = state.Current + step - if (step > LanguagePrimitives.GenericZero && next > state.Current && next <= m) - || (step < LanguagePrimitives.GenericZero && next < state.Current && next >= m) - then - state.Current <- next - else - state.Complete <- true + state.Complete <- true - not state.Complete } + not state.Complete } - { new System.Collections.Generic.IEnumerable<'a> with - member __. GetEnumerator () = variableStepRangeEnumerator () - member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } + { new System.Collections.Generic.IEnumerable<'a> with + member __. GetEnumerator () = variableStepRangeEnumerator () + member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } let inline simpleIntegralRange minValue maxValue n step m = if step <> LanguagePrimitives.GenericOne || n > m || n = minValue || m = maxValue From a82e6a3c01b632b0a33775fed815650376103f92 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Sat, 6 Feb 2016 13:09:29 +1100 Subject: [PATCH 021/334] Made changes as per code reviews --- src/fsharp/FSharp.Core/prim-types.fs | 96 ++++++++++++++++------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 883e8c9db9e..753c8bdb409 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -6498,10 +6498,10 @@ namespace Microsoft.FSharp.Core member x.GetEnumerator() = (gen() :> IEnumerator) } [] - type VariableStepIntegralRangeState<'a> = { + type VariableStepIntegralRangeState<'T> = { mutable Started : bool mutable Complete : bool - mutable Current : 'a + mutable Current : 'T } let inline variableStepIntegralRange n step m = if step = LanguagePrimitives.GenericZero then @@ -6511,24 +6511,29 @@ namespace Microsoft.FSharp.Core let state = { Started = false Complete = false - Current = Unchecked.defaultof<'a> + Current = Unchecked.defaultof<'T> } - { new System.Collections.Generic.IEnumerator<'a> with + let current () = + // according to IEnumerator.Current documentation, the result of of Current + // is undefined prior to the first call of MoveNext and post called to MoveNext + // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) + // so we should be able to just return value here, and we could get rid of the + // complete variable which would be faster + if not state.Started then + notStarted () + elif state.Complete then + alreadyFinished () + else + state.Current + + { new IEnumerator<'T> with member __.Dispose () = () - member __.Current = - // according to IEnumerator.Current documentation, the result of of Current - // is undefined prior to the first call of MoveNext and post called to MoveNext - // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) - // so we should be able to just return value here, and we could get rid of the - // complete variable which would be faster - if not state.Started then notStarted () - elif state.Complete then alreadyFinished () - else state.Current + member __.Current = current () - member this.Current = - box this.Current + interface IEnumerator with + member __.Current = box (current ()) member __.Reset () = state.Started <- false @@ -6545,46 +6550,57 @@ namespace Microsoft.FSharp.Core else let next = state.Current + step if (step > LanguagePrimitives.GenericZero && next > state.Current && next <= m) - || (step < LanguagePrimitives.GenericZero && next < state.Current && next >= m) - then + || (step < LanguagePrimitives.GenericZero && next < state.Current && next >= m) then state.Current <- next else state.Complete <- true - not state.Complete } + not state.Complete} + + { new IEnumerable<'T> with + member __.GetEnumerator () = variableStepRangeEnumerator () - { new System.Collections.Generic.IEnumerable<'a> with - member __. GetEnumerator () = variableStepRangeEnumerator () - member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } + interface IEnumerable with + member this.GetEnumerator () = (variableStepRangeEnumerator ()) :> IEnumerator } let inline simpleIntegralRange minValue maxValue n step m = - if step <> LanguagePrimitives.GenericOne || n > m || n = minValue || m = maxValue - then variableStepIntegralRange n step m + if step <> LanguagePrimitives.GenericOne || n > m || n = minValue || m = maxValue then + variableStepIntegralRange n step m else // a constrained, common simple iterator that is fast. let singleStepRangeEnumerator () = - let mutable value : 'a = n - LanguagePrimitives.GenericOne - { new System.Collections.Generic.IEnumerator<'a> with + let value : Ref<'T> = ref (n - LanguagePrimitives.GenericOne) + + let inline current () = + // according to IEnumerator.Current documentation, the result of of Current + // is undefined prior to the first call of MoveNext and post called to MoveNext + // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) + // so we should be able to just return value here, which would be faster + if !value < n then + notStarted () + elif !value > m then + alreadyFinished () + else + !value + + { new IEnumerator<'T> with member __.Dispose () = () - member __.Current = - // according to IEnumerator.Current documentation, the result of of Current - // is undefined prior to the first call of MoveNext and post called to MoveNext - // that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx) - // so we should be able to just return value here, which would be faster - if value < n then notStarted () - elif value > m then alreadyFinished () - else value - member this.Current = box this.Current - member __.Reset () = value <- n - LanguagePrimitives.GenericOne + member __.Current = current () + + interface IEnumerator with + member __.Current = box (current ()) + member __.Reset () = value := n - LanguagePrimitives.GenericOne member __.MoveNext () = - if value < m then - value <- value + LanguagePrimitives.GenericOne + if !value < m then + value := !value + LanguagePrimitives.GenericOne true else false } - { new System.Collections.Generic.IEnumerable<'a> with - member __. GetEnumerator () = singleStepRangeEnumerator () - member this.GetEnumerator () = this.GetEnumerator () :> System.Collections.IEnumerator } + { new IEnumerable<'T> with + member __.GetEnumerator () = singleStepRangeEnumerator () + + interface IEnumerable with + member __.GetEnumerator () = (singleStepRangeEnumerator ()) :> IEnumerator } // For RangeStepGeneric, zero and add are functions representing the static resolution of GenericZero and (+) // for the particular static type. From 9705db5416c7bc6cfa2cab9805d703563ca2b5cf Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 20 Feb 2016 12:31:16 -0500 Subject: [PATCH 022/334] fixed unit test project file --- .../FSharp.Core.Unittests.fsproj | 2 -- .../ctofiles/MenusAndCommands.cto | Bin 0 -> 4456 bytes 2 files changed, 2 deletions(-) create mode 100644 vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 574b37f8eb3..b7d52ff47ca 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -1,6 +1,4 @@  - - diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto b/vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto new file mode 100644 index 0000000000000000000000000000000000000000..6ae7e514a9ddfa1178a52ec41dfd1bd0cc60d95b GIT binary patch literal 4456 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 a`;u&|FrG4FPehcaQe%Jv|MNWfxBM@zm7vN1 literal 0 HcmV?d00001 From 5ec9f5342d171b81cd05722ed060ca92f352d2e4 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 20 Feb 2016 13:51:48 -0500 Subject: [PATCH 023/334] using FsCheck for basic struct record tests --- .../FSharp.Core/RecordTypes.fs | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index b11fb509011..5d562f28844 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -1,42 +1,42 @@ // Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core +module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes open System open System.Numerics open FSharp.Core.Unittests.LibraryTestFx open NUnit.Framework +open FsCheck +open FsCheck.PropOperators type Record = - { - A: float - B: float + { A: int + B: int } -[] -type UseRecord() = - [] - member this.CanCompare() = - let r1 = { A = 0.; B = 12. } - let r2 = { A = 0.; B = 12. } - Assert.AreEqual(r1, r2) - Assert.AreNotEqual({ r1 with A = 1.}, r2) - Assert.IsTrue((r1 = r2)) - Assert.IsTrue(r1.Equals r2) + +let [] ``can compare records`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + i1 <> i2 ==> + let r1 = { A = i1; B = i2 } + let r2 = { A = i1; B = i2 } + (r1 = r2) |@ "r1 = r2" .&. + ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. + (r1.Equals r2) |@ "r1.Equals r2" [] type StructRecord = - { - C: float - D: float + { C: int + D: int } -[] -type UseStructRecord() = - [] - member this.CanCompare() = - let r1 = { C = 0.; D = 12. } - let r2 = { C = 0.; D = 12. } - Assert.AreEqual(r1, r2) - Assert.AreNotEqual({ r1 with C = 1.}, r2) - Assert.IsTrue((r1 = r2)) - Assert.IsTrue(r1.Equals r2) +let [] ``can compare struct records`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + i1 <> i2 ==> + let sr1 = { C = i1; D = i2 } + let sr2 = { C = i1; D = i2 } + (sr1 = sr2) |@ "sr1 = sr2" .&. + ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. + (sr1.Equals sr2) |@ "sr1.Equals sr2" + From 6a43aa4a3a5ecb3469e0b9ee1b17092c337b99b3 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 20 Feb 2016 14:39:22 -0500 Subject: [PATCH 024/334] basic language feature tests for struct records --- .../FSharp.Core/RecordTypes.fs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 5d562f28844..cbfa18e91b8 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -40,3 +40,54 @@ let [] ``can compare struct records`` () = ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. (sr1.Equals sr2) |@ "sr1.Equals sr2" + +let [] ``pattern matching on struct records`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } + (match sr1 with + | { C = c; D = d } when c = i1 && d = i2 -> true + | _ -> false) + |@ "with pattern match on struct record" .&. + (sr1 |> function + | { C = c; D = d } when c = i1 && d = i2 -> true + | _ -> false) + |@ "function pattern match on struct record" + + +let [] ``let binds using struct records`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } + let { C = c1; D = d2 } as sr2 = sr1 + (sr1 = sr2) |@ "sr1 = sr2" .&. + (c1 = i1 && d2 = i2) |@ "c1 = i1 && d2 = i2" + + +let [] ``function argument bindings using struct records`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } + let test sr1 ({ C = c1; D = d2 } as sr2) = + sr1 = sr2 && c1 = i1 && d2 = i2 + test sr1 sr1 + + +[] +type MutableStructRecord = + { mutable M1: int + mutable M2: int + } + +let [] ``can mutate struct record fields`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) (m1:int) (m2:int) -> + (i1 <> m1 && i2 <> m2) ==> + let mutable sr1 = { M1 = i1; M2 = i2} + sr1.M1 <- m1 + sr1.M2 <- m2 + sr1.M1 = m1 && sr1.M2 = m2 + + + + \ No newline at end of file From 3d58b25d1c2225f271199ce8f9488c0421275caf Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 20 Feb 2016 13:07:12 -0800 Subject: [PATCH 025/334] Fixed inline test --- tests/fsharp/optimize/inline/lib.fs | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/fsharp/optimize/inline/lib.fs b/tests/fsharp/optimize/inline/lib.fs index 71f3c4e1723..5050560b0f7 100644 --- a/tests/fsharp/optimize/inline/lib.fs +++ b/tests/fsharp/optimize/inline/lib.fs @@ -70,23 +70,6 @@ module Vector3GenericObj = let inline test (v1: Vector3Generic) (v2: Vector3Generic) = v1.x -type HiddenRecord = - private { x : int } - member this.X = this.x - -type HiddenUnion = - private A of int | B of string - member this.X = match this with A x -> x | B s -> s.Length - -type internal Foo private () = - static member FooMethod() = () - -[] -do() - -[] -do() - [] [] type Vector3StructRecord = @@ -131,3 +114,20 @@ type Vector3StructRecordGeneric<'T> = module Vector3StructRecordGeneric = let inline dot (v1: Vector3StructRecordGeneric) (v2: Vector3StructRecordGeneric) = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + +type HiddenRecord = + private { x : int } + member this.X = this.x + +type HiddenUnion = + private A of int | B of string + member this.X = match this with A x -> x | B s -> s.Length + +type internal Foo private () = + static member FooMethod() = () + +[] +do() + +[] +do() From 14979fd5c939be69afbf13a6d063fa2d0a1fa0ee Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 20 Feb 2016 16:33:02 -0500 Subject: [PATCH 026/334] basic custom comparison & custom equality test for struct records --- .../FSharp.Core/RecordTypes.fs | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index cbfa18e91b8..df4eff569ab 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -89,5 +89,40 @@ let [] ``can mutate struct record fields`` () = sr1.M1 = m1 && sr1.M2 = m2 +[] +[] +type ComparisonStructRecord = + { C1 :int + C2: int + } + override self.Equals other = + match other with + | :? ComparisonStructRecord as o -> (self.C1 + self.C2) = (o.C1 + o.C2) + | _ -> false + + override self.GetHashCode() = hash self + interface IComparable with + member self.CompareTo other = + match other with + | :? ComparisonStructRecord as o -> compare (self.C1 + self.C2) (o.C1 + o.C2) + | _ -> invalidArg "other" "cannot compare values of different types" - \ No newline at end of file + +let [] ``struct records support [CustomEquality>]`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = i1; C2 = i2 } + (sr1.Equals sr2) + + +let [] ``struct records support []`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) (k1:int) (k2:int) -> + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = k1; C2 = k2 } + if sr1 > sr2 then compare sr1 sr2 = 1 + elif sr1 < sr2 then compare sr1 sr2 = -1 + elif sr1 = sr2 then compare sr1 sr2 = 0 + else false + \ No newline at end of file From 63535043b2670312ce1c789d2314627ae3b25970 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 20 Feb 2016 14:10:09 -0800 Subject: [PATCH 027/334] Added [] and Unchecked.defaultof tests --- .../FSharp.Core/RecordTypes.fs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index cbfa18e91b8..262693bba16 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -88,6 +88,58 @@ let [] ``can mutate struct record fields`` () = sr1.M2 <- m2 sr1.M1 = m1 && sr1.M2 = m2 +[] +type StructRecordDefaultValue = + { [] R1: Record + R2: StructRecord + } + +let [] ``correct behaviour with a [] on a ref type field of a struct record`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let s = { C = i1; D = i2 } + let r1 = + { + R2 = s + } + + (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. + (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" + +[] +type StructRecordDefaultValue2 = + { R1: Record + [] R2: StructRecord + } + +let [] ``correct behaviour with a [] on a value type field of a struct record`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let r = { A = i1; B = i2 } + let r1 = + { + R1 = r + } + + (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. + (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" + +let [] ``correct behaviour for Unchecked.defaultof on a struct record`` () = + let x1 = { C = 0; D = 0 } + let x2 : StructRecordDefaultValue = { R2 = { C = 0; D = 0 } } + let x3 : StructRecordDefaultValue2 = { R1 = Unchecked.defaultof } + + let y1 = Unchecked.defaultof + let y2 = Unchecked.defaultof + let y3 = Unchecked.defaultof + + Assert.IsTrue ((x1 = y1)) + Assert.IsTrue (( (obj.ReferenceEquals (x2.R1, null)) = (obj.ReferenceEquals (y2.R1, null)) )) + Assert.IsTrue ((x2.R2 = x1 )) + Assert.IsTrue ((y2.R2 = x1 )) + Assert.IsTrue (( (obj.ReferenceEquals (x3.R1, null)) = (obj.ReferenceEquals (y3.R1, null)) )) + Assert.IsTrue ((x3.R2 = x1 )) + Assert.IsTrue ((y3.R2 = x1 )) \ No newline at end of file From 34f3bd80e985ea59871b778ddb8caf4dc0258ebb Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 20 Feb 2016 14:12:46 -0800 Subject: [PATCH 028/334] Quick minor format fix --- .../FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 14555f75029..50ca1181f08 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -136,12 +136,12 @@ let [] ``correct behaviour for Unchecked.defaultof on a struct record`` () Assert.IsTrue ((x1 = y1)) Assert.IsTrue (( (obj.ReferenceEquals (x2.R1, null)) = (obj.ReferenceEquals (y2.R1, null)) )) - Assert.IsTrue ((x2.R2 = x1 )) - Assert.IsTrue ((y2.R2 = x1 )) + Assert.IsTrue ((x2.R2 = x1)) + Assert.IsTrue ((y2.R2 = x1)) Assert.IsTrue (( (obj.ReferenceEquals (x3.R1, null)) = (obj.ReferenceEquals (y3.R1, null)) )) - Assert.IsTrue ((x3.R2 = x1 )) - Assert.IsTrue ((y3.R2 = x1 )) + Assert.IsTrue ((x3.R2 = x1)) + Assert.IsTrue ((y3.R2 = x1)) [] [] From 75abc40de3da10a7f3e652f78568a07a6180cad5 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 20 Feb 2016 17:49:42 -0500 Subject: [PATCH 029/334] minor formatting and spelling fixes --- .../FSharp.Core/RecordTypes.fs | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 50ca1181f08..a659eed4c95 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -24,12 +24,14 @@ let [] ``can compare records`` () = ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. (r1.Equals r2) |@ "r1.Equals r2" + [] type StructRecord = { C: int D: int } + let [] ``can compare struct records`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> @@ -79,6 +81,7 @@ type MutableStructRecord = mutable M2: int } + let [] ``can mutate struct record fields`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) (m1:int) (m2:int) -> @@ -90,40 +93,37 @@ let [] ``can mutate struct record fields`` () = [] type StructRecordDefaultValue = - { [] R1: Record + { [] + R1: Record R2: StructRecord } + let [] ``correct behaviour with a [] on a ref type field of a struct record`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let s = { C = i1; D = i2 } - let r1 = - { - R2 = s - } - + let r1 = { R2 = s } (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" [] type StructRecordDefaultValue2 = { R1: Record - [] R2: StructRecord + [] + R2: StructRecord } + let [] ``correct behaviour with a [] on a value type field of a struct record`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let r = { A = i1; B = i2 } - let r1 = - { - R1 = r - } - + let r1 = { R1 = r } (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" + let [] ``correct behaviour for Unchecked.defaultof on a struct record`` () = let x1 = { C = 0; D = 0 } let x2 : StructRecordDefaultValue = { R2 = { C = 0; D = 0 } } @@ -143,6 +143,7 @@ let [] ``correct behaviour for Unchecked.defaultof on a struct record`` () Assert.IsTrue ((x3.R2 = x1)) Assert.IsTrue ((y3.R2 = x1)) + [] [] type ComparisonStructRecord = @@ -162,7 +163,7 @@ type ComparisonStructRecord = | _ -> invalidArg "other" "cannot compare values of different types" -let [] ``struct records support [CustomEquality>]`` () = +let [] ``struct records support []`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let sr1 = { C1 = i1; C2 = i2 } From b9c01ad8da4e34a71f391db7ea394ac22eed944d Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sat, 27 Feb 2016 23:55:22 -0500 Subject: [PATCH 030/334] attribute metadata and struct layout tests also renamed test functions so they all start with "struct records" --- .../FSharp.Core/RecordTypes.fs | 121 +++++++++++++----- 1 file changed, 91 insertions(+), 30 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index a659eed4c95..bc5bab88977 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -1,9 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes +#nowarn "9" + open System -open System.Numerics -open FSharp.Core.Unittests.LibraryTestFx +open System.Runtime.InteropServices open NUnit.Framework open FsCheck open FsCheck.PropOperators @@ -18,11 +19,11 @@ let [] ``can compare records`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> i1 <> i2 ==> - let r1 = { A = i1; B = i2 } - let r2 = { A = i1; B = i2 } - (r1 = r2) |@ "r1 = r2" .&. - ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. - (r1.Equals r2) |@ "r1.Equals r2" + let r1 = { A = i1; B = i2 } + let r2 = { A = i1; B = i2 } + (r1 = r2) |@ "r1 = r2" .&. + ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. + (r1.Equals r2) |@ "r1.Equals r2" [] @@ -32,18 +33,22 @@ type StructRecord = } -let [] ``can compare struct records`` () = +let [] ``struct records hold [] metadata`` () = + Assert.IsTrue (typeof.IsDefined (typeof, false)) + + +let [] ``struct records are comparable`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> i1 <> i2 ==> - let sr1 = { C = i1; D = i2 } - let sr2 = { C = i1; D = i2 } - (sr1 = sr2) |@ "sr1 = sr2" .&. - ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. - (sr1.Equals sr2) |@ "sr1.Equals sr2" + let sr1 = { C = i1; D = i2 } + let sr2 = { C = i1; D = i2 } + (sr1 = sr2) |@ "sr1 = sr2" .&. + ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. + (sr1.Equals sr2) |@ "sr1.Equals sr2" -let [] ``pattern matching on struct records`` () = +let [] ``struct records support pattern matching`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let sr1 = { C = i1; D = i2 } @@ -57,7 +62,7 @@ let [] ``pattern matching on struct records`` () = |@ "function pattern match on struct record" -let [] ``let binds using struct records`` () = +let [] ``struct records support let binds using `` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let sr1 = { C = i1; D = i2 } @@ -66,7 +71,7 @@ let [] ``let binds using struct records`` () = (c1 = i1 && d2 = i2) |@ "c1 = i1 && d2 = i2" -let [] ``function argument bindings using struct records`` () = +let [] ``struct records support function argument bindings`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) -> let sr1 = { C = i1; D = i2 } @@ -82,7 +87,7 @@ type MutableStructRecord = } -let [] ``can mutate struct record fields`` () = +let [] ``struct recrods fields can be mutated`` () = Check.QuickThrowOnFailure <| fun (i1:int) (i2:int) (m1:int) (m2:int) -> (i1 <> m1 && i2 <> m2) ==> @@ -91,6 +96,7 @@ let [] ``can mutate struct record fields`` () = sr1.M2 <- m2 sr1.M1 = m1 && sr1.M2 = m2 + [] type StructRecordDefaultValue = { [] @@ -99,13 +105,14 @@ type StructRecordDefaultValue = } -let [] ``correct behaviour with a [] on a ref type field of a struct record`` () = +let [] ``struct records have correct behaviour with a [] on a ref type field`` () = Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let s = { C = i1; D = i2 } - let r1 = { R2 = s } - (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. - (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" + fun (i1:int) (i2:int) -> + let s = { C = i1; D = i2 } + let r1 = { R2 = s } + (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. + (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" + [] type StructRecordDefaultValue2 = @@ -115,16 +122,16 @@ type StructRecordDefaultValue2 = } -let [] ``correct behaviour with a [] on a value type field of a struct record`` () = +let [] ``struct records have correct behaviour with a [] on a value type field`` () = Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let r = { A = i1; B = i2 } - let r1 = { R1 = r } - (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. - (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" + fun (i1:int) (i2:int) -> + let r = { A = i1; B = i2 } + let r1 = { R1 = r } + (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. + (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" -let [] ``correct behaviour for Unchecked.defaultof on a struct record`` () = +let [] ``struct records exhibit correct behaviour for Unchecked.defaultof`` () = let x1 = { C = 0; D = 0 } let x2 : StructRecordDefaultValue = { R2 = { C = 0; D = 0 } } let x3 : StructRecordDefaultValue2 = { R1 = Unchecked.defaultof } @@ -180,3 +187,57 @@ let [] ``struct records support []`` () = elif sr1 < sr2 then compare sr1 sr2 = -1 elif sr1 = sr2 then compare sr1 sr2 = 0 else false + + +let [] ``struct records hold [] [] metadata`` () = + Assert.IsTrue (typeof.IsDefined (typeof, false)) + Assert.IsTrue (typeof.IsDefined (typeof, false)) + + +[] +[] +type NoComparisonStructRecord = + { N1 : int + N2 : int + } + + +let [] ``struct records hold [] [] metadata`` () = + Assert.IsTrue (typeof.IsDefined (typeof, false)) + Assert.IsTrue (typeof.IsDefined (typeof, false)) + + +[] +[] +type ExplicitLayoutStructRecord = + { [] mutable Z : int + [] mutable Y : int + [] mutable X : int + } + + +let [] ``struct records layout mutable fields correctly with [] and []`` () = + let checkOffset fieldName offset = + offset = int (Marshal.OffsetOf (typeof, fieldName)) + Assert.IsTrue (checkOffset "X@" 0) + Assert.IsTrue (checkOffset "Y@" 4) + Assert.IsTrue (checkOffset "Z@" 8) + + +[] +[] +type SequentialLayoutStructRecord = + { mutable First : int + mutable Second : float + mutable Third : decimal + mutable Fourth : int + } + +let [] ``struct records layout mutable fields in order with []`` () = + let compareOffsets field1 fn field2 = + fn (Marshal.OffsetOf (typeof, field1)) + (Marshal.OffsetOf (typeof, field2)) + Assert.IsTrue (compareOffsets "First@" (<) "Second@") + Assert.IsTrue (compareOffsets "Second@" (<) "Third@") + Assert.IsTrue (compareOffsets "Third@" (<) "Fourth@") + \ No newline at end of file From b149046ebf086c6f2d6fbf78a406d1d7f8e9bc65 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 02:13:40 -0500 Subject: [PATCH 031/334] more field order/layout tests --- .../FSharp.Core/RecordTypes.fs | 74 ++++++++++++++++--- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index bc5bab88977..ffeb7d0c477 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -110,8 +110,8 @@ let [] ``struct records have correct behaviour with a [] on fun (i1:int) (i2:int) -> let s = { C = i1; D = i2 } let r1 = { R2 = s } - (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. - (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" + (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. + (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" [] @@ -127,8 +127,8 @@ let [] ``struct records have correct behaviour with a [] on fun (i1:int) (i2:int) -> let r = { A = i1; B = i2 } let r1 = { R1 = r } - (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. - (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" + (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. + (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" let [] ``struct records exhibit correct behaviour for Unchecked.defaultof`` () = @@ -210,33 +210,89 @@ let [] ``struct records hold [] [] metadata`` () [] [] type ExplicitLayoutStructRecord = + { [] Z : int + [] Y : int + [] X : int + } + + +let [] ``struct records offset fields correctly with [] and []`` () = + let checkOffset fieldName offset = + offset = int (Marshal.OffsetOf (typeof, fieldName)) + Assert.IsTrue (checkOffset "X@" 0) + Assert.IsTrue (checkOffset "Y@" 4) + Assert.IsTrue (checkOffset "Z@" 8) + + +[] +[] +type ExplicitLayoutMutableStructRecord = { [] mutable Z : int [] mutable Y : int [] mutable X : int } -let [] ``struct records layout mutable fields correctly with [] and []`` () = +let [] ``struct records offset mutable fields correctly with [] and []`` () = let checkOffset fieldName offset = - offset = int (Marshal.OffsetOf (typeof, fieldName)) + offset = int (Marshal.OffsetOf (typeof, fieldName)) Assert.IsTrue (checkOffset "X@" 0) Assert.IsTrue (checkOffset "Y@" 4) Assert.IsTrue (checkOffset "Z@" 8) +[] +type DefaultLayoutStructRecord = + { First : int + Second : float + Third : decimal + Fourth : int + } + + [] [] type SequentialLayoutStructRecord = + { First : int + Second : float + Third : decimal + Fourth : int + } + + +let [] ``struct records order fields correctly with []`` () = + let compareOffsets field1 fn field2 = + fn (Marshal.OffsetOf (typeof, field1)) + (Marshal.OffsetOf (typeof, field2)) + Assert.IsTrue (compareOffsets "First@" (<) "Second@") + Assert.IsTrue (compareOffsets "Second@" (<) "Third@") + Assert.IsTrue (compareOffsets "Third@" (<) "Fourth@") + + +let [] ``struct records default field order matches []`` () = + let compareOffsets field1 fn field2 = + fn (Marshal.OffsetOf (typeof, field1)) + (Marshal.OffsetOf (typeof, field2)) + Assert.IsTrue (compareOffsets "First@" (=) "First@") + Assert.IsTrue (compareOffsets "Second@" (=) "Second@") + Assert.IsTrue (compareOffsets "Third@" (=) "Third@") + Assert.IsTrue (compareOffsets "Fourth@" (=) "Fourth@") + + +[] +[] +type SequentialLayoutMutableStructRecord = { mutable First : int mutable Second : float mutable Third : decimal mutable Fourth : int } -let [] ``struct records layout mutable fields in order with []`` () = + +let [] ``struct records order mutable field correctly with []`` () = let compareOffsets field1 fn field2 = - fn (Marshal.OffsetOf (typeof, field1)) - (Marshal.OffsetOf (typeof, field2)) + fn (Marshal.OffsetOf (typeof, field1)) + (Marshal.OffsetOf (typeof, field2)) Assert.IsTrue (compareOffsets "First@" (<) "Second@") Assert.IsTrue (compareOffsets "Second@" (<) "Third@") Assert.IsTrue (compareOffsets "Third@" (<) "Fourth@") From dba550fae5108236a2f344285f79b724225412e7 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 02:33:07 -0500 Subject: [PATCH 032/334] stop using FsCheck for Struct Record tests --- .../FSharp.Core/RecordTypes.fs | 116 ++++++++---------- 1 file changed, 51 insertions(+), 65 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index ffeb7d0c477..38d24139daa 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -6,8 +6,6 @@ module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes open System open System.Runtime.InteropServices open NUnit.Framework -open FsCheck -open FsCheck.PropOperators type Record = { A: int @@ -16,14 +14,12 @@ type Record = let [] ``can compare records`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - i1 <> i2 ==> - let r1 = { A = i1; B = i2 } - let r2 = { A = i1; B = i2 } - (r1 = r2) |@ "r1 = r2" .&. - ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. - (r1.Equals r2) |@ "r1.Equals r2" + let i1, i2 = 0, 4 + let r1 = { A = i1; B = i2 } + let r2 = { A = i1; B = i2 } + Assert.IsTrue ((r1 = r2)) + Assert.IsTrue ({ r1 with A = r1.B} <> r2) + Assert.IsTrue (r1.Equals r2) [] @@ -38,46 +34,41 @@ let [] ``struct records hold [] metadata`` () = let [] ``struct records are comparable`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - i1 <> i2 ==> - let sr1 = { C = i1; D = i2 } - let sr2 = { C = i1; D = i2 } - (sr1 = sr2) |@ "sr1 = sr2" .&. - ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. - (sr1.Equals sr2) |@ "sr1.Equals sr2" + let i1, i2 = 0, 4 + let sr1 = { C = i1; D = i2 } + let sr2 = { C = i1; D = i2 } + Assert.IsTrue ((sr1 = sr2)) + Assert.IsTrue ({ sr1 with C = sr1.D} <> sr2) + Assert.IsTrue (sr1.Equals sr2) let [] ``struct records support pattern matching`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let sr1 = { C = i1; D = i2 } + let i1, i2 = 0, 4 + let sr1 = { C = i1; D = i2 } + Assert.IsTrue (match sr1 with | { C = c; D = d } when c = i1 && d = i2 -> true | _ -> false) - |@ "with pattern match on struct record" .&. + Assert.IsTrue (sr1 |> function | { C = c; D = d } when c = i1 && d = i2 -> true | _ -> false) - |@ "function pattern match on struct record" let [] ``struct records support let binds using `` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let sr1 = { C = i1; D = i2 } - let { C = c1; D = d2 } as sr2 = sr1 - (sr1 = sr2) |@ "sr1 = sr2" .&. - (c1 = i1 && d2 = i2) |@ "c1 = i1 && d2 = i2" + let i1, i2 = 0, 4 + let sr1 = { C = i1; D = i2 } + let { C = c1; D = d2 } as sr2 = sr1 + Assert.IsTrue((sr1 = sr2)) + Assert.IsTrue(c1 = i1 && d2 = i2) let [] ``struct records support function argument bindings`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let sr1 = { C = i1; D = i2 } - let test sr1 ({ C = c1; D = d2 } as sr2) = - sr1 = sr2 && c1 = i1 && d2 = i2 - test sr1 sr1 + let i1, i2 = 0, 4 + let sr1 = { C = i1; D = i2 } + let test sr1 ({ C = c1; D = d2 } as sr2) = + sr1 = sr2 && c1 = i1 && d2 = i2 + Assert.IsTrue (test sr1 sr1) [] @@ -88,13 +79,11 @@ type MutableStructRecord = let [] ``struct recrods fields can be mutated`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) (m1:int) (m2:int) -> - (i1 <> m1 && i2 <> m2) ==> - let mutable sr1 = { M1 = i1; M2 = i2} - sr1.M1 <- m1 - sr1.M2 <- m2 - sr1.M1 = m1 && sr1.M2 = m2 + let i1,i2,m1,m2 = 0,2,4,8 + let mutable sr1 = { M1 = i1; M2 = i2} + sr1.M1 <- m1 + sr1.M2 <- m2 + Assert.IsTrue (sr1.M1 = m1 && sr1.M2 = m2) [] @@ -106,12 +95,11 @@ type StructRecordDefaultValue = let [] ``struct records have correct behaviour with a [] on a ref type field`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let s = { C = i1; D = i2 } - let r1 = { R2 = s } - (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. - (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" + let i1, i2 = 0, 4 + let s = { C = i1; D = i2 } + let r1 = { R2 = s } + Assert.IsTrue (obj.ReferenceEquals (r1.R1, null)) + Assert.IsTrue (r1.R2 = { C = i1; D = i2 }) [] @@ -123,12 +111,11 @@ type StructRecordDefaultValue2 = let [] ``struct records have correct behaviour with a [] on a value type field`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let r = { A = i1; B = i2 } - let r1 = { R1 = r } - (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. - (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" + let i1, i2 = 0, 4 + let r = { A = i1; B = i2 } + let r1 = { R1 = r } + Assert.IsTrue (r1.R1 = { A = i1; B = i2 }) + Assert.IsTrue (r1.R2 = { C = 0; D = 0 }) let [] ``struct records exhibit correct behaviour for Unchecked.defaultof`` () = @@ -171,22 +158,21 @@ type ComparisonStructRecord = let [] ``struct records support []`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) -> - let sr1 = { C1 = i1; C2 = i2 } - let sr2 = { C1 = i1; C2 = i2 } - (sr1.Equals sr2) + let i1, i2 = 0, 4 + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = i1; C2 = i2 } + Assert.IsTrue (sr1.Equals sr2) let [] ``struct records support []`` () = - Check.QuickThrowOnFailure <| - fun (i1:int) (i2:int) (k1:int) (k2:int) -> - let sr1 = { C1 = i1; C2 = i2 } - let sr2 = { C1 = k1; C2 = k2 } - if sr1 > sr2 then compare sr1 sr2 = 1 + let i1,i2,k1,k2 = 0,2,4,8 + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = k1; C2 = k2 } + Assert.IsTrue + (if sr1 > sr2 then compare sr1 sr2 = 1 elif sr1 < sr2 then compare sr1 sr2 = -1 elif sr1 = sr2 then compare sr1 sr2 = 0 - else false + else false) let [] ``struct records hold [] [] metadata`` () = From 36f8c0d5646d9ffaee734b5bb069562d6850bffa Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 02:59:32 -0500 Subject: [PATCH 033/334] Revert "stop using FsCheck for Struct Record tests" This reverts commit dba550fae5108236a2f344285f79b724225412e7. --- .../FSharp.Core/RecordTypes.fs | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 38d24139daa..ffeb7d0c477 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -6,6 +6,8 @@ module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes open System open System.Runtime.InteropServices open NUnit.Framework +open FsCheck +open FsCheck.PropOperators type Record = { A: int @@ -14,12 +16,14 @@ type Record = let [] ``can compare records`` () = - let i1, i2 = 0, 4 - let r1 = { A = i1; B = i2 } - let r2 = { A = i1; B = i2 } - Assert.IsTrue ((r1 = r2)) - Assert.IsTrue ({ r1 with A = r1.B} <> r2) - Assert.IsTrue (r1.Equals r2) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + i1 <> i2 ==> + let r1 = { A = i1; B = i2 } + let r2 = { A = i1; B = i2 } + (r1 = r2) |@ "r1 = r2" .&. + ({ r1 with A = r1.B} <> r2) |@ "{r1 with A = r1.B} <> r2" .&. + (r1.Equals r2) |@ "r1.Equals r2" [] @@ -34,41 +38,46 @@ let [] ``struct records hold [] metadata`` () = let [] ``struct records are comparable`` () = - let i1, i2 = 0, 4 - let sr1 = { C = i1; D = i2 } - let sr2 = { C = i1; D = i2 } - Assert.IsTrue ((sr1 = sr2)) - Assert.IsTrue ({ sr1 with C = sr1.D} <> sr2) - Assert.IsTrue (sr1.Equals sr2) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + i1 <> i2 ==> + let sr1 = { C = i1; D = i2 } + let sr2 = { C = i1; D = i2 } + (sr1 = sr2) |@ "sr1 = sr2" .&. + ({ sr1 with C = sr1.D} <> sr2) |@ "{sr1 with C = sr1.D} <> sr2" .&. + (sr1.Equals sr2) |@ "sr1.Equals sr2" let [] ``struct records support pattern matching`` () = - let i1, i2 = 0, 4 - let sr1 = { C = i1; D = i2 } - Assert.IsTrue + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } (match sr1 with | { C = c; D = d } when c = i1 && d = i2 -> true | _ -> false) - Assert.IsTrue + |@ "with pattern match on struct record" .&. (sr1 |> function | { C = c; D = d } when c = i1 && d = i2 -> true | _ -> false) + |@ "function pattern match on struct record" let [] ``struct records support let binds using `` () = - let i1, i2 = 0, 4 - let sr1 = { C = i1; D = i2 } - let { C = c1; D = d2 } as sr2 = sr1 - Assert.IsTrue((sr1 = sr2)) - Assert.IsTrue(c1 = i1 && d2 = i2) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } + let { C = c1; D = d2 } as sr2 = sr1 + (sr1 = sr2) |@ "sr1 = sr2" .&. + (c1 = i1 && d2 = i2) |@ "c1 = i1 && d2 = i2" let [] ``struct records support function argument bindings`` () = - let i1, i2 = 0, 4 - let sr1 = { C = i1; D = i2 } - let test sr1 ({ C = c1; D = d2 } as sr2) = - sr1 = sr2 && c1 = i1 && d2 = i2 - Assert.IsTrue (test sr1 sr1) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C = i1; D = i2 } + let test sr1 ({ C = c1; D = d2 } as sr2) = + sr1 = sr2 && c1 = i1 && d2 = i2 + test sr1 sr1 [] @@ -79,11 +88,13 @@ type MutableStructRecord = let [] ``struct recrods fields can be mutated`` () = - let i1,i2,m1,m2 = 0,2,4,8 - let mutable sr1 = { M1 = i1; M2 = i2} - sr1.M1 <- m1 - sr1.M2 <- m2 - Assert.IsTrue (sr1.M1 = m1 && sr1.M2 = m2) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) (m1:int) (m2:int) -> + (i1 <> m1 && i2 <> m2) ==> + let mutable sr1 = { M1 = i1; M2 = i2} + sr1.M1 <- m1 + sr1.M2 <- m2 + sr1.M1 = m1 && sr1.M2 = m2 [] @@ -95,11 +106,12 @@ type StructRecordDefaultValue = let [] ``struct records have correct behaviour with a [] on a ref type field`` () = - let i1, i2 = 0, 4 - let s = { C = i1; D = i2 } - let r1 = { R2 = s } - Assert.IsTrue (obj.ReferenceEquals (r1.R1, null)) - Assert.IsTrue (r1.R2 = { C = i1; D = i2 }) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let s = { C = i1; D = i2 } + let r1 = { R2 = s } + (obj.ReferenceEquals (r1.R1, null)) |@ "r1.R1 is null" .&. + (r1.R2 = { C = i1; D = i2 }) |@ "r1.R2 = { C = i1; D = i2 }" [] @@ -111,11 +123,12 @@ type StructRecordDefaultValue2 = let [] ``struct records have correct behaviour with a [] on a value type field`` () = - let i1, i2 = 0, 4 - let r = { A = i1; B = i2 } - let r1 = { R1 = r } - Assert.IsTrue (r1.R1 = { A = i1; B = i2 }) - Assert.IsTrue (r1.R2 = { C = 0; D = 0 }) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let r = { A = i1; B = i2 } + let r1 = { R1 = r } + (r1.R1 = { A = i1; B = i2 }) |@ "r1.R1 = { A = i1; B = i2 }" .&. + (r1.R2 = { C = 0; D = 0 }) |@ "r1.R2 = { C = 0; D = 0 }" let [] ``struct records exhibit correct behaviour for Unchecked.defaultof`` () = @@ -158,21 +171,22 @@ type ComparisonStructRecord = let [] ``struct records support []`` () = - let i1, i2 = 0, 4 - let sr1 = { C1 = i1; C2 = i2 } - let sr2 = { C1 = i1; C2 = i2 } - Assert.IsTrue (sr1.Equals sr2) + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = i1; C2 = i2 } + (sr1.Equals sr2) let [] ``struct records support []`` () = - let i1,i2,k1,k2 = 0,2,4,8 - let sr1 = { C1 = i1; C2 = i2 } - let sr2 = { C1 = k1; C2 = k2 } - Assert.IsTrue - (if sr1 > sr2 then compare sr1 sr2 = 1 + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) (k1:int) (k2:int) -> + let sr1 = { C1 = i1; C2 = i2 } + let sr2 = { C1 = k1; C2 = k2 } + if sr1 > sr2 then compare sr1 sr2 = 1 elif sr1 < sr2 then compare sr1 sr2 = -1 elif sr1 = sr2 then compare sr1 sr2 = 0 - else false) + else false let [] ``struct records hold [] [] metadata`` () = From 93f96310fe855e7073afeaeef7b4d809a1485233 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 03:00:31 -0500 Subject: [PATCH 034/334] don't run RecordType tests on portable framework --- src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index b7d52ff47ca..ed1cd585567 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -100,7 +100,7 @@ - + From 3c287b0548a1311ed88b4d2cd2908f3be9fb4d0e Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 04:12:57 -0500 Subject: [PATCH 035/334] use TypeInfo to check attributes instead of IsDefined `IsDefined` is not supported on portable Profile7 --- .../FSharp.Core/RecordTypes.fs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index ffeb7d0c477..93625ed9244 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -4,6 +4,7 @@ module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes #nowarn "9" open System +open System.Reflection open System.Runtime.InteropServices open NUnit.Framework open FsCheck @@ -32,9 +33,12 @@ type StructRecord = D: int } +let private hasAttribute<'T,'Attr>() = + typeof<'T>.GetTypeInfo().GetCustomAttributes() |> Seq.exists (fun x -> x.GetType() = typeof<'Attr>) + let [] ``struct records hold [] metadata`` () = - Assert.IsTrue (typeof.IsDefined (typeof, false)) + Assert.IsTrue (hasAttribute()) let [] ``struct records are comparable`` () = @@ -190,8 +194,8 @@ let [] ``struct records support []`` () = let [] ``struct records hold [] [] metadata`` () = - Assert.IsTrue (typeof.IsDefined (typeof, false)) - Assert.IsTrue (typeof.IsDefined (typeof, false)) + Assert.IsTrue (hasAttribute()) + Assert.IsTrue (hasAttribute()) [] @@ -203,8 +207,8 @@ type NoComparisonStructRecord = let [] ``struct records hold [] [] metadata`` () = - Assert.IsTrue (typeof.IsDefined (typeof, false)) - Assert.IsTrue (typeof.IsDefined (typeof, false)) + Assert.IsTrue (hasAttribute()) + Assert.IsTrue (hasAttribute()) [] From a4173ae7b76e526559398d2f044432de8b9e039d Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 04:31:05 -0500 Subject: [PATCH 036/334] don't run RecordTypes tests on portable78 profile does not support `Marshal` --- src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index ed1cd585567..50020f93624 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -100,7 +100,7 @@ - + From c280892e9e34979e8aec65ea8cdd2bd029beb748 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 28 Feb 2016 04:58:56 -0500 Subject: [PATCH 037/334] don't run RecordTypes tests on portable259 profile does not support `Marshal` --- src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 50020f93624..1c26640b428 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -100,7 +100,7 @@ - + From 187497b298ba6f4adb7c9c8b7ce1c8f511e3908a Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 28 Feb 2016 12:38:12 -0800 Subject: [PATCH 038/334] Create record-based copy of MarshalStruct p/invoke test --- .../MarshalStruct01_Records.fs | 103 ++++++++++++++++++ .../P-invokeDeclarations/env.lst | 1 + 2 files changed, 104 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/MarshalStruct01_Records.fs diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/MarshalStruct01_Records.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/MarshalStruct01_Records.fs new file mode 100644 index 00000000000..54cf892f4b3 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/MarshalStruct01_Records.fs @@ -0,0 +1,103 @@ +// #Conformance #DeclarationElements #PInvoke +#light + +// copy of MarshalStruct01 test, but with struct records instead of standard structs +// Sanity check marshalling struct records via PInvoke +// Specifically, the [StructLayout] attribute. + +open System.Runtime.InteropServices; + +// Define a Point using the sequential layout +[] +[] +type SequentialPoint = + { + X : int + Y : int + } + +// Define the same point structre but using an explicit layout +[] +[] +type ExplicitPoint = + // Randomize elements, the end result is: + // [X1, X1][X2, X2][Y1][Y2][Y3][Y4] + { + + [] + Y1 : byte + [] + Y4 : byte + [] + X2 : int16 + [] + Y2 : byte + [] + Y3 : byte + [] + X1 : int16 + } + +// Define a rectangle struct explicitly +[] +[] +type ExplicitRect = + { + [] + mutable left : int + [] + mutable top : int + [] + mutable right : int + [] + mutable bottom : int + } + +// Define the PInvoke signatures, one taking the ExplicitPoint the other taking the SequentialPoint +[] +extern bool PointInRect_Explicit_Explicit(ExplicitRect&, ExplicitPoint); + + +[] +extern bool PointInRect_Explicit_Sequential(ExplicitRect& rect, SequentialPoint pt); + +// The test will attempt to detect two points, A and B, and whether or not they +// exist in the rectangle. +(* + + -15, 10 15, 10 + X---------------------------X + | | B (17, 8) + | | + | A (-1, -1) | + | | + X---------------------------X + -15, -10 15, -10 + +*) + +// Define our points +let seqA = { SequentialPoint.X = -1; Y = -1 } +let seqB = { SequentialPoint.X = 17; Y = 8 } + +// 0xFFFFFF : int16 = -1, 0xFF : byte = -1 if arithmatic is NOT checked +let expA = { ExplicitPoint.X1 = 0xFFFFs; X2 = 0xFFFFs; Y1 = 0xFFuy; Y2 = 0xFFuy; Y3 = 0xFFuy; Y4 = 0xFFuy } +let expB = { ExplicitPoint.X1 = 0s; X2 = 17s; Y1 = 0uy; Y2 = 0uy; Y3 = 0uy; Y4 = 8uy } + +// Define our rectangle +let mutable theRect = { ExplicitRect.left = -15; right = 15; top = -10; bottom = 10 } + +// Test PInvoke! +let seqAResult = PointInRect_Explicit_Sequential(&theRect, seqA) +let expAResult = PointInRect_Explicit_Explicit(&theRect, expA) + +let seqBResult = PointInRect_Explicit_Sequential(&theRect, seqB) +let expBResult = PointInRect_Explicit_Explicit(&theRect, expB) + +if seqAResult <> true then exit 1 +if seqBResult <> false then exit 2 + +if expAResult <> true then exit 3 +if expBResult <> false then exit 4 + +exit 0 diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst index 3e47f5de60a..29658bcf7a9 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst @@ -1,5 +1,6 @@ SOURCE=SanityCheck01.fs # SanityCheck01.fs SOURCE=MarshalStruct01.fs # MarshalStruct01.fs + SOURCE=MarshalStruct01_Records.fs # MarshalStruct01_Records.fs SOURCE=EntryPoint.fs # EntryPoint.fs SOURCE=ComVisible01.fs # ComVisible01.fs From c2992394514395b6c5adf163884f7b3d1c3157a5 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 28 Feb 2016 12:54:25 -0800 Subject: [PATCH 039/334] Create record-based copy of CallingConventions p/invoke test --- .../CallingConventions01_Records.fs | 70 +++++++++++++++++++ .../P-invokeDeclarations/env.lst | 2 + 2 files changed, 72 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/CallingConventions01_Records.fs diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/CallingConventions01_Records.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/CallingConventions01_Records.fs new file mode 100644 index 00000000000..723d978c9b5 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/CallingConventions01_Records.fs @@ -0,0 +1,70 @@ +// #Regression #Conformance #DeclarationElements #PInvoke +// Regression for Dev11:25538, we used to only work with StdCall +// We need to use different C libraries for x64 and x86, hence the ifdefs + +// copy of CallingConventions01 but with record structs + +open System +open System.Runtime.InteropServices + +[] +type ComplexStd = + { + mutable re:double + mutable im:double + } + +module InteropWithNative = +#if AMD64 + [] +#else + [] +#endif + extern IntPtr CreateComplexStd(double, double) + +let test1() = + let addr = InteropWithNative.CreateComplexStd(2.0, 8.0) + let c = Marshal.PtrToStructure(addr, typeof) :?> ComplexStd + if (c.im <> 8.000000 || c.re <> 2.000000) then exit 1 + +[] +type ComplexCDecl = + { + mutable re:double + mutable im:double + } + +module InteropWithNative2 = +#if AMD64 + [] +#else + [] +#endif + extern IntPtr CreateComplexCDecl(double, double) + +let test2() = + let addr2 = InteropWithNative2.CreateComplexCDecl(2.0, 8.0) + let c2 = Marshal.PtrToStructure(addr2, typeof) :?> ComplexCDecl + + if (c2.im <> 8.000000 || c2.re <> 2.000000) then exit 1 + +// This just automatically passes if we're in an invalid config +// ex the x86 case on an x64 machine just doesn't execute the test logic (otherwise we'd get a BadImageFormatException) +if IntPtr.Size = 8 then // we don't use System.Environment.Is64BitOperatingSystem because it is not in NetFx2.0 +#if AMD64 + test1() + test2() +#else + printfn "Did nothing" + () +#endif +else +#if AMD64 + printfn "Did nothing" + () +#else + test1() + test2() +#endif + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst index 29658bcf7a9..b80ddd42e4d 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/P-invokeDeclarations/env.lst @@ -8,4 +8,6 @@ SOURCE=E_DLLImportInTypeDef01.fs SCFLAGS="--test:ErrorRanges" # E_DLLImportInTypeDef01.fs SOURCE=CallingConventions01.fs SCFLAGS="--platform:x86" PLATFORM=x86 # CallingConventions01.fs - x86 + SOURCE=CallingConventions01_Records.fs SCFLAGS="--platform:x86" PLATFORM=x86 # CallingConventions01_Records.fs - x86 SOURCE=CallingConventions01.fs SCFLAGS="--platform:x64 --define:AMD64" PLATFORM=AMD64 # CallingConventions01.fs - x64 + SOURCE=CallingConventions01_Records.fs SCFLAGS="--platform:x64 --define:AMD64" PLATFORM=AMD64 # CallingConventions01_Records.fs - x64 From d5a17ba00eb2ed8ef810ddf40cb6f71f18c2bb77 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 28 Feb 2016 13:53:30 -0800 Subject: [PATCH 040/334] Added test for FSharpValue.MakeRecord using a struct record --- .../FSharp.Core/RecordTypes.fs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 93625ed9244..6b301d8113e 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -300,4 +300,18 @@ let [] ``struct records order mutable field correctly with [] ``can properly construct a struct record using FSharpValue.MakeRecord, and we get the fields by FSharpValue.GetRecordFields`` () = + let structRecord = Microsoft.FSharp.Reflection.FSharpValue.MakeRecord (typeof, [|1234;999|]) + + Assert.IsTrue (structRecord.GetType().IsValueType) + + let fields = Microsoft.FSharp.Reflection.FSharpValue.GetRecordFields structRecord + + let c = (fields.[0] :?> int) + Assert.AreEqual (1234, c) + + let d = (fields.[1] :?> int) + Assert.AreEqual (999, d) + \ No newline at end of file From edc67542973a455ef1c03644f0ffbad5e07f535d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 28 Feb 2016 13:56:28 -0800 Subject: [PATCH 041/334] Removed bad line in TastPickle --- src/fsharp/TastPickle.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 56d19470b8d..57d5badbdf1 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -2548,4 +2548,4 @@ let unpickleModuleOrNamespace st = u_tycon_spec st let unpickleCcuInfo st = let a,b,c,_space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st - { mspec=a; compileTimeWorkingDir=b; usesQuotations=c } \ No newline at end of file + { mspec=a; compileTimeWorkingDir=b; usesQuotations=c } From 46a3e49b47536a7179b21cc4d6ced17928ae8375 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 28 Feb 2016 14:24:59 -0800 Subject: [PATCH 042/334] A round of cleanup --- src/fsharp/IlxGen.fs | 4 ++-- src/fsharp/TastOps.fs | 20 +++++++++++--------- src/fsharp/TypeChecker.fs | 10 +++++----- src/fsharp/tast.fs | 5 ++++- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 0f601dd17b6..b6f149475c9 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -6098,7 +6098,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TTyconInterface -> ILTypeDefKind.Interface | TTyconEnum -> ILTypeDefKind.Enum | TTyconDelegate _ -> ILTypeDefKind.Delegate - | TRecdRepr _ when tycon.Data.entity_flags.IsStructRecordType -> ILTypeDefKind.ValueType + | TRecdRepr _ when tycon.IsStructRecordTycon -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class let requiresExtraField = @@ -6300,7 +6300,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = relevantFields |> List.map (fun (_,ilFieldName,_,_,_,ilPropType,_,fspec) -> (fspec.Name,ilFieldName,ilPropType)) - let isStructRecord = tycon.Data.entity_flags.IsStructRecordType + let isStructRecord = tycon.IsStructRecordTycon // No type spec if the record is a value type let spec = if isStructRecord then None else Some(cenv.g.ilg.tspec_Object) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 3625c10e9f2..df1f4440a52 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1556,14 +1556,17 @@ let isStructTy g ty = (isAppTy g ty && (tyconOfAppTy g ty).IsStructOrEnumTycon) || isTupleStructTy g ty let isRefTy g ty = - isUnionTy g ty || - (isTupleTy g ty && not (isStructTy g ty)) || - (isRecdTy g ty && not (isStructTy g ty)) || - isILReferenceTy g ty || - isFunTy g ty || - isReprHiddenTy g ty || - isFSharpObjModelRefTy g ty || - isUnitTy g ty + not (isStructTy g ty) && + ( + isUnionTy g ty || + isTupleTy g ty || + isRecdTy g ty || + isILReferenceTy g ty || + isFunTy g ty || + isReprHiddenTy g ty || + isFSharpObjModelRefTy g ty || + isUnitTy g ty + ) // ECMA C# LANGUAGE SPECIFICATION, 27.2 // An unmanaged-type is any type that isn't a reference-type, a type-parameter, or a generic struct-type and @@ -7073,7 +7076,6 @@ let MemberIsCompiledAsInstance g parent isExtensionMember (membInfo:ValMemberInf let isSealedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty not (isRefTy g ty) || - isRecdTy g ty || isUnitTy g ty || isArrayTy g ty || diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index e3a509fdc20..13303cebf86 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13511,8 +13511,8 @@ module EstablishTypeDefinitionCores = begin | k -> if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || - hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || - hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then + hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || + hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(),m)) k @@ -13680,7 +13680,7 @@ module EstablishTypeDefinitionCores = begin InferTyconKind cenv.g (TyconILAssemblyCode,attrs,[],[],inSig,true,m) |> ignore TAsmRepr s - | SynTypeDefnSimpleRepr.Record (_,_,m) -> + | SynTypeDefnSimpleRepr.Record (_,_,m) -> // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind cenv.g (TyconRecord,attrs,[],[],inSig,true,m) |> ignore // Note: the table of record fields is initially empty @@ -14036,7 +14036,7 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None | SynTypeDefnSimpleRepr.Record _ -> - if tycon.Data.entity_flags.IsStructRecordType then Some(cenv.g.system_Value_typ) + if tycon.IsStructRecordTycon then Some(cenv.g.system_Value_typ) else None | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14233,7 +14233,7 @@ module EstablishTypeDefinitionCores = begin writeFakeUnionCtorsToSink unionCases MakeUnionRepr unionCases, None, NoSafeInitInfo - | SynTypeDefnSimpleRepr.Record (_,fields,_) -> + | SynTypeDefnSimpleRepr.Record (_,fields,_) -> noMeasureAttributeCheck() noSealedAttributeCheck FSComp.SR.tcTypesAreAlwaysSealedRecord noAbstractClassAttributeCheck() diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 26563dd9702..57e1c2fbd15 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -771,6 +771,9 @@ type Entity = /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition. member x.IsRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> true | _ -> false + /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition that is a value type. + member x.IsStructRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> x.Data.entity_flags.IsStructRecordType | _ -> false + /// Indicates if this is an F# type definition whose r.h.s. is known to be some kind of F# object model definition member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFsObjModelRepr _ -> true | _ -> false @@ -815,7 +818,7 @@ type Entity = /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition member x.IsFSharpStructOrEnumTycon = match x.TypeReprInfo with - | TRecdRepr _ -> x.Data.entity_flags.IsStructRecordType + | TRecdRepr _ -> x.IsStructRecordTycon | TFsObjModelRepr info -> match info.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> false From d94becf2ca9f116bd081656f99c629e8159c5623 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 28 Feb 2016 20:34:11 -0800 Subject: [PATCH 043/334] Add tests covering ref/struct/null type constraints --- .../CheckingSyntacticTypes/E_NullnessConstraint01.fs | 12 +++++++++++- .../CheckingSyntacticTypes/E_RefConstraint01.fs | 5 +++++ .../CheckingSyntacticTypes/E_StructConstraint01.fs | 5 +++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_NullnessConstraint01.fs b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_NullnessConstraint01.fs index a4ca8279282..eb585a9f56f 100644 --- a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_NullnessConstraint01.fs +++ b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_NullnessConstraint01.fs @@ -1,7 +1,17 @@ // #Regression #Conformance #TypeConstraints -// The type 'int' does not have 'null' as a proper value +// The type 'int' does not have 'null' as a proper value +// The type 'StructRecd' does not have 'null' as a proper value +// The type 'StdRecd' does not have 'null' as a proper value let mkInput<'d when 'd:null>() () = () let r = mkInput() +[] +type StructRecd = { A : float } + +type StdRecd = { B : float } + +let _ = mkInput() +let _ = mkInput() + exit 1 diff --git a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_RefConstraint01.fs b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_RefConstraint01.fs index 78bb5adde3f..bba65fd7e67 100644 --- a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_RefConstraint01.fs +++ b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_RefConstraint01.fs @@ -1,13 +1,18 @@ // #Regression #Conformance #TypeConstraints // Verify error when reference constraint is not satisifed //A generic construct requires that the type 'int' have reference semantics, but it does not, i.e. it is a struct +//A generic construct requires that the type 'StructRecd' have reference semantics, but it does not, i.e. it is a struct let isReference (x : 'a when 'a : not struct) = () +[] +type StructRecd = { X : byte } + // Works do isReference "a string" // Fails do isReference 42 +do isReference { X = 123y } exit 1 diff --git a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_StructConstraint01.fs b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_StructConstraint01.fs index 9c32382442d..cd71018afc2 100644 --- a/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_StructConstraint01.fs +++ b/tests/fsharpqa/Source/Conformance/TypesAndTypeConstraints/CheckingSyntacticTypes/E_StructConstraint01.fs @@ -9,12 +9,17 @@ type S = member this.Value = this.x end +[] +type StructRecord = { X : int } + let isStruct (x : 'a when 'a : struct) = () // Works let s = new S() do isStruct s +do isStruct { X = 99 } + // This also works, System.Int32 is a value type do isStruct 42 From 0d8fa1572409c8470e5b970a567cc1234891a388 Mon Sep 17 00:00:00 2001 From: Jared Hester Date: Sun, 6 Mar 2016 05:10:40 -0500 Subject: [PATCH 044/334] don't run recordtypes on portable7 FSharpValue isn't compatible with the profile --- src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 1c26640b428..e7e3aeffb65 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -100,7 +100,7 @@ - + From 4d205bf88b0ff738821f7bf901606e6d0a6292f0 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 9 Mar 2016 13:59:27 +0000 Subject: [PATCH 045/334] prototype of mutrec --- src/fsharp/TypeChecker.fs | 1020 +++++++++++++++++-------- src/fsharp/ast.fs | 20 +- src/fsharp/pars.fsy | 16 +- src/fsharp/vs/ServiceNavigation.fs | 2 +- src/fsharp/vs/ServiceParseTreeWalk.fs | 4 +- src/fsharp/vs/ServiceUntypedParse.fs | 2 +- 6 files changed, 710 insertions(+), 354 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 96022bb7da0..eaef42c2927 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3770,17 +3770,131 @@ type NormalizedRecBindingDefn = NormalizedRecBindingDefn of ContainerInfo * NewS type TyconBindingDefn = TyconBindingDefn of ContainerInfo * NewSlotsOK * DeclKind * SynMemberDefn * range -type TyconBindingDefns = TyconBindingDefns of TyconRef * Typars * DeclKind * TyconBindingDefn list - -type TyconMemberData = TyconMemberData of DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK - type ValSpecResult = ValSpecResult of ParentRef * ValMemberInfoTransient option * Ident * Typars * Typars * TType * PartialValReprInfo * DeclKind //------------------------------------------------------------------------- // Additional data structures used by checking recursive bindings //------------------------------------------------------------------------- -type RecursiveBindingDefnInfo = RecBindingDefn of ContainerInfo * NewSlotsOK * DeclKind * SynBinding +[] +type MutRecShape<'TypeData, 'LetsData, 'ModuleData> = + | Tycon of 'TypeData + | Lets of 'LetsData + | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData> list + +module MutRecShapes = + let rec map f1 f2 f3 x = + x |> List.map (function + | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 a) + | MutRecShape.Lets b -> MutRecShape.Lets (f2 b) + | MutRecShape.Module (c,d) -> MutRecShape.Module (f3 c, map f1 f2 f3 d)) + + + let mapTycons f1 xs = map f1 id id xs + let mapModules f1 xs = map id id f1 xs + + let rec mapWithEnv f1 f2 (env: 'Env) x = + x |> List.map (function + | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 env a) + | MutRecShape.Lets b -> MutRecShape.Lets (f2 env b) + | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv f1 f2 env2 d)) + + let mapTyconsWithEnv f1 env xs = mapWithEnv f1 (fun _env x -> x) env xs + + let rec mapTyconAndModulesWithParent parent f1 f2 xs = + xs |> List.map (function + | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) + | MutRecShape.Lets b -> MutRecShape.Lets b + | MutRecShape.Module (c,d) -> + let c2, parent2 = f1 parent c + MutRecShape.Module (c2, mapTyconAndModulesWithParent parent2 f1 f2 d)) + + let rec computeEnvs f1 (env: 'Env) xs = + let env = f1 env xs + env, + xs |> List.map (function + | MutRecShape.Tycon a -> MutRecShape.Tycon a + | MutRecShape.Lets b -> MutRecShape.Lets b + | MutRecShape.Module (c,ds) -> + let env2, ds2 = computeEnvs f1 env ds + MutRecShape.Module ((c,env2), ds2)) + + let rec extendEnvs f1 (env: 'Env) xs = + let env = f1 env xs + env, + xs |> List.map (function + | MutRecShape.Module ((c,env),ds) -> + let env2, ds2 = extendEnvs f1 env ds + MutRecShape.Module ((c,env2), ds2) + | x -> x) + + let rec recomputeEnvs f1 (env: 'Env) xs = + let env2, xs2 = xs |> computeEnvs f1 env + env2, xs2 |> mapModules (fun ((data,_oldEnv : 'Env),newEnv) -> (data,newEnv)) + + let rec expandTycons f1 xs = + xs |> List.collect (fun elem -> + match elem with + | MutRecShape.Tycon a -> [elem; MutRecShape.Lets (f1 a)] + | MutRecShape.Lets _ -> [elem] + | MutRecShape.Module (c,d) -> [MutRecShape.Module (c, expandTycons f1 d)]) + + let rec mapFold f1 z xs = + (z,xs) ||> List.mapFold (fun z x -> + match x with + | MutRecShape.Tycon _ -> let x2,z = f1 z x in x2, z + | MutRecShape.Lets _ -> let x2,z = f1 z x in x2, z + | MutRecShape.Module (c,ds) -> let ds2,z = mapFold f1 z ds in MutRecShape.Module (c, ds2),z) + + let rec mapFoldWithEnv f1 z env xs = + (z,xs) ||> List.mapFold (fun z x -> + match x with + | MutRecShape.Tycon _ -> let x2,z = f1 z env x in x2, z + | MutRecShape.Lets _ -> let x2,z = f1 z env x in x2, z + | MutRecShape.Module ((c,env2),ds) -> let ds2,z = mapFoldWithEnv f1 z env2 ds in MutRecShape.Module ((c, env2), ds2),z) + + + let rec collectTycons x = + x |> List.collect (function + | MutRecShape.Tycon a -> [a] + | MutRecShape.Lets _ -> [] + | MutRecShape.Module (_,d) -> collectTycons d) + + let topTycons x = + x |> List.choose (function MutRecShape.Tycon a -> Some a | _ -> None) + + let rec iter f1 f2 f3 x = + x |> List.iter (function + | MutRecShape.Tycon a -> f1 a + | MutRecShape.Lets b -> f2 b + | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 d) + + let iterTycons f1 x = iter f1 ignore ignore x + + let rec iterWithEnv f1 f2 env x = + x |> List.iter (function + | MutRecShape.Tycon a -> f1 env a + | MutRecShape.Lets b -> f2 env b + | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 env d) + + let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) env xs + +type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * DeclKind * SynBinding + + +type MutRecSignatureInitialData = MutRecShape list +type MutRecDefnsInitialData = MutRecShape list + +type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool +type MutRecDefnsPass1Data = MutRecShape list + +type MutRecDefnsPass2DataForTycon = MutRecDefnsPass2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK +type MutRecDefnsPass2DataForModule = MutRecDefnsPass2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace +type MutRecDefnsPass2Data = MutRecShape list + +type MutRecDefnsPass2InfoForTycon = MutRecDefnsPass2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list +type MutRecDefnsPass2Info = MutRecShape list + /// RecursiveBindingInfo - flows through initial steps of TcLetrec type RecursiveBindingInfo = @@ -9497,7 +9611,7 @@ and TcLinearLetExprs bodyChecker cenv env overallTy builder tpenv (processUseBin if isRec then // TcLinearLetExprs processes at most one recursive binding CheckRecursiveBindingIds binds - let binds = List.map (fun x -> RecBindingDefn(ExprContainerInfo,NoNewSlots,ExpressionBinding,x)) binds + let binds = List.map (fun x -> RecDefnBindingInfo(ExprContainerInfo,NoNewSlots,ExpressionBinding,x)) binds if isUse then errorR(Error(FSComp.SR.tcBindingCannotBeUseAndRec(),m)) let binds,envinner,tpenv = TcLetrec ErrorOnOverrides cenv env tpenv (binds,m,m) let bodyExpr,tpenv = bodyChecker overallTy envinner tpenv body @@ -10967,7 +11081,7 @@ and unionGeneralizedTypars typarSets = List.foldBack (ListSet.unionFavourRight t and TcLetrec overridesOK cenv env tpenv (binds,bindsm,scopem) = // Create prelimRecValues for the recursive items (includes type info from LHS of bindings) *) - let binds = binds |> List.map (fun (RecBindingDefn(a,b,c,bind)) -> NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env bind)) + let binds = binds |> List.map (fun (RecDefnBindingInfo(a,b,c,bind)) -> NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env bind)) let uncheckedRecBinds,prelimRecValues,(tpenv,_) = AnalyzeAndMakeRecursiveValues overridesOK cenv env tpenv binds let envRec = AddLocalVals cenv.tcSink scopem prelimRecValues env @@ -11260,7 +11374,7 @@ let TcAndPublishMemberSpec cenv env containerInfo declKind tpenv memb = | SynMemberSig.Member(valSpfn,memberFlags,_) -> TcAndPublishValSpec (cenv,env,containerInfo,declKind,Some memberFlags,tpenv,valSpfn) | SynMemberSig.Interface _ -> - // These are done in TcTyconDefnCores + // These are done in TcTypeDefnCores [],tpenv @@ -12126,7 +12240,7 @@ module TyconBindingChecking = begin open IncrClassChecking /// Represents one element in a type definition, after the first phase - type TyconBindingsPassA = + type TyconBindingPassA = /// An entry corresponding to the definition of the implicit constructor for a class | PassAIncrClassCtor of IncrClassCtorLhs /// An 'inherit' declaration in an incremental class @@ -12149,18 +12263,21 @@ module TyconBindingChecking = begin | PassAIncrClassCtorJustAfterLastLet /// The collected syntactic input definitions for a single type or type-extension definition - type TyconBindingsPassAGroup = TyconBindingsPassAGroup of TcEnv * TyconRef * Typar list * TType * TyconBindingsPassA list + type TyconBindingsPassA = + | TyconBindingsPassA of Tycon option * Val list * TyconRef * Typar list * TType * TyconBindingPassA list + + type MutRecBindingPassA = MutRecShape /// The collected syntactic input definitions for a recursive group of type or type-extension definitions - type TyconBindingsPassAGroups = TyconBindingsPassAGroup list + type MutRecBindingsPassA = MutRecBindingPassA list /// Represents one element in a type definition, after the second phase - type TyconBindingsPassB = + type TyconBindingPassB = | PassBIncrClassCtor of IncrClassCtorLhs * Tast.Binding option | PassBInherit of Expr * Val option /// A set of value of function definitions in a class definition with an implicit consructor. | PassBIncrClassBindings of IncrClassBindingGroup list - | PassBMember of int + | PassBMember of int /// An intermediate definition that represent the point in an implicit class definition where /// the super type has been initialized. | PassBIncrClassCtorJustAfterSuperInit @@ -12169,12 +12286,14 @@ module TyconBindingChecking = begin /// this point. | PassBIncrClassCtorJustAfterLastLet - type TyconBindingsPassBGroup = TyconBindingsPassBGroup of TyconRef * TyconBindingsPassB list + type TyconBindingsPassB = TyconBindingsPassB of Tycon option * TyconRef * TyconBindingPassB list - type TyconBindingsPassBGroups = TyconBindingsPassBGroup list + type MutRecBindingPassB = MutRecShape + + type MutRecBindingsPassB = MutRecBindingPassB list /// Represents one element in a type definition, after the third phase - type TyconBindingsPassC = + type TyconBindingPassC = | PassCIncrClassCtor of IncrClassCtorLhs * Tast.Binding option | PassCInherit of Expr * Val option | PassCIncrClassBindings of IncrClassBindingGroup list @@ -12183,14 +12302,17 @@ module TyconBindingChecking = begin | PassCIncrClassCtorJustAfterSuperInit | PassCIncrClassCtorJustAfterLastLet - type TyconBindingsPassCGroup = TyconBindingsPassCGroup of TyconRef * TyconBindingsPassC list + type TyconBindingsPassC = TyconBindingsPassC of Tycon option * TyconRef * TyconBindingPassC list + + type MutRecBindingPassC = MutRecShape + + type MutRecBindingsPassC = MutRecBindingPassC list - type TyconBindingsPassCGroups = TyconBindingsPassCGroup list // PassA: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // PassA: also processes their arg patterns - collecting type assertions - let TcTyconBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv envInitial tpenv (bindsl : TyconBindingDefns list) = + let TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPass2Info) = // The basic iteration over the declarations in a single type definition // State: @@ -12198,17 +12320,28 @@ module TyconBindingChecking = begin // recBindIdx: index of the recursive binding // prelimRecValuesRev: accumulation of prelim value entries // uncheckedBindsRev: accumulation of unchecked bindings - let defnsAs, (tpenv,_,prelimRecValuesRev,uncheckedBindsRev) = - let initialOuterState = (tpenv, 0, ([]:Val list), ([]: PreCheckingRecursiveBinding list)) - (initialOuterState, bindsl) ||> List.mapFold (fun outerState defns -> - - let (TyconBindingDefns(tcref, declaredTyconTypars, declKind, binds)) = defns - let (tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) = outerState + let (defnsAs: MutRecBindingsPassA), (tpenv,_,uncheckedBindsRev) = + let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) + (initialOuterState, envMutRec, mutRecDecls) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDefns defns -> + let (tpenv,recBindIdx,uncheckedBindsRev) = outerState + match defns with + | MutRecShape.Module _ -> failwith "unreachable" + | MutRecShape.Lets recBinds -> + let normRecDefns = + [ for (RecDefnBindingInfo(a,b,c,bind)) in recBinds do + yield NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForDefns bind) ] + let bindsAndValues,(tpenv,recBindIdx) = ((tpenv,recBindIdx), normRecDefns) ||> List.mapFold (AnalyzeAndMakeRecursiveValue ErrorOnOverrides false cenv envForDefns) + let binds = bindsAndValues |> List.map fst |> List.concat + + let defnAs = MutRecShape.Lets binds + defnAs,(tpenv,recBindIdx,List.rev binds @ uncheckedBindsRev) + + | MutRecShape.Tycon (MutRecDefnsPass2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, binds)) -> // Class members can access protected members of the implemented type // Class members can access private members in the typ let isExtrinsic = (declKind = ExtrinsicExtensionBinding) - let envForTycon = MakeInnerEnvForTyconRef cenv envInitial tcref isExtrinsic + let envForTycon = MakeInnerEnvForTyconRef cenv envForDefns tcref isExtrinsic // Re-add the type constructor to make it take precedence for record label field resolutions // This does not apply to extension members: in those cases the relationship between the record labels @@ -12222,13 +12355,13 @@ module TyconBindingChecking = begin // The basic iteration over the declarations in a single type definition - let initialInnerState = (None,envForTycon,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) - let defnAs,(_,envForTycon,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) = + let initialInnerState = (None,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) + let defnAs,(_,_envForTycon,tpenv,recBindIdx,uncheckedBindsRev) = (initialInnerState,binds) ||> List.collectFold (fun innerState defn -> let (TyconBindingDefn(containerInfo,newslotsOK,declKind,classMemberDef,m)) = defn - let (incrClassCtorLhsOpt,env,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) = innerState + let (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) = innerState if tcref.IsTypeAbbrev then error(Error(FSComp.SR.tcTypeAbbreviationsMayNotHaveMembers(),(trimRangeToLine m))) // ideally we'd have the 'm' of the type declaration stored here, to avoid needing to trim to line to approx if tcref.IsEnumTycon && (declKind <> ExtrinsicExtensionBinding) then error(Error(FSComp.SR.tcEnumerationsMayNotHaveMembers(),(trimRangeToLine m))) // ideally we'd have the 'm' of the type declaration stored here, to avoid needing to trim to line to approx @@ -12242,7 +12375,7 @@ module TyconBindingChecking = begin let incrClassCtorLhs = TcImplictCtorLhsPassA(cenv,env,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) // PassA: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref let env = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars env - let innerState = (Some incrClassCtorLhs, env, tpenv, recBindIdx, prelimRecValuesRev, uncheckedBindsRev) + let innerState = (Some incrClassCtorLhs, env, tpenv, recBindIdx, uncheckedBindsRev) [PassAIncrClassCtor incrClassCtorLhs],innerState @@ -12251,7 +12384,7 @@ module TyconBindingChecking = begin // PassA: inherit typ(arg) as base - pass through // PassA: pick up baseValOpt! let baseValOpt = incrClassCtorLhsOpt |> Option.bind (fun x -> x.InstanceCtorBaseValOpt) - let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) [PassAInherit (typ,arg,baseValOpt,m); PassAIncrClassCtorJustAfterSuperInit], innerState @@ -12276,7 +12409,7 @@ module TyconBindingChecking = begin errorR(Error(FSComp.SR.tcStaticLetBindingsRequireClassesWithImplicitConstructors(),m)) // PassA: let-bindings - pass through - let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) [PassAIncrClassBindings (tcref,letBinds,isStatic,isRec,m)], innerState | SynMemberDefn.Member (bind,m),_ -> @@ -12295,10 +12428,10 @@ module TyconBindingChecking = begin | _ -> () let rbind = NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,bind) let overridesOK = DeclKind.CanOverrideOrImplement(declKind) - let (binds,values),(tpenv,recBindIdx) = AnalyzeAndMakeRecursiveValue overridesOK false cenv env (tpenv,recBindIdx) rbind + let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeRecursiveValue overridesOK false cenv env (tpenv,recBindIdx) rbind let cbinds = [ for rbind in binds -> PassAMember rbind ] - let innerState = (incrClassCtorLhsOpt, env, tpenv, recBindIdx, List.rev values @ prelimRecValuesRev,List.rev binds @ uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt, env, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) cbinds,innerState #if OPEN_IN_TYPE_DECLARATIONS @@ -12342,18 +12475,30 @@ module TyconBindingChecking = begin // Cover the case where this is not a type with an implicit constructor. | rest -> rest - let bindingGroup = TyconBindingsPassAGroup(envForTycon,tcref,copyOfTyconTypars,thisTy,defnAs) - bindingGroup,(tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev)) + let prelimRecValues = [ for x in defnAs do match x with PassAMember bind -> yield bind.RecBindingInfo.Val | _ -> () ] + let defnAs = MutRecShape.Tycon(TyconBindingsPassA(tyconOpt,prelimRecValues,tcref,copyOfTyconTypars,thisTy,defnAs)) + defnAs,(tpenv,recBindIdx,uncheckedBindsRev)) - let prelimRecValues = List.rev prelimRecValuesRev let uncheckedRecBinds = List.rev uncheckedBindsRev - (defnsAs, prelimRecValues, uncheckedRecBinds, tpenv) - /// PassB: type check each of the bindings, convert from ast to tast and collects type assertions + let envMutRec, defnsAs = + (envMutRec, defnsAs) + ||> MutRecShapes.extendEnvs (fun envCurrent decls -> + let prelimRecValues = + decls |> List.collect (function + | MutRecShape.Tycon (TyconBindingsPassA(_,prelimRecValues,_,_,_,_)) -> prelimRecValues + | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] + | _ -> []) + let envInner = AddLocalVals cenv.tcSink scopem prelimRecValues envCurrent + envInner) + + (envMutRec, defnsAs, uncheckedRecBinds, tpenv) + + /// PassB: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv envInitial tpenv (ad, defnsAs:TyconBindingsPassAGroups, prelimRecValues:Val list, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) = + let TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = - let defnsBs, (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = + let (defnsBs: MutRecBindingsPassB), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList @@ -12374,20 +12519,38 @@ module TyconBindingChecking = begin // The envForTycon is the environment used for name resolution within the let and member bindings // of the type definition. This becomes 'envStatic' and 'envInstance' for the two - let initialOuterState = (tpenv,([]: PostGeneralizationRecursiveBinding list),([]: PreGeneralizationRecursiveBinding list),uncheckedRecBindsTable,envInitial) + let initialOuterState = (tpenv,([]: PostGeneralizationRecursiveBinding list),([]: PreGeneralizationRecursiveBinding list),uncheckedRecBindsTable,envMutRec) - (initialOuterState,defnsAs) ||> List.mapFold (fun outerState defnsA -> + (initialOuterState,envMutRec,defnsAs) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDefns defnsA -> - let (TyconBindingsPassAGroup(envForTycon, tcref, copyOfTyconTypars, thisTy, defnAs)) = defnsA + let (tpenv,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable,envNonRec) = outerState - let (tpenv,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable,envNonRec) = outerState + match defnsA with + | MutRecShape.Module _ -> failwith "unreachable" + | MutRecShape.Lets binds -> - // Add prelimRecValues to env (breaks recursion) and vrec=true - let envForTycon = AddLocalVals cenv.tcSink scopem prelimRecValues envForTycon + let defnBs,(tpenv,_,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = + + let initialInnerState = (tpenv,envForDefns,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) + (initialInnerState,binds) ||> List.mapFold (fun innerState rbind -> + + let (tpenv,envStatic,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = innerState + + let (envNonRec, generalizedRecBinds, preGeneralizationRecBinds, _, uncheckedRecBindsTable) = TcLetrecBinding (cenv,envStatic,scopem,[],None) (envNonRec, generalizedRecBinds, preGeneralizationRecBinds, tpenv, uncheckedRecBindsTable) rbind + + let innerState = (tpenv, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) + rbind.RecBindingInfo.Index, innerState) + + let outerState = (tpenv, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable, envNonRec) + MutRecShape.Lets defnBs, outerState + + | MutRecShape.Tycon (TyconBindingsPassA(tyconOpt, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> + let envForTycon = envForDefns // Set up the environment so use-before-definition warnings are given, at least // until we reach a PassAIncrClassCtorJustAfterSuperInit. let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } + let reqdThisValTyOpt = Some thisTy // Loop through the definition elements in a type... // State: @@ -12409,6 +12572,8 @@ module TyconBindingChecking = begin // with the implicit ctor args. | PassAIncrClassCtor incrClassCtorLhs -> + let envInstance = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envInstance + let envStatic = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envStatic let envInstance = match incrClassCtorLhs.InstanceCtorSafeThisValOpt with Some v -> AddLocalVal cenv.tcSink scopem v envInstance | None -> envInstance let envInstance = List.foldBack AddLocalValPrimitive incrClassCtorLhs.InstanceCtorArgs envInstance let envNonRec = match incrClassCtorLhs.InstanceCtorSafeThisValOpt with Some v -> AddLocalVal cenv.tcSink scopem v envNonRec | None -> envNonRec @@ -12434,7 +12599,7 @@ module TyconBindingChecking = begin if isRec then // Type check local recursive binding - let binds = binds |> List.map (fun bind -> RecBindingDefn(ExprContainerInfo,NoNewSlots,ClassLetBinding,bind)) + let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(ExprContainerInfo,NoNewSlots,ClassLetBinding,bind)) let binds,env,tpenv = TcLetrec ErrorOnOverrides cenv envForBinding tpenv (binds,scopem(*bindsm*),scopem) let bindRs = [IncrClassBindingGroup(binds,isStatic,true)] binds,bindRs,env,tpenv @@ -12461,6 +12626,7 @@ module TyconBindingChecking = begin let nm = bind.Var.DisplayName let ty = generalizedTyconRef tcref + let ad = envNonRec.eAccessRights match TryFindIntrinsicMethInfo cenv.infoReader bind.Var.Range ad nm ty, TryFindPropInfo cenv.infoReader bind.Var.Range ad nm ty with | [],[] -> () @@ -12511,7 +12677,6 @@ module TyconBindingChecking = begin // for the class to be identical to those used for the implicit class constructor and the static class constructor. // // See TcLetrecBinding where this information is consumed. - let reqdThisValTyOpt = Some thisTy // Type check the member and apply early generalization. // We ignore the tpenv returned by checking each member. Each member gets checked in a fresh, clean tpenv @@ -12521,9 +12686,9 @@ module TyconBindingChecking = begin let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) PassBMember rbind.RecBindingInfo.Index, innerState) - let resultGroup = TyconBindingsPassBGroup(tcref, defnBs) + let defnBs = MutRecShape.Tycon (TyconBindingsPassB(tyconOpt, tcref, defnBs)) let outerState = (tpenv, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable, envNonRec) - resultGroup, outerState) + defnBs, outerState) // There should be no bindings that have not been generalized since checking the vary last binding always // results in the generalization of all remaining ungeneralized bindings, since there are no remaining unchecked bindings @@ -12535,13 +12700,17 @@ module TyconBindingChecking = begin // Choose type scheme implicit constructors and adjust their recursive types. // Fixup recursive references to members. - let TcTyconBindings_PassC_FixupRecursiveReferences cenv (envInitial:TcEnv) tpenv (denv, defnsBs: TyconBindingsPassBGroups, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = + let TcTyconBindings_PassC_FixupRecursiveReferences cenv tpenv (denv, defnsBs: MutRecBindingsPassB, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = // Build an index ---> binding map let generalizedBindingsMap = generalizedRecBinds |> List.map (fun pgrbind -> (pgrbind.RecBindingInfo.Index, pgrbind)) |> Map.ofList let defnsCs,tpenv = - (tpenv, defnsBs) ||> List.mapFold (fun tpenv defnsB -> - let (TyconBindingsPassBGroup(tcref, defnBs)) = defnsB + (tpenv, defnsBs) ||> MutRecShapes.mapFold (fun tpenv defnsB -> + match defnsB with + | MutRecShape.Lets _ -> failwith "unreachable (5)" + | MutRecShape.Module _ -> failwith "unreachable (6)" + | MutRecShape.Tycon defnsB -> + let (TyconBindingsPassB(tyconOpt, tcref, defnBs)) = defnsB let defnCs, tpenv = (tpenv,defnBs) ||> List.mapFold (fun tpenv defnB -> @@ -12570,20 +12739,20 @@ module TyconBindingChecking = begin // PassC: Fixup member bindings let generalizedBinding = generalizedBindingsMap.[idx] let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding - let pgbrind = FixupLetrecBind cenv envInitial.DisplayEnv generalizedTyparsForRecursiveBlock vxbind + let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind PassCMember pgbrind, tpenv) - let group = TyconBindingsPassCGroup(tcref,defnCs) - group, tpenv) + let group = TyconBindingsPassC(tyconOpt, tcref,defnCs) + MutRecShape.Tycon group, tpenv) (defnsCs,tpenv) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs) = + let TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = - let (fixupValueExprBinds, methodBinds) = - defnsCs |> List.map (fun (TyconBindingsPassCGroup(tcref,defnCs)) -> + // let (fixupValueExprBinds, methodBinds) = + defnsCs |> MutRecShapes.mapTycons (fun (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> match defnCs with @@ -12623,7 +12792,7 @@ module TyconBindingChecking = begin | _ -> false) | _ -> false) - if needsSafeStaticInit && hasStaticBindings then + if needsSafeStaticInit && hasStaticBindings then let rfield = MakeSafeInitField cenv.g envInitial tcref.Range true SafeInitField(mkRecdFieldRef tcref rfield.Name, rfield) else @@ -12713,43 +12882,41 @@ module TyconBindingChecking = begin { pgrbind with Binding = TBind(v,x,spBind) } ) - ctorValueExprBindings @ memberBindsWithFixups, methodBinds + tyconOpt, ctorValueExprBindings @ memberBindsWithFixups, methodBinds // Cover the case where this is not a class with an implicit constructor | defnCs -> let memberBindsWithFixups = defnCs |> List.choose (function PassCMember pgrbind -> Some pgrbind | _ -> None) - memberBindsWithFixups,[]) - |> List.unzip - let fixupValueExprBinds = List.concat fixupValueExprBinds - let methodBinds = List.concat methodBinds - (fixupValueExprBinds, methodBinds) + tyconOpt, memberBindsWithFixups,[]) + // |> List.unzip +// let fixupValueExprBinds = List.concat fixupValueExprBinds + // let methodBinds = List.concat methodBinds + // (fixupValueExprBinds, methodBinds) /// Main routine - let TcTyconBindings cenv (env: TcEnv) tpenv bindsm scopem (bindsl : TyconBindingDefns list) = + let TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls : MutRecDefnsPass2Info) = let g = cenv.g - let ad = env.eAccessRights - let denv = env.DisplayEnv - let envInitial = env - let env = () // hide this to make sure it is not used inadvertently - env |> ignore // mark it as used + // TODO: This needs to be factored into each environment computation + // TESTING: Test cases where nested modules have C#-style extension members to check they are added to the + // correct environments. let tcrefsWithCSharpExtensionMembers = - bindsl |> List.choose (fun (TyconBindingDefns(tcref, _, declKind, _)) -> + mutRecDecls |> MutRecShapes.topTycons |> List.choose (fun (MutRecDefnsPass2InfoForTycon(_,tcref, _, declKind, _)) -> if TyconRefHasAttribute g scopem g.attrib_ExtensionAttribute tcref && (declKind <> DeclKind.ExtrinsicExtensionBinding) then Some tcref else None) // Re-add the any tycons to get any C#-style extension members - let envInternal = AddLocalTyconRefs true g cenv.amap scopem tcrefsWithCSharpExtensionMembers envInitial + let envMutRec = AddLocalTyconRefs true g cenv.amap scopem tcrefsWithCSharpExtensionMembers envMutRec // PassA: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // PassA: also processes their arg patterns - collecting type assertions - let (defnsAs, prelimRecValues, uncheckedRecBinds, tpenv) = TcTyconBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv envInternal tpenv bindsl + let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) // PassB: type check pass, convert from ast to tast and collects type assertions, and generalize - let defnsBs, generalizedRecBinds, tpenv = TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv envInternal tpenv (ad, defnsAs, prelimRecValues, uncheckedRecBinds, scopem) + let defnsBs, generalizedRecBinds, tpenv = TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs, uncheckedRecBinds, scopem) let generalizedTyparsForRecursiveBlock = @@ -12760,14 +12927,12 @@ module TyconBindingChecking = begin // Check the escape condition for all extraGeneralizableTypars. // First collect up all the extraGeneralizableTypars. let allExtraGeneralizableTypars = - [ for (TyconBindingsPassAGroup(_, _, copyOfTyconTypars, _, defnAs)) in defnsAs do - yield! copyOfTyconTypars + defnsAs |> MutRecShapes.collectTycons |> List.collect (fun (TyconBindingsPassA(_, _, _, copyOfTyconTypars, _, defnAs)) -> + [ yield! copyOfTyconTypars for defnA in defnAs do match defnA with - | PassAMember rbind -> - yield! rbind.RecBindingInfo.EnclosingDeclaredTypars - | _ -> - () ] + | PassAMember rbind -> yield! rbind.RecBindingInfo.EnclosingDeclaredTypars + | _ -> () ]) // Now check they don't escape the overall scope of the recursive set of types if nonNil allExtraGeneralizableTypars then @@ -12775,7 +12940,7 @@ module TyconBindingChecking = begin for extraTypar in allExtraGeneralizableTypars do if Zset.memberOf freeInInitialEnv extraTypar then let ty = mkTyparTy extraTypar - error(Error(FSComp.SR.tcNotSufficientlyGenericBecauseOfScope(NicePrint.prettyStringOfTy denv ty),extraTypar.Range)) + error(Error(FSComp.SR.tcNotSufficientlyGenericBecauseOfScope(NicePrint.prettyStringOfTy envInitial.DisplayEnv ty),extraTypar.Range)) // Solve any type variables in any part of the overall type signature of the class whose // constraints involve generalized type variables. @@ -12788,7 +12953,7 @@ module TyconBindingChecking = begin let allTypes = [ for pgrbind in generalizedRecBinds do yield pgrbind.RecBindingInfo.Val.Type - for (TyconBindingsPassBGroup(_tcref, defnBs)) in defnsBs do + for (TyconBindingsPassB(_tyconOpt, _tcref, defnBs)) in MutRecShapes.collectTycons defnsBs do for defnB in defnBs do match defnB with | PassBIncrClassCtor (incrClassCtorLhs, _) -> @@ -12816,34 +12981,42 @@ module TyconBindingChecking = begin for tp in unsolvedTyparsForRecursiveBlockInvolvingGeneralizedVariables do //printfn "solving unsolvedTyparsInvolvingGeneralizedVariable : %s #%d" tp.DisplayName tp.Stamp if (tp.Rigidity <> TyparRigidity.Rigid) && not tp.IsSolved then - ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css denv tp + ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envInitial.DisplayEnv tp // Now that we know what we've generalized we can adjust the recursive references - let defnsCs,tpenv = TcTyconBindings_PassC_FixupRecursiveReferences cenv envInitial tpenv (denv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) + let defnsCs,tpenv = TcTyconBindings_PassC_FixupRecursiveReferences cenv tpenv (envInitial.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let fixupValueExprBinds, methodBinds = TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs) + let defnsDs = TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (envInitial.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) // INITIALIZATION GRAPHS - let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm - - let binds = binds @ methodBinds + // let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm + + // TODO: this does initialization graphs in each type independently, this is not correct + let defnsEs = + defnsDs |> MutRecShapes.map + (fun (tyconOpt, fixupValueExprBinds, methodBinds) -> + let fixedBinds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm + tyconOpt, fixedBinds @ methodBinds) + (fun (fixupValueExprBinds) -> + EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm) + id // Post letrec env - let envFinal = AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers envInitial - let envFinal = AddLocalVals cenv.tcSink scopem prelimRecValues envFinal + // TODO: recompute env differently? + let envFinal = AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers envMutRec let envFinal = let ctorVals = - [ for (TyconBindingsPassBGroup(_tcref, defnBs)) in defnsBs do - for defnB in defnBs do + defnsBs |> MutRecShapes.topTycons |> List.collect (fun (TyconBindingsPassB(_tyconOpt, _tcref, defnBs)) -> + [ for defnB in defnBs do match defnB with | PassBIncrClassCtor (incrClassCtorLhs, _) -> yield incrClassCtorLhs.InstanceCtorVal - | _ -> () ] + | _ -> () ]) AddLocalVals cenv.tcSink scopem ctorVals envFinal - binds,envFinal,tpenv + defnsEs,envFinal end @@ -12851,8 +13024,9 @@ end // The member portions of class defns //------------------------------------------------------------------------- -let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = - let interfacesFromTypeDefn (TyconMemberData(declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = +let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPass2Data) = + let interfacesFromTypeDefn envForTycon tyconMembersData = + let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) members |> List.collect (function | SynMemberDefn.Interface(ity,defnOpt,_) -> @@ -12862,7 +13036,7 @@ let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = if tcref.IsEnumTycon then error(Error(FSComp.SR.tcEnumerationsCannotHaveInterfaceDeclaration(),m)) let ity' = - let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars env + let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForTycon TcTypeAndRecover cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner emptyUnscopedTyparEnv ity |> fst if not (isInterfaceTy cenv.g ity') then errorR(Error(FSComp.SR.tcTypeIsNotInterfaceType0(),ity.Range)) @@ -12884,7 +13058,8 @@ let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = | _ -> []) - let interfaceMembersFromTypeDefn (TyconMemberData(declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) (ity',defn,_) implTySet = + let interfaceMembersFromTypeDefn tyconMembersData (ity',defn,_) implTySet = + let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity',implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) defn |> List.choose (fun mem -> match mem with @@ -12896,7 +13071,8 @@ let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = try // Some preliminary checks - tyconDefnMembers |> List.iter (fun (TyconMemberData(declKind, tcref, _, _, _, members, m, newslotsOK)) -> + mutRecDefns |> MutRecShapes.iterTycons (fun tyconData -> + let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData let tcaug = tcref.TypeContents if tcaug.tcaug_closed && declKind <> ExtrinsicExtensionBinding then error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type",m)) @@ -12912,7 +13088,7 @@ let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = // The rest should have been removed by splitting, they belong to "core" (they are "shape" of type, not implementation) | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(),mem.Range)))) - let tyconBindingsOfTypeDefn (TyconMemberData(declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = + let tyconBindingsOfTypeDefn (MutRecDefnsPass2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) members |> List.choose (fun memb -> @@ -12934,20 +13110,20 @@ let TcTyconMemberDefns cenv env parent bindsm scopem tyconDefnMembers = | SynMemberDefn.Inherit _ -> error(InternalError("Unexpected declaration element",memb.Range)) | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(),memb.Range))) + let binds = - tyconDefnMembers |> List.map (fun (TyconMemberData(declKind, tcref, _, _, declaredTyconTypars, _, _, _) as tyconMemberData) -> - let obinds = tyconBindingsOfTypeDefn tyconMemberData + (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner tyconData -> + let (MutRecDefnsPass2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData + let obinds = tyconBindingsOfTypeDefn tyconData let ibinds = - let intfTypes = interfacesFromTypeDefn tyconMemberData - let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader env.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) - List.concat (List.map2 (interfaceMembersFromTypeDefn tyconMemberData) intfTypes slotImplSets) - TyconBindingDefns(tcref, declaredTyconTypars, declKind, obinds @ ibinds)) + let intfTypes = interfacesFromTypeDefn envinner tyconData + let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envinner.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) + (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat + MutRecDefnsPass2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) - let results = TyconBindingChecking.TcTyconBindings cenv env tpenv bindsm scopem binds - let binds,envbody,_ = results - binds,envbody + TyconBindingChecking.TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, binds) - with e -> errorRecovery e scopem; [], env + with e -> errorRecovery e scopem; [], envMutRec //------------------------------------------------------------------------- // Build augmentation declarations @@ -13077,14 +13253,14 @@ end module TyconConstraintInference = begin - let InferSetOfTyconsSupportingComparable cenv (env: TcEnv) structuralTypes (tycons:Tycon list) = + let InferSetOfTyconsSupportingComparable cenv (denv: DisplayEnv) tyconsWithStructuralTypes = let g = cenv.g - let tab = (tycons,structuralTypes) ||> List.map2 (fun tycon c -> tycon.Stamp, (tycon,c)) |> Map.ofList + let tab = tyconsWithStructuralTypes |> List.map (fun (tycon:Tycon, structuralTypes) -> tycon.Stamp, (tycon,structuralTypes)) |> Map.ofList // Initially, assume the equality relation is available for all structural type definitions let initialAssumedTycons = - set [ for tycon in tycons do + set [ for (tycon,_) in tyconsWithStructuralTypes do if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithCompare cenv.g tycon then yield tycon.Stamp ] @@ -13165,9 +13341,9 @@ module TyconConstraintInference = begin failwith "unreachble" | Some (ty,_) -> if isTyparTy g ty then - errorR(Error(FSComp.SR.tcStructuralComparisonNotSatisfied1(tycon.DisplayName,NicePrint.prettyStringOfTy env.DisplayEnv ty),tycon.Range)) + errorR(Error(FSComp.SR.tcStructuralComparisonNotSatisfied1(tycon.DisplayName,NicePrint.prettyStringOfTy denv ty),tycon.Range)) else - errorR(Error(FSComp.SR.tcStructuralComparisonNotSatisfied2(tycon.DisplayName,NicePrint.prettyStringOfTy env.DisplayEnv ty),tycon.Range)) + errorR(Error(FSComp.SR.tcStructuralComparisonNotSatisfied2(tycon.DisplayName,NicePrint.prettyStringOfTy denv ty),tycon.Range)) | Some(false) -> () @@ -13181,9 +13357,9 @@ module TyconConstraintInference = begin // PERF: this call to prettyStringOfTy is always being executed, even when the warning // is not being reported (the normal case). if isTyparTy g ty then - warning(Error(FSComp.SR.tcNoComparisonNeeded1(tycon.DisplayName, NicePrint.prettyStringOfTy env.DisplayEnv ty, tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.tcNoComparisonNeeded1(tycon.DisplayName, NicePrint.prettyStringOfTy denv ty, tycon.DisplayName),tycon.Range)) else - warning(Error(FSComp.SR.tcNoComparisonNeeded2(tycon.DisplayName, NicePrint.prettyStringOfTy env.DisplayEnv ty, tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.tcNoComparisonNeeded2(tycon.DisplayName, NicePrint.prettyStringOfTy denv ty, tycon.DisplayName),tycon.Range)) res) @@ -13205,14 +13381,14 @@ module TyconConstraintInference = begin // Return the set of structural type definitions which support the relation uneliminatedTycons - let InferSetOfTyconsSupportingEquatable cenv (env: TcEnv) structuralTypes (tycons:Tycon list) = + let InferSetOfTyconsSupportingEquatable cenv (denv: DisplayEnv) (tyconsWithStructuralTypes:(Tycon * _) list) = let g = cenv.g - let tab = (tycons,structuralTypes) ||> List.map2 (fun tycon c -> tycon.Stamp, (tycon,c)) |> Map.ofList + let tab = tyconsWithStructuralTypes |> List.map (fun (tycon,c) -> tycon.Stamp, (tycon,c)) |> Map.ofList // Initially, assume the equality relation is available for all structural type definitions let initialAssumedTycons = - set [ for tycon in tycons do + set [ for (tycon,_) in tyconsWithStructuralTypes do if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals cenv.g tycon then yield tycon.Stamp ] @@ -13291,9 +13467,9 @@ module TyconConstraintInference = begin failwith "unreachble" | Some (ty,_) -> if isTyparTy g ty then - errorR(Error(FSComp.SR.tcStructuralEqualityNotSatisfied1(tycon.DisplayName,NicePrint.prettyStringOfTy env.DisplayEnv ty),tycon.Range)) + errorR(Error(FSComp.SR.tcStructuralEqualityNotSatisfied1(tycon.DisplayName,NicePrint.prettyStringOfTy denv ty),tycon.Range)) else - errorR(Error(FSComp.SR.tcStructuralEqualityNotSatisfied2(tycon.DisplayName,NicePrint.prettyStringOfTy env.DisplayEnv ty),tycon.Range)) + errorR(Error(FSComp.SR.tcStructuralEqualityNotSatisfied2(tycon.DisplayName,NicePrint.prettyStringOfTy denv ty),tycon.Range)) else () | Some(false) -> @@ -13306,9 +13482,9 @@ module TyconConstraintInference = begin failwith "unreachble" | Some (ty,_) -> if isTyparTy g ty then - warning(Error(FSComp.SR.tcNoEqualityNeeded1(tycon.DisplayName, NicePrint.prettyStringOfTy env.DisplayEnv ty, tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.tcNoEqualityNeeded1(tycon.DisplayName, NicePrint.prettyStringOfTy denv ty, tycon.DisplayName),tycon.Range)) else - warning(Error(FSComp.SR.tcNoEqualityNeeded2(tycon.DisplayName, NicePrint.prettyStringOfTy env.DisplayEnv ty, tycon.DisplayName),tycon.Range)) + warning(Error(FSComp.SR.tcNoEqualityNeeded2(tycon.DisplayName, NicePrint.prettyStringOfTy denv ty, tycon.DisplayName),tycon.Range)) res) @@ -13359,7 +13535,7 @@ let CheckForDuplicateModule _cenv env nm m = module TcExceptionDeclarations = begin - let private TcExnDefnCore cenv env parent tpenv (ExceptionDefnRepr(synAttrs,UnionCase(_,id,args,_,_,_),repr,doc,vis,m), scopem) = + let private TcExnDefnCore cenv env parent tpenv (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,args,_,_,_),repr,doc,vis,m)) = let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs let args = match args with (UnionCaseFields args) -> args | _ -> error(Error(FSComp.SR.tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors(),m)) let ad = env.eAccessRights @@ -13410,8 +13586,8 @@ module TcExceptionDeclarations = begin PublishTypeDefn cenv env exnc let structuralTypes = args' |> List.map (fun rf -> (rf.FormalType, rf.Range)) - let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv env [structuralTypes] [exnc] - let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv env [structuralTypes] [exnc] + let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv env.DisplayEnv [(exnc,structuralTypes)] + let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv env.DisplayEnv [(exnc,structuralTypes)] // Augment the exception constructor with comparison and hash methods if needed let binds = @@ -13424,37 +13600,29 @@ module TcExceptionDeclarations = begin let item = Item.ExnCase(mkLocalTyconRef exnc) CallNameResolutionSink cenv.tcSink (id.idRange,env.NameEnv,item,item,ItemOccurence.Binding,env.DisplayEnv,env.eAccessRights) - binds, - exnc, - AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] env) + binds,exnc + + + let TcExnDefn cenv envInitial parent tpenv (SynExceptionDefn(core,aug,m),scopem) = + let binds1,exnc = TcExnDefnCore cenv envInitial parent tpenv core + let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) - let TcExnDefn cenv env parent tpenv (ExceptionDefn(core,aug,m),scopem) = - let binds1,exnc,env = TcExnDefnCore cenv env parent tpenv (core,scopem) - let binds2,env = TcTyconMemberDefns cenv env parent m scopem [TyconMemberData(ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots)] + let defns = [MutRecShape.Tycon(MutRecDefnsPass2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] + let binds2,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, defns) + let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env exnc - binds1 @ binds2 @ binds3,exnc,env + binds1 @ binds2flat @ binds3,exnc,env - let TcExnSignature cenv env parent tpenv (ExceptionSig(core,aug,_),scopem) = - let binds,exnc,env = TcExnDefnCore cenv env parent tpenv (core,scopem) + let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core,aug,_),scopem) = + let binds,exnc = TcExnDefnCore cenv envInitial parent tpenv core + let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let ecref = mkLocalEntityRef exnc - let vals,_ = TcTyconMemberSpecs cenv env (ContainerInfo(parent,Some(MemberOrValContainerInfo(ecref,None,None,NoSafeInitInfo,[])))) ModuleOrMemberBinding tpenv aug - binds,vals,ecref,env + let vals,_ = TcTyconMemberSpecs cenv envMutRec (ContainerInfo(parent,Some(MemberOrValContainerInfo(ecref,None,None,NoSafeInitInfo,[])))) ModuleOrMemberBinding tpenv aug + binds,vals,ecref,envMutRec end -/// The core syntactic input to the type checking of type definitions. -/// -/// TyconDefnCore(info,repr,m,preEstablishedHasDefaultCtor,hasSelfReferentialCtor) -type TyconDefnCore = - TyconDefnCore of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * bool * bool - -/// Same as TyconDefnCore but with an integer index. -/// -/// TyconDefnCoreIndexed(info,repr,m,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,i) -type TyconDefnCoreIndexed = - TyconDefnCoreIndexed of - SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * bool *bool * int /// Bind type definitions /// @@ -13531,7 +13699,7 @@ module EstablishTypeDefinitionCores = begin /// Get the component types that make a record, union or struct type. /// /// Used when determining if a structural type supports structural comparison. - let private GetStructuralElementsOfTyconDefn cenv env tpenv (TyconDefnCoreIndexed(_,synTyconRepr,_,_,_,_)) tycon = + let private GetStructuralElementsOfTyconDefn cenv env tpenv (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) tycon = let thisTyconRef = mkLocalTyconRef tycon let m = tycon.Range let env = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) env @@ -13582,7 +13750,7 @@ module EstablishTypeDefinitionCores = begin /// - computing the mangled name for C /// but /// - we don't yet 'properly' establish constraints on type parameters - let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (TyconDefnCoreIndexed(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,_)) = + let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor)) = let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) @@ -13606,6 +13774,7 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Record (vis,_,_) -> vis | SynTypeDefnSimpleRepr.General _ -> None | SynTypeDefnSimpleRepr.Enum _ -> None + //| SynTypeDefnSimpleRepr.Exception _ -> None let visOfRepr,_ = ComputeAccessAndCompPath env None id.idRange visOfRepr parent let visOfRepr = combineAccess vis visOfRepr @@ -13624,7 +13793,7 @@ module EstablishTypeDefinitionCores = begin /// /// synTyconInfo: Syntactic AST for the name, attributes etc. of the type constructor /// synTyconRepr: Syntactic AST for the RHS of the type definition - let private TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner (TyconDefnCoreIndexed(synTyconInfo,synTyconRepr,_,_,_,_)) (tycon:Tycon) = + let private TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,_,_)) (tycon:Tycon) = let (ComponentInfo(synAttrs,typars, _,_, _, _,_,_)) = synTyconInfo let m = tycon.Range let id = tycon.Id @@ -13903,7 +14072,7 @@ module EstablishTypeDefinitionCores = begin // such as 'isTupleTy' will return reliable results, e.g. isTupleTy on the /// TAST type for 'PairOfInts' will report 'true' // - let private TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv pass (TyconDefnCoreIndexed(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -13966,13 +14135,16 @@ module EstablishTypeDefinitionCores = begin // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv envinner tpenv inSig typeDefCores (tycons:Tycon list) pass (checkedAttrsList:Attribs list) = + let private TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) // Publish the immediately declared interfaces. - let implementsL = - (typeDefCores,tycons,checkedAttrsList) |||> List.map3 (fun (TyconDefnCoreIndexed(_,synTyconRepr,explicitImplements,_,_,_)) tycon checkedAttrs -> + let tyconWithImplementsL = + (envMutRec, mutRecDecls) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + match origInfo, tyconAndAttrsOpt with + | (tyconDefCore,_), Some (tycon, checkedAttrs) -> + let (MutRecDefnsPass1DataForTycon(_,synTyconRepr,explicitImplements,_,_)) = tyconDefCore let m = tycon.Range let tcref = mkLocalTyconRef tycon let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner @@ -14014,10 +14186,11 @@ module EstablishTypeDefinitionCores = begin if firstPass then implementedTys |> List.iter (fun (ty,m) -> PublishInterface cenv envinner.DisplayEnv tcref m false ty) - attrs,inheritedTys) + Some (attrs,inheritedTys,synTyconRepr,tycon) + | _ -> None) // Publish the attributes and supertype - (implementsL,typeDefCores,tycons) |||> List.iter3 (fun (attrs,inheritedTys) (TyconDefnCoreIndexed(_,synTyconRepr,_,_,_,_)) tycon -> + tyconWithImplementsL |> MutRecShapes.iterTycons (Option.iter (fun (attrs,inheritedTys, synTyconRepr, tycon) -> let m = tycon.Range try let super = @@ -14057,10 +14230,10 @@ module EstablishTypeDefinitionCores = begin // Publish the super type tycon.TypeContents.tcaug_super <- super - with e -> errorRecovery e m) + with e -> errorRecovery e m)) /// Establish the fields, dispatch slots and union cases of a type - let private TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig (TyconDefnCoreIndexed(_,synTyconRepr,_,_,_,tyconIdx)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range try let id = tycon.Id @@ -14395,13 +14568,13 @@ module EstablishTypeDefinitionCores = begin errorR(Error(FSComp.SR.tcConditionalAttributeUsage(),m)) | _ -> () - (baseValOpt, safeInitInfo, tyconIdx) + (baseValOpt, safeInitInfo) with e -> errorRecovery e m - None, NoSafeInitInfo, tyconIdx + None, NoSafeInitInfo /// Check that a set of type definitions is free of cycles in abbreviations - let private CheckForCyclicAbbreviations _cenv tycons = + let private CheckForCyclicAbbreviations tycons = let edgesFrom (tycon:Tycon) = @@ -14588,45 +14761,96 @@ module EstablishTypeDefinitionCores = begin errorR(Error(FSComp.SR.tcTypeDefinitionIsCyclicThroughInheritance(),tycon.Range))) let isAugmentationTyconDefnRepr x = match x with (SynTypeDefnSimpleRepr.General(TyconAugmentation,_,_,_,_,_,_,_)) -> true | _ -> false - - let TcTyconDefnCores cenv env inSig parent tpenv (typeDefCores:TyconDefnCore list, m, scopem) = - // Add indexes - let typeDefCores = typeDefCores |> List.mapi (fun i (TyconDefnCore(info,repr,m,preEstablishedHasDefaultCtor,hasSelfReferentialCtor)) -> TyconDefnCoreIndexed(info,repr,m,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,i)) - // Skip augmentations - let tdefsForAugmentations, typeDefCores = typeDefCores |> List.partition (fun (TyconDefnCoreIndexed(_,repr,_,_,_,_)) -> isAugmentationTyconDefnRepr repr) + let ComputeModuleOrNamespaceKind g isModule attribs = + if not isModule then Namespace + elif ModuleNameIsMangled g attribs then FSharpModuleWithSuffix + else ModuleOrType + + let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm^FSharpModuleSuffix | _ -> nm) - // First define the type constructors and the abbreviations, if any. - let tycons = typeDefCores |> List.map (TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent) - // Publish the preliminary tycons - tycons |> List.iter (fun tycon -> - // recheck these in case type is a duplicate in a mutually recursive set - CheckForDuplicateConcreteType cenv env tycon.LogicalName tycon.Range - CheckForDuplicateModule cenv env tycon.LogicalName tycon.Range - PublishTypeDefn cenv env tycon) + let TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial parent compInfo = + let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo + let id = ComputeModuleName longPath + let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs // TODO VERY MINOR: this means typeof in attributes on module declarations can't refer to to mutrec type defs + let modKind = ComputeModuleOrNamespaceKind cenv.g true modAttrs + + let vis,_ = ComputeAccessAndCompPath envInitial None id.idRange vis parent + + CheckForDuplicateModule cenv envInitial id.idText id.idRange + let id = ident (AdjustModuleName modKind id.idText, id.idRange) + CheckForDuplicateConcreteType cenv envInitial id.idText im + CheckNamespaceModuleOrTypeName cenv.g id + + let _envinner, mtypeAcc = MakeInnerEnv envInitial id modKind + let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) + let innerParent = Parent (mkLocalModRef mspec) + MutRecDefnsPass2DataForModule (mtypeAcc, mspec), innerParent + + let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = + + // First define the type constructors and the abbreviations, if any. Skip augmentations. + let withTycons = + typeDefCores + |> MutRecShapes.mapTyconAndModulesWithParent + parent + (fun innerParent modInfo -> TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial innerParent modInfo) + (fun innerParent ((tyconDefCore,_) as c) -> + let (MutRecDefnsPass1DataForTycon(_,repr,_,_,_)) = tyconDefCore + let tyconOpt = + if isAugmentationTyconDefnRepr repr then None + else Some (TcTyconDefnCore_Phase0_BuildInitialTycon cenv envInitial innerParent tyconDefCore) + c, tyconOpt) // Add them to the environment, though this does not add the fields and // constructors (because we haven't established them yet). // We re-add them to the original environment later on. // We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles - see bug 952) - let envinner = AddLocalTycons cenv.g cenv.amap scopem tycons env - + let envMutRec, withEnvs = + (envInitial, withTycons) ||> MutRecShapes.computeEnvs (fun envAbove decls -> + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt) -> tyconOpt | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPass2DataForModule (_, mspec),_) -> Some mspec | _ -> None) + + for tycon in tycons do + // recheck these in case type is a duplicate in a mutually recursive set + CheckForDuplicateConcreteType cenv envAbove tycon.LogicalName tycon.Range + CheckForDuplicateModule cenv envAbove tycon.LogicalName tycon.Range + PublishTypeDefn cenv envAbove tycon + for mspec in mspecs do + PublishModuleDefn cenv envAbove mspec + let envInner = AddLocalTycons cenv.g cenv.amap scopem tycons envAbove + let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + envInner) // Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. - let checkedAttrsList = (typeDefCores,tycons) ||> List.map2 (TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner) + let withAttrs = + (envMutRec, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconOpt) -> + let res = + match origInfo, tyconOpt with + | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner tyconDefCore tycon) + | _ -> None + origInfo, res) // Establish the abbreviations (no constraint checking, because constraints not yet established) - (typeDefCores,tycons,checkedAttrsList) |||> List.iter3 (TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv FirstPass) + (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + match origInfo, tyconAndAttrsOpt with + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv FirstPass tyconDefCore tycon attrs + | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. - CheckForCyclicAbbreviations cenv tycons + let tycons = + withTycons + |> MutRecShapes.collectTycons + |> List.choose snd + + CheckForCyclicAbbreviations tycons // Establish the super type and interfaces (no constraint checking, because constraints not yet established) - TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv envinner tpenv inSig typeDefCores tycons FirstPass checkedAttrsList + (envMutRec, withAttrs) |> TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass // REVIEW: we should separate the checking for cyclic hierarchies and cyclic structs // REVIEW: this is because in some extreme cases the TcTyparConstraints call below could @@ -14639,65 +14863,92 @@ module EstablishTypeDefinitionCores = begin // Find all the field types in all the structrual types - let structuralTypes = (typeDefCores,tycons) ||> List.map2 (GetStructuralElementsOfTyconDefn cenv envinner tpenv) + let tyconsWithStructuralTypes = + (envMutRec,withEnvs) + ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo, tyconOpt) -> + match origInfo, tyconOpt with + | (typeDefCore,_), Some tycon -> Some (tycon,GetStructuralElementsOfTyconDefn cenv envinner tpenv typeDefCore tycon) + | _ -> None) + |> MutRecShapes.collectTycons + |> List.choose id - let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv envinner structuralTypes tycons - let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv envinner structuralTypes tycons + let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv envMutRec.DisplayEnv tyconsWithStructuralTypes + let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv envMutRec.DisplayEnv tyconsWithStructuralTypes - tycons |> List.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv env scSet seSet) + (envMutRec,withEnvs) + ||> MutRecShapes.iterTyconsWithEnv (fun envinner (_, tyconOpt) -> + tyconOpt |> Option.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv envinner scSet seSet)) // Check and publish the explicit constraints. let checkExplicitConstraints checkCxs = - (typeDefCores,tycons) ||> List.iter2 (fun (TyconDefnCoreIndexed(synTyconInfo,_,_,_,_,_)) tycon -> - let (ComponentInfo(_,_, wcs,_,_,_, _,_)) = synTyconInfo + (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo, tyconOpt) -> + match origInfo, tyconOpt with + | (tyconDefCore,_), Some tycon -> + let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_)) = tyconDefCore + let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner let thisTyconRef = mkLocalTyconRef tycon let envinner = MakeInnerEnvForTyconRef cenv envinner thisTyconRef false - try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envinner tpenv wcs |> ignore - with e -> errorRecovery e m) + try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envinner tpenv synTyconConstraints |> ignore + with e -> errorRecovery e m + | _ -> ()) checkExplicitConstraints NoCheckCxs // No inferred constraints allowed on declared typars - tycons |> List.iter (fun tc -> tc.Typars(m) |> List.iter (SetTyparRigid cenv.g env.DisplayEnv m)) + (envMutRec,withEnvs) + ||> MutRecShapes.iterTyconsWithEnv (fun envinner (_, tyconOpt) -> + tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envinner.DisplayEnv m))) // OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) - (typeDefCores,tycons,checkedAttrsList) |||> List.iter3 (TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv SecondPass) - TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv envinner tpenv inSig typeDefCores tycons SecondPass checkedAttrsList + (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + match origInfo, tyconAndAttrsOpt with + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv SecondPass tyconDefCore tycon attrs + | _ -> ()) + + (envMutRec, withAttrs) |> TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass checkExplicitConstraints CheckCxs // Now all the type parameters, abbreviations, constraints and kind information is established. // Now do the representations. Each baseValOpt is a residue from the representation which is potentially available when // checking the members. - let baseValOpts, safeInitValOpts = - let baseValOptsForTycons = (typeDefCores,tycons,checkedAttrsList) |||> List.map3 (TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig) - // Make sure we return a 'None' for each augmentation as well. These can't use 'base' - let baseValOptsForAugmentations = tdefsForAugmentations |> List.map (fun (TyconDefnCoreIndexed(_,_,_,_,_,idx)) -> (None, NoSafeInitInfo, idx)) - // Collect them up, sort them by index - (baseValOptsForAugmentations @ baseValOptsForTycons) |> List.sortBy p33 |> List.map (fun (a,b,_) -> (a,b)) |> List.unzip + let withBaseValsAndSafeInitInfos = + (envMutRec,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + let info = + match origInfo, tyconAndAttrsOpt with + | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig tyconDefnCore tycon attrs + | _ -> None, NoSafeInitInfo + (origInfo, Option.map fst tyconAndAttrsOpt, info)) // Now check for cyclic structs and inheritance. It's possible these should be checked as separate conditions. // REVIEW: checking for cyclic inheritance is happening too late. See note above. CheckForCyclicStructsAndInheritance cenv tycons - // Add the tycons again to the environment (again) - this will add the constructors and fields. - let env = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons env + // Reconstruct the environments all over again - this will add the union cases and fields. + let envMutRec, withNewEnvs = + (envInitial, withBaseValsAndSafeInitInfos) + ||> MutRecShapes.recomputeEnvs (fun envAbove decls -> + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) + let envInner = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + envInner) - (tycons, env, baseValOpts, safeInitValOpts) + (tycons, envMutRec, withNewEnvs) end // module EstablishTypeDefinitionCores -module TcTypeDeclarations = begin +module TcDeclarations = begin /// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an /// intrinsic or extrinsic extension - let private ComputeTyconDeclKind isAtOriginalTyconDefn cenv env inSig m (typars:SynTyparDecl list) cs longPath = - let ad = env.eAccessRights + let private ComputeTyconDeclKind isAtOriginalTyconDefn cenv envInitial inSig m (typars:SynTyparDecl list) cs longPath = + let ad = envInitial.eAccessRights let tcref = let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs typars.Length - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified env.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envInitial.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with | Result res -> res | res when inSig && longPath.Length = 1 -> errorR(Deprecated(FSComp.SR.tcReservedSyntaxForAugmentation(),m)) @@ -14710,7 +14961,7 @@ module TcTypeDeclarations = begin tcref.Deref.IsFSharpEnumTycon let isInSameModuleOrNamespace = - match env.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with + match envInitial.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with | Some tycon -> (tyconOrder.Compare(tcref.Deref,tycon) = 0) | None -> //false @@ -14737,10 +14988,10 @@ module TcTypeDeclarations = begin // not recoverable error(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) - let declaredTypars = TcTyparDecls cenv env typars - let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTypars env + let declaredTypars = TcTyparDecls cenv envInitial typars + let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envInitial let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner emptyUnscopedTyparEnv cs - declaredTypars |> List.iter (SetTyparRigid cenv.g env.DisplayEnv m) + declaredTypars |> List.iter (SetTyparRigid cenv.g envInitial.DisplayEnv m) if not (typarsAEquiv cenv.g TypeEquivEnv.Empty reqTypars declaredTypars) then errorR(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) ExtrinsicExtensionBinding, declaredTypars @@ -14826,7 +15077,7 @@ module TcTypeDeclarations = begin ///------ /// The tinfos arg are the enclosing types when processing nested types... /// The tinfos arg is not currently used... just stacked up. - let rec private SplitTyconDefn (cenv:cenv) tinfos (TypeDefn(synTyconInfo,trepr,extraMembers,_)) = + let rec private SplitTyconDefn (_cenv:cenv) (TypeDefn(synTyconInfo,trepr,extraMembers,_)) = let implements1 = List.choose (function SynMemberDefn.Interface (ty,_,_) -> Some(ty,ty.Range) | _ -> None) extraMembers match trepr with | SynTypeDefnRepr.ObjectModel(kind,cspec,m) -> @@ -14837,7 +15088,7 @@ module TcTypeDeclarations = begin | SynMemberDefn.Inherit (ty,idOpt,m) -> Some(ty,m,idOpt) | SynMemberDefn.ImplicitInherit (ty,_,idOpt,m) -> Some(ty,m,idOpt) | _ -> None) - let tycons = cspec |> List.choose (function SynMemberDefn.NestedType (x,_,_) -> Some(x) | _ -> None) + //let nestedTycons = cspec |> List.choose (function SynMemberDefn.NestedType (x,_,_) -> Some(x) | _ -> None) let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (x,y,_) -> Some(x,y) | _ -> None) let members = @@ -14937,7 +15188,7 @@ module TcTypeDeclarations = begin preMembers @ postMembers - let a,b = SplitTyconDefns cenv (tinfos @ [synTyconInfo]) tycons + //let _a,b = SplitTyconDefns cenv (tinfos @ [synTyconInfo]) tycons let isConcrete = members |> List.exists (function @@ -14973,53 +15224,63 @@ module TcTypeDeclarations = begin | SynMemberDefn.ImplicitCtor (_,_,spats,_, _) -> isNil spats | _ -> false) - let core = TyconDefnCore(synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m), implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor) + let core = MutRecDefnsPass1DataForTycon(synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m), implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor) - core :: a, members :: b + core, members @ extraMembers | SynTypeDefnRepr.Simple(r,_) -> let members = [] - let core = TyconDefnCore(synTyconInfo,r,implements1,false,false) - [ core ],[ members ] + let core = MutRecDefnsPass1DataForTycon(synTyconInfo,r,implements1,false,false) + core, members @ extraMembers + + //| SynTypeDefnRepr.Exception(r) -> + // let core = MutRecDefnsPass1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false) + // core,[ ] - and private SplitTyconDefns cenv tinfos tycons = - let a,b = List.unzip (List.map (SplitTyconDefn cenv tinfos) tycons) - List.concat a, List.concat b + //and private SplitTyconDefns cenv tycons = + // let a,b = tycons |> List.map (SplitTyconDefn cenv) |> List.unzip + // a, List.concat b - let private PrepareTyconMemberDefns isAtOriginalTyconDefn cenv env (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = + let SplitMutRecDefns cenv mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons (SplitTyconDefn cenv) + + //let SplitExnDefn (SynExceptionDefn(core,aug,m)) = + // [ Choice1Of2 core ], [ (fun exnc -> MutRecDefnsPass2DataForTycon(ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots)) ] + + let private PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo - let declKind,tcref, declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv env false tyDeclm typars cs longPath + let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envMutRec false tyDeclm typars cs longPath let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) // NewSlotsOK only on fsobjs if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclm)) - TyconMemberData(declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) + MutRecDefnsPass2DataForTycon(tyconOpt, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) //------------------------------------------------------------------------- // Bind type definitions - main //------------------------------------------------------------------------- - let TcTyconDefns cenv env parent tpenv (typeDefs: SynTypeDefn list,m,scopem) = - let typeDefCores,tyconDefnMembers = SplitTyconDefns cenv [] typeDefs - let tycons, env, baseValOpts, safeInitValOpts = EstablishTypeDefinitionCores.TcTyconDefnCores cenv env false parent tpenv (typeDefCores,m,scopem) - let augments = - (List.zip typeDefs typeDefCores, List.zip baseValOpts safeInitValOpts, tyconDefnMembers) |||> List.map3 (fun (TypeDefn(synTyconInfo,_,extraMembers,m), TyconDefnCore(_,repr,_,_,_)) (baseValOpt, safeInitInfo) members -> - let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) - PrepareTyconMemberDefns isAtOriginalTyconDefn cenv env (synTyconInfo, baseValOpt, safeInitInfo, members@extraMembers, synTyconInfo.Range, m)) // TODO gotoDef on 'm' here goes to wrong m, but only inside production.proj + let TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = + let mutRecDefnsAfterSplit = SplitMutRecDefns cenv mutRecDefns + let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv envInitial parent false tpenv (mutRecDefnsAfterSplit,m,scopem) + + let mutRecDefnsAfterPrep = + mutRecDefnsAfterCore |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> + let (MutRecDefnsPass1DataForTycon(synTyconInfo,repr,_,_,_)) = typeDefnCore + let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) - let valExprBuilders,env = TcTyconMemberDefns cenv env parent m scopem augments + let withBindings,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) // Note: generating these bindings must come after generating the members, since some in the case of structs some fields // may be added by generating the implicit construction syntax - let binds = tycons |> List.collect (AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv) - let binds3 = tycons |> List.collect (AddAugmentationDeclarations.AddGenericEqualityBindings cenv env) + let withExtraBindings = withBindings |> MutRecShapes.expandTycons (fun (tyconOpt, _) -> match tyconOpt with None -> [] | Some tycon -> AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv tycon @ AddAugmentationDeclarations.AddGenericEqualityBindings cenv env tycon) // Check for cyclic structs and inheritance all over again, since we may have added some fields to the struct when generating the implicit construction syntax EstablishTypeDefinitionCores.CheckForCyclicStructsAndInheritance cenv tycons - (binds @ valExprBuilders @ binds3),tycons,env + withExtraBindings,env //------------------------------------------------------------------------- @@ -15027,7 +15288,7 @@ module TcTypeDeclarations = begin //------------------------------------------------------------------------- /// Parallels split_tycon[Spfn/Defn] - let rec private SplitTyconSignature tinfos (TypeDefnSig(synTyconInfo,trepr,extraMembers,_)) = + let rec private SplitTyconSignature (TypeDefnSig(synTyconInfo,trepr,extraMembers,_)) = let implements1 = extraMembers |> List.choose (function SynMemberSig.Interface (f,m) -> Some(f,m) | _ -> None) match trepr with @@ -15035,7 +15296,7 @@ module TcTypeDeclarations = begin let fields = cspec |> List.choose (function SynMemberSig.ValField (f,_) -> Some(f) | _ -> None) let implements2 = cspec |> List.choose (function SynMemberSig.Interface (ty,m) -> Some(ty,m) | _ -> None) let inherits = cspec |> List.choose (function SynMemberSig.Inherit (ty,_) -> Some(ty,m,None) | _ -> None) - let nestedTycons = cspec |> List.choose (function SynMemberSig.NestedType (x,_) -> Some(x) | _ -> None) + //let nestedTycons = cspec |> List.choose (function SynMemberSig.NestedType (x,_) -> Some(x) | _ -> None) let slotsigs = cspec |> List.choose (function SynMemberSig.Member (v,fl,_) when fl.IsDispatchSlot -> Some(v,fl) | _ -> None) let members = cspec |> List.filter (function | SynMemberSig.Interface _ -> true @@ -15061,29 +15322,26 @@ module TcTypeDeclarations = begin let hasSelfReferentialCtor = false - let a,b = nestedTycons |> SplitTyconSignatures (tinfos @ [synTyconInfo]) - - let tyconCore = TyconDefnCore (synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m),implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor) + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m),implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor) - [ tyconCore ] @ a, - [ (synTyconInfo,true,members@extraMembers) ] @ b + tyconCore, (synTyconInfo,true,members@extraMembers) // 'type X with ...' in a signature is always interpreted as an extrinsic extension. // Representation-hidden types with members and interfaces are written 'type X = ...' - | SynTypeDefnSigRepr.Simple(SynTypeDefnSimpleRepr.None _,_) when nonNil extraMembers -> - let isAtOriginalTyconDefn = false - [],[ (synTyconInfo,isAtOriginalTyconDefn,extraMembers) ] + | SynTypeDefnSigRepr.Simple((SynTypeDefnSimpleRepr.None _ as r),_) when nonNil extraMembers -> + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false) + tyconCore, (synTyconInfo,false,extraMembers) | SynTypeDefnSigRepr.Simple(r,_) -> - let tyconCore = TyconDefnCore (synTyconInfo, r, implements1, false, false) - [ tyconCore ],[ (synTyconInfo,true,extraMembers) ] + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false) + tyconCore, (synTyconInfo,true,extraMembers) - and private SplitTyconSignatures tinfos tycons = - let a,b = tycons |> List.map (SplitTyconSignature tinfos) |> List.unzip - List.concat a, List.concat b + let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature - let private TcTyconSignatureMemberSpecs cenv env parent tpenv tyconDefnMembers = - (tpenv, tyconDefnMembers) ||> List.mapFold (fun tpenv (synTyconInfo,isAtOriginalTyconDefn,members) -> + let private TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefns = + // TODO - this is only checking the tycons in the signatures, need to do the module and let elements to + (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun env ((_, (synTyconInfo,isAtOriginalTyconDefn,members)), _, _) -> + let tpenv = emptyUnscopedTyparEnv let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv env true m typars cs longPath @@ -15092,10 +15350,10 @@ module TcTypeDeclarations = begin TcTyconMemberSpecs cenv envinner (TyconContainerInfo(parent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) - let TcTyconSignatures cenv env parent tpenv (tspecs:SynTypeDefnSig list,m,scopem) = - let typeDefCores,tyconDefnMembers = SplitTyconSignatures [] tspecs - let _, env, _, _ = EstablishTypeDefinitionCores.TcTyconDefnCores cenv env true parent tpenv (typeDefCores,m,scopem) - let _ = TcTyconSignatureMemberSpecs cenv env parent tpenv tyconDefnMembers + let TcTyconSignatures cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = + let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) + let _ = TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefnsAfterCore env end @@ -15103,9 +15361,6 @@ end // Bind module types //------------------------------------------------------------------------- -let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm^FSharpModuleSuffix | _ -> nm) - - let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = eventually { try @@ -15115,9 +15370,10 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let _,_,_,env = TcExceptionDeclarations.TcExnSignature cenv env parent emptyUnscopedTyparEnv (edef,scopem) return env - | SynModuleSigDecl.Types (tspecs,m) -> + | SynModuleSigDecl.Types (typeSpecs,m) -> let scopem = unionRanges m endm - let env = TcTypeDeclarations.TcTyconSignatures cenv env parent emptyUnscopedTyparEnv (tspecs,m,scopem) + let mutRecDefns = typeSpecs |> List.map MutRecShape.Tycon + let env = TcDeclarations.TcTyconSignatures cenv env parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) return env | SynModuleSigDecl.Open (mp,m) -> @@ -15215,21 +15471,17 @@ and TcSignatureElements cenv parent endm env xml defs = return! Eventually.fold (TcSignatureElement cenv parent endm) env defs } -and ComputeModuleOrNamespaceKind g isModule attribs = - if not isModule then Namespace - elif ModuleNameIsMangled g attribs then FSharpModuleWithSuffix - else ModuleOrType - and TcModuleOrNamespaceSignature cenv env (id:Ident,isModule,defs,xml,attribs,vis,m) = eventually { let attribs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs CheckNamespaceModuleOrTypeName cenv.g id - let modKind = ComputeModuleOrNamespaceKind cenv.g isModule attribs - if isModule then CheckForDuplicateConcreteType cenv env (AdjustModuleName modKind id.idText) id.idRange + let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule attribs + let modName = EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText + if isModule then CheckForDuplicateConcreteType cenv env modName id.idRange if isModule then CheckForDuplicateModule cenv env id.idText id.idRange // Now typecheck the signature, accumulating and then recording the submodule description. - let id = ident (AdjustModuleName modKind id.idText, id.idRange) + let id = ident (modName, id.idRange) let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) attribs (notlazy (NewEmptyModuleOrNamespaceType modKind)) @@ -15261,6 +15513,58 @@ and TcModuleOrNamespaceSignatureElements cenv parent env (id,modKind,defs,m:rang // Bind definitions within modules //------------------------------------------------------------------------- +let TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) = + let ad = env.eAccessRights + let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) + let modrefs = mvvs |> List.map p23 + if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then + errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) + let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace) + modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) + let env = (if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env else env) + env + + +let ElimModuleDoBinding bind = + match bind with + | SynModuleDecl.DoExpr (spExpr,expr, m) -> + let bind2 = Binding (None,StandaloneExpression,false,false,[],PreXmlDoc.Empty,SynInfo.emptySynValData,SynPat.Wild m,None,expr,m,spExpr) + SynModuleDecl.Let(false,[bind2],m) + | _ -> bind + +let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_> list) env = + let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTycons env + let checkTycon (tycon: Tycon) = + if not tycon.IsTypeAbbrev && Zset.contains tycon freeInEnv then + let nm = tycon.DisplayName + errorR(Error(FSComp.SR.tcTypeUsedInInvalidWay(nm, nm, nm), tycon.Range)) + + binds |> MutRecShapes.iter (fst >> Option.iter checkTycon) ignore ignore + + let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTraitSolutions env + let checkBinds (binds: Binding list) = + for bind in binds do + if Zset.contains bind.Var freeInEnv then + let nm = bind.Var.DisplayName + errorR(Error(FSComp.SR.tcMemberUsedInInvalidWay(nm, nm, nm), bind.Var.Range)) + + binds |> MutRecShapes.iter (snd >> checkBinds) checkBinds ignore + +let CheckLetInNamespace binds m = + match binds with + // ignore solitary '()' expressions and 'do ()' bindings, since these are allowed in namespaces + // for the purposes of attaching attributes to an assembly, e.g. + // namespace A.B.C + // [] + // do() + + | [ Binding (None,(StandaloneExpression | DoBinding),false,false,[],_,_,_,None,(SynExpr.Do (SynExpr.Const (SynConst.Unit,_),_) | SynExpr.Const (SynConst.Unit,_)),_,_) ] -> + () + | [] -> + error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),m)) + | _ -> + error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),binds.Head.RangeOfHeadPat)) + let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((ModuleOrNamespaceExpr list -> ModuleOrNamespaceExpr list) * _) * tcEnv = eventually { cenv.synArgNameGenerator.Reset() @@ -15268,17 +15572,10 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu //printfn "----------\nCHECKING, e = %+A\n------------------\n" e try - match e with + match ElimModuleDoBinding e with | SynModuleDecl.ModuleAbbrev (id,p,m) -> - let ad = env.eAccessRights - let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) - let modrefs = mvvs |> List.map p23 - if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then - errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) - let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace) - modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) - let env = (if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env else env) + let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) return ((fun e -> e), []), env, env | SynModuleDecl.Exception (edef,m) -> @@ -15287,23 +15584,14 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu | SynModuleDecl.Types (typeDefs,m) -> let scopem = unionRanges m scopem - let binds,tycons,env' = TcTypeDeclarations.TcTyconDefns cenv env parent tpenv (typeDefs,m,scopem) + let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefns cenv env parent tpenv (mutRecDefns, m, scopem) // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = - let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTycons env - tycons |> List.iter(fun tycon -> - if not tycon.IsTypeAbbrev && Zset.contains tycon freeInEnv then - let nm = tycon.DisplayName - errorR(Error(FSComp.SR.tcTypeUsedInInvalidWay(nm, nm, nm), tycon.Range))) - - let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTraitSolutions env - binds |> List.iter(fun bind -> - let nm = bind.Var.DisplayName - if Zset.contains bind.Var freeInEnv then errorR(Error(FSComp.SR.tcMemberUsedInInvalidWay(nm, nm, nm), bind.Var.Range))) - - TMDefRec(tycons,FlatList.ofList binds,[],m) :: e + TcMutRecDefnsEscapeCheck mutRecDefnsChecked env + TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e //(tycons,FlatList.ofList binds,[],m) :: e - return (exprfWithEscapeCheck,[]),env', env' + return (exprfWithEscapeCheck, []), envAfter, envAfter | SynModuleDecl.Open (LongIdentWithDots(mp,_),m) -> let scopem = unionRanges m.EndRange scopem @@ -15314,52 +15602,21 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu match parent with | ParentNone -> - - match binds with - // ignore solitary '()' expressions and 'do ()' bindings, since these are allowed in namespaces - // for the purposes of attaching attributes to an assembly, e.g. - // namespace A.B.C - // [] - // do() - - | [ Binding (None,(StandaloneExpression | DoBinding),false,false,[],_,_,_, - None,(SynExpr.Do (SynExpr.Const (SynConst.Unit,_),_) | SynExpr.Const (SynConst.Unit,_)), - _,_) ] -> - return (id,[]), env, env - | [] -> - return error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),m)) - | _ -> - return error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),binds.Head.RangeOfHeadPat)) + CheckLetInNamespace binds m + return (id,[]), env, env | Parent parentModule -> - //do - // for b in binds do - // printfn "----------\nb = %+A\n------------------\n" b - // match b with - // | Binding (None,DoBinding,_,_,_,_,_,_,BindingRhs(_,_,e),_,_) -> - // printfn "----------\ne = %+A, #binds = %d\n------------------\n" e binds.Length - // | _ -> - // () let containerInfo = ModuleOrNamespaceContainerInfo(parentModule) if letrec then let scopem = unionRanges m scopem - let binds = binds |> List.map (fun bind -> RecBindingDefn(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind)) + let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind)) let binds,env,_ = TcLetrec WarnOnOverrides cenv env tpenv (binds,m, scopem) return ((fun e -> TMDefRec([],FlatList.ofList binds,[],m) :: e),[]), env, env else let binds,env,_ = TcLetBindings cenv env containerInfo ModuleOrMemberBinding tpenv (binds,m,scopem) return ((fun e -> binds@e),[]), env, env - | SynModuleDecl.DoExpr (spExpr,expr, m) -> - - let bind = - Binding (None, - StandaloneExpression, - false,false,[],PreXmlDoc.Empty,SynInfo.emptySynValData, - SynPat.Wild m, - None,expr,m,spExpr) - - return! TcModuleOrNamespaceElement cenv parent scopem env (SynModuleDecl.Let(false,[bind],m)) + | SynModuleDecl.DoExpr _ -> return! failwith "unreachable" | SynModuleDecl.Attributes (synAttrs,_) -> let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs @@ -15372,9 +15629,9 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let id = ComputeModuleName longPath let modAttrs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs - let modKind = ComputeModuleOrNamespaceKind cenv.g true modAttrs + let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g true modAttrs - CheckForDuplicateConcreteType cenv env (AdjustModuleName modKind id.idText) im + CheckForDuplicateConcreteType cenv env (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText) im CheckForDuplicateModule cenv env id.idText id.idRange let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent @@ -15461,13 +15718,104 @@ and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) ( return List.rev defsSoFar,env, envAtEnd } +and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModuleDecl list) = + eventually { + + let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges + let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) + + let mutRecDefns = + let rec loop dfs = + [ for def in dfs do + match ElimModuleDoBinding def with + + | SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" + //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) + //return ((fun e -> e), []), env, env + + | SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" + //| SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> + // let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr + // let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) + // yield Choice1Of2 (SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) + + | SynModuleDecl.Types (typeDefs,_) -> + for typeDef in typeDefs do + yield MutRecShape.Tycon typeDef + + | SynModuleDecl.Open _ -> failwith "open not allowed in mutrec sections yet" + //let scopem = unionRanges m.EndRange scopem + //let env = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp + //return ((fun e -> e),[]), env, env + + | SynModuleDecl.Let (letrec, binds, m) -> + + match parent with + | ParentNone -> CheckLetInNamespace binds m + | Parent parentModule -> + let containerInfo = ModuleOrNamespaceContainerInfo(parentModule) + let recBinds = [ for bind in binds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind) ] + if letrec then yield MutRecShape.Lets recBinds + else yield! List.map (List.singleton >> MutRecShape.Lets) recBinds + + | SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" + //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs + //return ((fun e -> e), attrs), env, env + + | SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" + | SynModuleDecl.NestedModule(compInfo,synDefs,_isContinuingModule,_m) -> + let mutRecDefs = loop synDefs + yield MutRecShape.Module (compInfo, mutRecDefs) + + | SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" + | SynModuleDecl.DoExpr _ -> failwith "unreachable" + ] + loop defs + + let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns,m,scopem) + // Check the non-escaping condition as we build the expression on the way back up + let exprfWithEscapeCheck e = + TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial + TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e + + //return List.rev defsSoFar,env, envAtEnd + return [(exprfWithEscapeCheck,[])],envAfter, envAfter + + } + +and TcMutRecDefsFinish cenv defs m = + let tycons = defs |> List.choose (function MutRecShape.Tycon (Some tycon,_) -> Some tycon | _ -> None) + let binds = defs |> List.collect (function MutRecShape.Tycon (_,binds) | MutRecShape.Lets binds -> binds | _ -> []) + let mods = + defs |> List.choose (function + | MutRecShape.Tycon _ | MutRecShape.Lets _ -> None + | MutRecShape.Module ((MutRecDefnsPass2DataForModule(mtypeAcc, mspec), _),mdefs) -> + let mexpr = TcMutRecDefsFinish cenv mdefs m + // Apply the functions for each declaration to build the overall expression-builder + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc + //let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) + // Collect up the attributes that are global to the file + //let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] + Some (ModuleOrNamespaceBinding(mspec,mexpr))) + + TMDefRec(tycons,binds,mods,m) + and TcModuleOrNamespaceElements cenv parent endm env xml defs = eventually { // Ensure the deref_nlpath call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - let! compiledDefs, env, envAtEnd = TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs + let! compiledDefs, env, envAtEnd = + eventually { + match defs with + // Hack, "do 0xABBA" indicates a mutrec section + | SynModuleDecl.DoExpr (_,SynExpr.Do (SynExpr.Const (SynConst.Int32 0xabba ,_), _), _) :: defs -> + return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + | _ -> + return! TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs + } // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) @@ -15479,8 +15827,8 @@ and TcModuleOrNamespaceElements cenv parent endm env xml defs = and TcModuleOrNamespace cenv env (id,isModule,defs,xml,modAttrs,vis,m:range) = eventually { let endm = m.EndRange - let modKind = ComputeModuleOrNamespaceKind cenv.g isModule modAttrs - let id = ident (AdjustModuleName modKind id.idText, id.idRange) + let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule modAttrs + let id = ident (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText, id.idRange) CheckNamespaceModuleOrTypeName cenv.g id diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 8af77f96dcd..939295309ac 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1109,6 +1109,8 @@ and | TypeAbbrev of ParserDetail * SynType * range /// An abstract definition , "type X" | None of range + /// An exception definition , "exception E = ..." + //| Exception of SynExceptionDefnRepr member this.Range = match this with | Union(_,_,m) @@ -1118,6 +1120,7 @@ and | LibraryOnlyILAssembly(_,m) | TypeAbbrev(_,_,m) | None(m) -> m + // | Exception t -> t.Range and SynEnumCases = SynEnumCase list @@ -1238,25 +1241,30 @@ and /// 'exception E = ... ' and [] - SynExceptionRepr = - | ExceptionDefnRepr of SynAttributes * SynUnionCase * LongIdent option * PreXmlDoc * SynAccess option * range - member this.Range = match this with ExceptionDefnRepr(_,_,_,_,_,m) -> m + SynExceptionDefnRepr = + | SynExceptionDefnRepr of SynAttributes * SynUnionCase * LongIdent option * PreXmlDoc * SynAccess option * range + member this.Range = match this with SynExceptionDefnRepr(_,_,_,_,_,m) -> m /// 'exception E = ... with ...' and [] SynExceptionDefn = - | ExceptionDefn of SynExceptionRepr * SynMemberDefns * range + | SynExceptionDefn of SynExceptionDefnRepr * SynMemberDefns * range + member this.Range = + match this with + | SynExceptionDefn(_,_,m) -> m and - [] + [] SynTypeDefnRepr = | ObjectModel of SynTypeDefnKind * SynMemberDefns * range | Simple of SynTypeDefnSimpleRepr * range + //| Exception of SynExceptionDefnRepr member this.Range = match this with | ObjectModel(_,_,m) -> m | Simple(_,m) -> m + //| Exception t -> t.Range and [] @@ -1336,7 +1344,7 @@ and SynModuleDecls = SynModuleDecl list and [] SynExceptionSig = - | ExceptionSig of SynExceptionRepr * SynMemberSigs * range + | SynExceptionSig of SynExceptionDefnRepr * SynMemberSigs * range and [] diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 8b12825e181..63bf263853b 100755 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -281,7 +281,7 @@ let rangeOfLongIdent(lid:LongIdent) = %type <(Ast.SynEnumCase, Ast.SynUnionCase) Choice list> unionTypeRepr %type tyconDefnAugmentation %type exconDefn -%type exconCore +%type exconCore %type moduleDefnsOrExprPossiblyEmptyOrBlock %type openDecl %type path @@ -752,8 +752,8 @@ moduleSpfn: | opt_attributes opt_declVisibility exconSpfn { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); - let (ExceptionSig(ExceptionDefnRepr(cas,a,b,c,d,d2),e,f)) = $3 - let ec = (ExceptionSig(ExceptionDefnRepr($1@cas,a,b,c,d,d2),e,f)) + let (SynExceptionSig(SynExceptionDefnRepr(cas,a,b,c,d,d2),e,f)) = $3 + let ec = (SynExceptionSig(SynExceptionDefnRepr($1@cas,a,b,c,d,d2),e,f)) SynModuleSigDecl.Exception(ec, rhs parseState 3) } | OPEN path @@ -1011,7 +1011,7 @@ memberSpecFlags: /* Part of an exception definition in a signature file */ exconSpfn: | exconCore opt_classSpfn - { ExceptionSig($1,$2,lhs parseState) } + { SynExceptionSig($1,$2,lhs parseState) } /* The optional augmentation on a type definition in a signature */ @@ -1212,9 +1212,9 @@ moduleDefn: /* 'exception' definitions */ | opt_attributes opt_declVisibility exconDefn { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); - let (ExceptionDefn(ExceptionDefnRepr(cas,a,b,c,d,d2),e,f)) = $3 + let (SynExceptionDefn(SynExceptionDefnRepr(cas,a,b,c,d,d2),e,f)) = $3 let f = (f, $1) ||> unionRangeWithListBy (fun a -> a.Range) - let ec = (ExceptionDefn(ExceptionDefnRepr($1@cas,a,b,c,d,d2),e,f)) + let ec = (SynExceptionDefn(SynExceptionDefnRepr($1@cas,a,b,c,d,d2),e,f)) [ SynModuleDecl.Exception(ec, f) ] } /* 'module' definitions */ @@ -2310,7 +2310,7 @@ fieldDecl: /* An exception definition */ exconDefn: | exconCore opt_classDefn - { ExceptionDefn($1,$2, ($1.Range,$2) ||> unionRangeWithListBy (fun cd -> cd.Range) ) } + { SynExceptionDefn($1,$2, ($1.Range,$2) ||> unionRangeWithListBy (fun cd -> cd.Range) ) } /* Part of an exception definition */ exceptionAndGrabDoc: @@ -2319,7 +2319,7 @@ exceptionAndGrabDoc: /* Part of an exception definition */ exconCore: | exceptionAndGrabDoc opt_attributes opt_access exconIntro exconRepr - { ExceptionDefnRepr($2,$4,$5,$1,$3,(match $5 with None -> rhs2 parseState 1 4 | Some p -> unionRanges (rangeOfLongIdent p) (rhs2 parseState 1 4))) } + { SynExceptionDefnRepr($2,$4,$5,$1,$3,(match $5 with None -> rhs2 parseState 1 4 | Some p -> unionRanges (rangeOfLongIdent p) (rhs2 parseState 1 4))) } /* Part of an exception definition */ exconIntro: diff --git a/src/fsharp/vs/ServiceNavigation.fs b/src/fsharp/vs/ServiceNavigation.fs index 1ae8527e7d3..189f5bca271 100755 --- a/src/fsharp/vs/ServiceNavigation.fs +++ b/src/fsharp/vs/ServiceNavigation.fs @@ -216,7 +216,7 @@ module NavigationImpl = | SynModuleDecl.Types(tydefs, _) -> tydefs |> List.collect (processTycon baseName) - | SynModuleDecl.Exception(ExceptionDefn(ExceptionDefnRepr(_, (UnionCase(_, id, fldspec, _, _, _)), _, _, _, _), membDefns, _), m) -> + | SynModuleDecl.Exception(SynExceptionDefn(SynExceptionDefnRepr(_, (UnionCase(_, id, fldspec, _, _, _)), _, _, _, _), membDefns, _), m) -> // Exception declaration let nested = processMembers membDefns |> snd [ createDecl(baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested) ] diff --git a/src/fsharp/vs/ServiceParseTreeWalk.fs b/src/fsharp/vs/ServiceParseTreeWalk.fs index 5ea90cec877..1d08ff52b0f 100755 --- a/src/fsharp/vs/ServiceParseTreeWalk.fs +++ b/src/fsharp/vs/ServiceParseTreeWalk.fs @@ -455,12 +455,12 @@ module internal AstTraversal = let path = TraverseStep.TypeDefn tydef :: path [ match synTypeDefnRepr with - | ObjectModel(synTypeDefnKind, synMemberDefns, _oRange) -> + | SynTypeDefnRepr.ObjectModel(synTypeDefnKind, synMemberDefns, _oRange) -> // traverse inherit function is used to capture type specific data required for processing Inherit part let traverseInherit (synType : SynType, range : range) = visitor.VisitInheritSynMemberDefn(synComponentInfo, synTypeDefnKind, synType, synMemberDefns, range) yield! synMemberDefns |> normalizeMembersToDealWithPeculiaritiesOfGettersAndSetters path traverseInherit - | Simple(synTypeDefnSimpleRepr, _range) -> + | SynTypeDefnRepr.Simple(synTypeDefnSimpleRepr, _range) -> match synTypeDefnSimpleRepr with | SynTypeDefnSimpleRepr.TypeAbbrev(_,synType,m) -> yield dive synTypeDefnRepr synTypeDefnRepr.Range (fun _ -> visitor.VisitTypeAbbrev(synType,m)) diff --git a/src/fsharp/vs/ServiceUntypedParse.fs b/src/fsharp/vs/ServiceUntypedParse.fs index 41be8d2e465..d4f1b1a606a 100755 --- a/src/fsharp/vs/ServiceUntypedParse.fs +++ b/src/fsharp/vs/ServiceUntypedParse.fs @@ -318,7 +318,7 @@ type FSharpParseFileResults(errors : FSharpErrorInfo[], input : Ast.ParsedInput | SynModuleDecl.Types(tydefs, m) -> if rangeContainsPos m pos then for d in tydefs do yield! walkTycon d - | SynModuleDecl.Exception(ExceptionDefn(ExceptionDefnRepr(_, _, _, _, _, _), membDefns, _), m) -> + | SynModuleDecl.Exception(SynExceptionDefn(SynExceptionDefnRepr(_, _, _, _, _, _), membDefns, _), m) -> if rangeContainsPos m pos then for m in membDefns do yield! walkMember m | _ -> From f037a9c9f0ac14763ad2c71856e8e0ca551143c8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 9 Mar 2016 16:42:31 +0000 Subject: [PATCH 046/334] fix to crashing case --- src/fsharp/TypeChecker.fs | 164 +++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 72 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index eaef42c2927..63090b55717 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -548,21 +548,24 @@ let UnifyTypes cenv (env: TcEnv) m expectedTy actualTy = //------------------------------------------------------------------------- let MakeInitialEnv env = - (* Note: here we allocate a new module type accumulator *) + // Note: here we allocate a new module type accumulator let mtypeAcc = ref (NewEmptyModuleOrNamespaceType Namespace) { env with eModuleOrNamespaceTypeAccumulator = mtypeAcc },mtypeAcc -let MakeInnerEnv env nm modKind = +let MakeInnerEnvWithAcc env nm mtypeAcc modKind = let path = env.ePath @ [nm] - (* Note: here we allocate a new module type accumulator *) - let mtypeAcc = ref (NewEmptyModuleOrNamespaceType modKind) let cpath = env.eCompPath.NestedCompPath nm.idText modKind { env with ePath = path eCompPath = cpath eAccessPath = cpath eAccessRights = computeAccessRights cpath env.eInternalsVisibleCompPaths env.eFamilyType // update this computed field eNameResEnv = { env.eNameResEnv with eDisplayEnv = env.DisplayEnv.AddOpenPath (pathOfLid path) } - eModuleOrNamespaceTypeAccumulator = mtypeAcc },mtypeAcc + eModuleOrNamespaceTypeAccumulator = mtypeAcc } + +let MakeInnerEnv env nm modKind = + // Note: here we allocate a new module type accumulator + let mtypeAcc = ref (NewEmptyModuleOrNamespaceType modKind) + MakeInnerEnvWithAcc env nm mtypeAcc modKind,mtypeAcc let MakeInnerEnvForTyconRef _cenv env tcref isExtrinsicExtension = @@ -3791,6 +3794,8 @@ module MutRecShapes = let mapTycons f1 xs = map f1 id id xs + let mapTyconsAndLets f1 f2 xs = map f1 f2 id xs + let mapLets f2 xs = map id f2 id xs let mapModules f1 xs = map id id f1 xs let rec mapWithEnv f1 f2 (env: 'Env) x = @@ -3801,23 +3806,24 @@ module MutRecShapes = let mapTyconsWithEnv f1 env xs = mapWithEnv f1 (fun _env x -> x) env xs - let rec mapTyconAndModulesWithParent parent f1 f2 xs = + let rec mapWithParent parent f1 f2 f3 xs = xs |> List.map (function | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) - | MutRecShape.Lets b -> MutRecShape.Lets b + | MutRecShape.Lets b -> MutRecShape.Lets (f3 parent b) | MutRecShape.Module (c,d) -> let c2, parent2 = f1 parent c - MutRecShape.Module (c2, mapTyconAndModulesWithParent parent2 f1 f2 d)) + MutRecShape.Module (c2, mapWithParent parent2 f1 f2 f3 d)) - let rec computeEnvs f1 (env: 'Env) xs = - let env = f1 env xs + let rec computeEnvs f1 f2 (env: 'Env) xs = + let env = f2 env xs env, xs |> List.map (function | MutRecShape.Tycon a -> MutRecShape.Tycon a | MutRecShape.Lets b -> MutRecShape.Lets b | MutRecShape.Module (c,ds) -> - let env2, ds2 = computeEnvs f1 env ds - MutRecShape.Module ((c,env2), ds2)) + let env2 = f1 env c + let env3, ds2 = computeEnvs f1 f2 env2 ds + MutRecShape.Module ((c,env3), ds2)) let rec extendEnvs f1 (env: 'Env) xs = let env = f1 env xs @@ -3828,8 +3834,8 @@ module MutRecShapes = MutRecShape.Module ((c,env2), ds2) | x -> x) - let rec recomputeEnvs f1 (env: 'Env) xs = - let env2, xs2 = xs |> computeEnvs f1 env + let rec recomputeEnvs f1 f2 (env: 'Env) xs = + let env2, xs2 = xs |> computeEnvs f1 f2 env env2, xs2 |> mapModules (fun ((data,_oldEnv : 'Env),newEnv) -> (data,newEnv)) let rec expandTycons f1 xs = @@ -3839,13 +3845,6 @@ module MutRecShapes = | MutRecShape.Lets _ -> [elem] | MutRecShape.Module (c,d) -> [MutRecShape.Module (c, expandTycons f1 d)]) - let rec mapFold f1 z xs = - (z,xs) ||> List.mapFold (fun z x -> - match x with - | MutRecShape.Tycon _ -> let x2,z = f1 z x in x2, z - | MutRecShape.Lets _ -> let x2,z = f1 z x in x2, z - | MutRecShape.Module (c,ds) -> let ds2,z = mapFold f1 z ds in MutRecShape.Module (c, ds2),z) - let rec mapFoldWithEnv f1 z env xs = (z,xs) ||> List.mapFold (fun z x -> match x with @@ -3870,6 +3869,7 @@ module MutRecShapes = | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 d) let iterTycons f1 x = iter f1 ignore ignore x + let iterModules f1 x = iter ignore ignore f1 x let rec iterWithEnv f1 f2 env x = x |> List.iter (function @@ -3882,8 +3882,8 @@ module MutRecShapes = type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * DeclKind * SynBinding -type MutRecSignatureInitialData = MutRecShape list -type MutRecDefnsInitialData = MutRecShape list +type MutRecSignatureInitialData = MutRecShape list +type MutRecDefnsInitialData = MutRecShape list type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool type MutRecDefnsPass1Data = MutRecShape list @@ -6155,7 +6155,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo,bind) = // 4a1. normalize the binding (note: needlessly repeating what we've done above) let (NormalizedBinding(vis,bkind,isInline,isMutable,attrs,doc,synTyparDecls,valSynData,p,bindingRhs,mBinding,spBind)) = bind let (SynValData(memberFlagsOpt,_,_)) = valSynData - // 4a2. adjust the binding, especially in the "member" case, a subset of the logic of AnalyzeAndMakeRecursiveValue + // 4a2. adjust the binding, especially in the "member" case, a subset of the logic of AnalyzeAndMakeAndPublishRecursiveValue let bindingRhs,logicalMethId,memberFlags = let rec lookPat p = match p,memberFlagsOpt with @@ -10367,7 +10367,7 @@ and CheckForNonAbstractInterface declKind tcref memberFlags m = error(Error(FSComp.SR.tcConcreteMembersIllegalInInterface(),m)) //------------------------------------------------------------------------- -// TcLetrec - AnalyzeAndMakeRecursiveValue(s) +// TcLetrec - AnalyzeAndMakeAndPublishRecursiveValue(s) //------------------------------------------------------------------------ and AnalyzeRecursiveStaticMemberOrValDecl (cenv, envinner: TcEnv, tpenv, declKind, newslotsOK, overridesOK, tcrefContainerInfo, vis1, id:Ident, vis2, declaredTypars, memberFlagsOpt, thisIdOpt, bindingAttribs, valSynInfo, ty, bindingRhs, mBinding, flex) = @@ -10535,7 +10535,7 @@ and AnalyzeRecursiveDecl (cenv,envinner,tpenv,declKind,synTyparDecls,declaredTyp /// and overrides). At this point we perform override inference, to infer /// which method we are overriding, in order to add constraints to the /// implementation of the method. -and AnalyzeAndMakeRecursiveValue overridesOK isGeneratedEventVal cenv (env:TcEnv) (tpenv,recBindIdx) (NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,binding)) = +and AnalyzeAndMakeAndPublishRecursiveValue overridesOK isGeneratedEventVal cenv (env:TcEnv) (tpenv,recBindIdx) (NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,binding)) = // Pull apart the inputs let (NormalizedBinding(vis1,bindingKind,isInline,isMutable,bindingSynAttribs,bindingXmlDoc,synTyparDecls,valSynData,declPattern,bindingRhs,mBinding,spBind)) = binding @@ -10593,7 +10593,7 @@ and AnalyzeAndMakeRecursiveValue overridesOK isGeneratedEventVal cenv (env:TcEnv let extraBindings = [ for extraBinding in EventDeclarationNormalization.GenerateExtraBindings cenv (bindingAttribs,binding) do yield (NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,extraBinding)) ] - let res,(tpenv,recBindIdx) = List.mapFold (AnalyzeAndMakeRecursiveValue overridesOK true cenv env) (tpenv,recBindIdx) extraBindings + let res,(tpenv,recBindIdx) = List.mapFold (AnalyzeAndMakeAndPublishRecursiveValue overridesOK true cenv env) (tpenv,recBindIdx) extraBindings let extraBindings, extraValues = List.unzip res List.concat extraBindings, List.concat extraValues, tpenv,recBindIdx @@ -10631,9 +10631,9 @@ and AnalyzeAndMakeRecursiveValue overridesOK isGeneratedEventVal cenv (env:TcEnv ((primaryBinding::extraBindings),(vspec::extraValues)),(tpenv,recBindIdx) -and AnalyzeAndMakeRecursiveValues overridesOK cenv env tpenv binds = +and AnalyzeAndMakeAndPublishRecursiveValues overridesOK cenv env tpenv binds = let recBindIdx = 0 - let res,tpenv = List.mapFold (AnalyzeAndMakeRecursiveValue overridesOK false cenv env) (tpenv,recBindIdx) binds + let res,tpenv = List.mapFold (AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv env) (tpenv,recBindIdx) binds let bindings, values = List.unzip res List.concat bindings, List.concat values, tpenv @@ -11082,7 +11082,7 @@ and TcLetrec overridesOK cenv env tpenv (binds,bindsm,scopem) = // Create prelimRecValues for the recursive items (includes type info from LHS of bindings) *) let binds = binds |> List.map (fun (RecDefnBindingInfo(a,b,c,bind)) -> NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env bind)) - let uncheckedRecBinds,prelimRecValues,(tpenv,_) = AnalyzeAndMakeRecursiveValues overridesOK cenv env tpenv binds + let uncheckedRecBinds,prelimRecValues,(tpenv,_) = AnalyzeAndMakeAndPublishRecursiveValues overridesOK cenv env tpenv binds let envRec = AddLocalVals cenv.tcSink scopem prelimRecValues env @@ -12330,7 +12330,7 @@ module TyconBindingChecking = begin let normRecDefns = [ for (RecDefnBindingInfo(a,b,c,bind)) in recBinds do yield NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForDefns bind) ] - let bindsAndValues,(tpenv,recBindIdx) = ((tpenv,recBindIdx), normRecDefns) ||> List.mapFold (AnalyzeAndMakeRecursiveValue ErrorOnOverrides false cenv envForDefns) + let bindsAndValues,(tpenv,recBindIdx) = ((tpenv,recBindIdx), normRecDefns) ||> List.mapFold (AnalyzeAndMakeAndPublishRecursiveValue ErrorOnOverrides false cenv envForDefns) let binds = bindsAndValues |> List.map fst |> List.concat let defnAs = MutRecShape.Lets binds @@ -12428,7 +12428,7 @@ module TyconBindingChecking = begin | _ -> () let rbind = NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,bind) let overridesOK = DeclKind.CanOverrideOrImplement(declKind) - let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeRecursiveValue overridesOK false cenv env (tpenv,recBindIdx) rbind + let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv env (tpenv,recBindIdx) rbind let cbinds = [ for rbind in binds -> PassAMember rbind ] let innerState = (incrClassCtorLhsOpt, env, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) @@ -12481,6 +12481,10 @@ module TyconBindingChecking = begin let uncheckedRecBinds = List.rev uncheckedBindsRev + // Updates the types of the modules to contain the inferred contents to far + defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + let envMutRec, defnsAs = (envMutRec, defnsAs) ||> MutRecShapes.extendEnvs (fun envCurrent decls -> @@ -12496,7 +12500,7 @@ module TyconBindingChecking = begin /// PassB: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = + let TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = let (defnsBs: MutRecBindingsPassB), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = @@ -12700,20 +12704,17 @@ module TyconBindingChecking = begin // Choose type scheme implicit constructors and adjust their recursive types. // Fixup recursive references to members. - let TcTyconBindings_PassC_FixupRecursiveReferences cenv tpenv (denv, defnsBs: MutRecBindingsPassB, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = + let TcMutRecBindings_PassC_FixupRecursiveReferences cenv (denv, defnsBs: MutRecBindingsPassB, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = // Build an index ---> binding map let generalizedBindingsMap = generalizedRecBinds |> List.map (fun pgrbind -> (pgrbind.RecBindingInfo.Index, pgrbind)) |> Map.ofList - let defnsCs,tpenv = - (tpenv, defnsBs) ||> MutRecShapes.mapFold (fun tpenv defnsB -> - match defnsB with - | MutRecShape.Lets _ -> failwith "unreachable (5)" - | MutRecShape.Module _ -> failwith "unreachable (6)" - | MutRecShape.Tycon defnsB -> - let (TyconBindingsPassB(tyconOpt, tcref, defnBs)) = defnsB + defnsBs |> MutRecShapes.mapTyconsAndLets - let defnCs, tpenv = - (tpenv,defnBs) ||> List.mapFold (fun tpenv defnB -> + // PassC: Fixup member bindings + (fun (TyconBindingsPassB(tyconOpt, tcref, defnBs)) -> + + let defnCs = + defnBs |> List.map (fun defnB -> // PassC: Generalise implicit ctor val match defnB with @@ -12721,35 +12722,40 @@ module TyconBindingChecking = begin let valscheme = incrClassCtorLhs.InstanceCtorValScheme let valscheme = ChooseCanonicalValSchemeAfterInference cenv.g denv valscheme scopem AdjustRecType cenv incrClassCtorLhs.InstanceCtorVal valscheme - PassCIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt),tpenv + PassCIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) | PassBInherit (inheritsExpr,basevOpt) -> - PassCInherit (inheritsExpr,basevOpt),tpenv + PassCInherit (inheritsExpr,basevOpt) | PassBIncrClassBindings bindRs -> - PassCIncrClassBindings bindRs,tpenv + PassCIncrClassBindings bindRs | PassBIncrClassCtorJustAfterSuperInit -> - PassCIncrClassCtorJustAfterSuperInit, tpenv + PassCIncrClassCtorJustAfterSuperInit | PassBIncrClassCtorJustAfterLastLet -> - PassCIncrClassCtorJustAfterLastLet, tpenv + PassCIncrClassCtorJustAfterLastLet | PassBMember idx -> // PassC: Fixup member bindings let generalizedBinding = generalizedBindingsMap.[idx] let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind - PassCMember pgbrind, tpenv) - let group = TyconBindingsPassC(tyconOpt, tcref,defnCs) - MutRecShape.Tycon group, tpenv) - (defnsCs,tpenv) + PassCMember pgbrind) + TyconBindingsPassC(tyconOpt, tcref,defnCs)) + + // PassC: Fixup let bindings + (fun bindIdxs -> + [ for idx in bindIdxs do + let generalizedBinding = generalizedBindingsMap.[idx] + let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding + yield FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind ]) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = + let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = // let (fixupValueExprBinds, methodBinds) = defnsCs |> MutRecShapes.mapTycons (fun (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> @@ -12916,7 +12922,7 @@ module TyconBindingChecking = begin let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) // PassB: type check pass, convert from ast to tast and collects type assertions, and generalize - let defnsBs, generalizedRecBinds, tpenv = TcTyconBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs, uncheckedRecBinds, scopem) + let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs, uncheckedRecBinds, scopem) let generalizedTyparsForRecursiveBlock = @@ -12984,12 +12990,12 @@ module TyconBindingChecking = begin ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envInitial.DisplayEnv tp // Now that we know what we've generalized we can adjust the recursive references - let defnsCs,tpenv = TcTyconBindings_PassC_FixupRecursiveReferences cenv tpenv (envInitial.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) + let defnsCs = TcMutRecBindings_PassC_FixupRecursiveReferences cenv (envInitial.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let defnsDs = TcTyconBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (envInitial.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) + let defnsDs = TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (envInitial.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) // INITIALIZATION GRAPHS // let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm @@ -14793,7 +14799,7 @@ module EstablishTypeDefinitionCores = begin // First define the type constructors and the abbreviations, if any. Skip augmentations. let withTycons = typeDefCores - |> MutRecShapes.mapTyconAndModulesWithParent + |> MutRecShapes.mapWithParent parent (fun innerParent modInfo -> TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial innerParent modInfo) (fun innerParent ((tyconDefCore,_) as c) -> @@ -14802,14 +14808,22 @@ module EstablishTypeDefinitionCores = begin if isAugmentationTyconDefnRepr repr then None else Some (TcTyconDefnCore_Phase0_BuildInitialTycon cenv envInitial innerParent tyconDefCore) c, tyconOpt) + (fun innerParent synBinds -> + let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") + [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) + // Compute the active environments at each nested module. + // // Add them to the environment, though this does not add the fields and // constructors (because we haven't established them yet). // We re-add them to the original environment later on. // We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles - see bug 952) let envMutRec, withEnvs = - (envInitial, withTycons) ||> MutRecShapes.computeEnvs (fun envAbove decls -> + (envInitial, withTycons) ||> MutRecShapes.computeEnvs + (fun envAbove (MutRecDefnsPass2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove decls -> + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt) -> tyconOpt | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPass2DataForModule (_, mspec),_) -> Some mspec | _ -> None) @@ -14824,6 +14838,11 @@ module EstablishTypeDefinitionCores = begin let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) envInner) + // Updates the types of the modules to contain the inferred contents so far + withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + + // Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. @@ -14927,12 +14946,14 @@ module EstablishTypeDefinitionCores = begin // Reconstruct the environments all over again - this will add the union cases and fields. let envMutRec, withNewEnvs = (envInitial, withBaseValsAndSafeInitInfos) - ||> MutRecShapes.recomputeEnvs (fun envAbove decls -> - let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) - let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) - let envInner = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove - let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) - envInner) + ||> MutRecShapes.recomputeEnvs + (fun envAbove (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove decls -> + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) + let envInner = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + envInner) (tycons, envMutRec, withNewEnvs) @@ -15266,11 +15287,12 @@ module TcDeclarations = begin let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv envInitial parent false tpenv (mutRecDefnsAfterSplit,m,scopem) let mutRecDefnsAfterPrep = - mutRecDefnsAfterCore |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> + mutRecDefnsAfterCore + |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> let (MutRecDefnsPass1DataForTycon(synTyconInfo,repr,_,_,_)) = typeDefnCore let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) - + let withBindings,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) // Note: generating these bindings must come after generating the members, since some in the case of structs some fields @@ -15725,7 +15747,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let mutRecDefns = - let rec loop dfs = + let rec loop dfs : MutRecDefnsInitialData = [ for def in dfs do match ElimModuleDoBinding def with @@ -15752,11 +15774,9 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu match parent with | ParentNone -> CheckLetInNamespace binds m - | Parent parentModule -> - let containerInfo = ModuleOrNamespaceContainerInfo(parentModule) - let recBinds = [ for bind in binds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind) ] - if letrec then yield MutRecShape.Lets recBinds - else yield! List.map (List.singleton >> MutRecShape.Lets) recBinds + | Parent _ -> + if letrec then yield MutRecShape.Lets binds + else yield! List.map (List.singleton >> MutRecShape.Lets) binds | SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs From 7ac55811418f78f2aec8f9accb96dd9d47cad11d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 9 Mar 2016 17:33:01 +0000 Subject: [PATCH 047/334] poke README for appveyor ci --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index adfd5dd3412..55f1a696d68 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,4 @@ Although the primary focus of this repo is F# for Windows and the Visual Studio Keep up with the Visual F# Team and the development of the Visual F# Tools by following us [@VisualFSharp](https://twitter.com/VisualFSharp) or subscribing to our [team blog](http://blogs.msdn.com/b/fsharpteam/). + From 47619e02f0b7f329c6cf21498b1dacc3ff52cd2e Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 9 Mar 2016 18:10:42 +0000 Subject: [PATCH 048/334] fix build break --- src/fsharp/TypeChecker.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 63090b55717..b0c790173c5 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15376,7 +15376,7 @@ module TcDeclarations = begin let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) let _ = TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefnsAfterCore - env + envMutRec end //------------------------------------------------------------------------- From 9f66545dae2199ada3ffd3a629509ba0bf155247 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 9 Mar 2016 18:37:37 +0000 Subject: [PATCH 049/334] fix extensions in sigs --- src/FSharpSource.targets | 2 +- src/fsharp/TypeChecker.fs | 64 +++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 6dfc90431cd..133d8162eff 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -91,7 +91,7 @@ - true + false DEBUG;NO_STRONG_NAMES;$(DefineConstants) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b0c790173c5..046ca2ec732 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3885,7 +3885,7 @@ type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * Dec type MutRecSignatureInitialData = MutRecShape list type MutRecDefnsInitialData = MutRecShape list -type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool +type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool type MutRecDefnsPass1Data = MutRecShape list type MutRecDefnsPass2DataForTycon = MutRecDefnsPass2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK @@ -13705,7 +13705,7 @@ module EstablishTypeDefinitionCores = begin /// Get the component types that make a record, union or struct type. /// /// Used when determining if a structural type supports structural comparison. - let private GetStructuralElementsOfTyconDefn cenv env tpenv (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) tycon = + let private GetStructuralElementsOfTyconDefn cenv env tpenv (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) tycon = let thisTyconRef = mkLocalTyconRef tycon let m = tycon.Range let env = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) env @@ -13756,7 +13756,7 @@ module EstablishTypeDefinitionCores = begin /// - computing the mangled name for C /// but /// - we don't yet 'properly' establish constraints on type parameters - let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor)) = + let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor, _)) = let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) @@ -13799,7 +13799,7 @@ module EstablishTypeDefinitionCores = begin /// /// synTyconInfo: Syntactic AST for the name, attributes etc. of the type constructor /// synTyconRepr: Syntactic AST for the RHS of the type definition - let private TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,_,_)) (tycon:Tycon) = + let private TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,_,_,_)) (tycon:Tycon) = let (ComponentInfo(synAttrs,typars, _,_, _, _,_,_)) = synTyconInfo let m = tycon.Range let id = tycon.Id @@ -14078,7 +14078,7 @@ module EstablishTypeDefinitionCores = begin // such as 'isTupleTy' will return reliable results, e.g. isTupleTy on the /// TAST type for 'PairOfInts' will report 'true' // - let private TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14150,7 +14150,7 @@ module EstablishTypeDefinitionCores = begin (envMutRec, mutRecDecls) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (tyconDefCore,_), Some (tycon, checkedAttrs) -> - let (MutRecDefnsPass1DataForTycon(_,synTyconRepr,explicitImplements,_,_)) = tyconDefCore + let (MutRecDefnsPass1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = tyconDefCore let m = tycon.Range let tcref = mkLocalTyconRef tycon let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner @@ -14239,7 +14239,7 @@ module EstablishTypeDefinitionCores = begin with e -> errorRecovery e m)) /// Establish the fields, dispatch slots and union cases of a type - let private TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range try let id = tycon.Id @@ -14766,7 +14766,10 @@ module EstablishTypeDefinitionCores = begin tycon.Data.entity_tycon_repr <- TNoRepr errorR(Error(FSComp.SR.tcTypeDefinitionIsCyclicThroughInheritance(),tycon.Range))) - let isAugmentationTyconDefnRepr x = match x with (SynTypeDefnSimpleRepr.General(TyconAugmentation,_,_,_,_,_,_,_)) -> true | _ -> false + let isAugmentationTyconDefnRepr x = + match x with + | (SynTypeDefnSimpleRepr.General(TyconAugmentation,_,_,_,_,_,_,_)) -> true + | _ -> false let ComputeModuleOrNamespaceKind g isModule attribs = if not isModule then Namespace @@ -14803,10 +14806,12 @@ module EstablishTypeDefinitionCores = begin parent (fun innerParent modInfo -> TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial innerParent modInfo) (fun innerParent ((tyconDefCore,_) as c) -> - let (MutRecDefnsPass1DataForTycon(_,repr,_,_,_)) = tyconDefCore + let (MutRecDefnsPass1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = tyconDefCore let tyconOpt = - if isAugmentationTyconDefnRepr repr then None - else Some (TcTyconDefnCore_Phase0_BuildInitialTycon cenv envInitial innerParent tyconDefCore) + if isAtOriginalTyconDefn then + Some (TcTyconDefnCore_Phase0_BuildInitialTycon cenv envInitial innerParent tyconDefCore) + else + None c, tyconOpt) (fun innerParent synBinds -> let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") @@ -14903,7 +14908,7 @@ module EstablishTypeDefinitionCores = begin (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo, tyconOpt) -> match origInfo, tyconOpt with | (tyconDefCore,_), Some tycon -> - let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_)) = tyconDefCore + let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner let thisTyconRef = mkLocalTyconRef tycon @@ -15244,14 +15249,16 @@ module TcDeclarations = begin memberFlags.MemberKind=MemberKind.Constructor | SynMemberDefn.ImplicitCtor (_,_,spats,_, _) -> isNil spats | _ -> false) - - let core = MutRecDefnsPass1DataForTycon(synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m), implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor) + let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m) + let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + let core = MutRecDefnsPass1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor,isAtOriginalTyconDefn) core, members @ extraMembers - | SynTypeDefnRepr.Simple(r,_) -> + | SynTypeDefnRepr.Simple(repr,_) -> let members = [] - let core = MutRecDefnsPass1DataForTycon(synTyconInfo,r,implements1,false,false) + let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + let core = MutRecDefnsPass1DataForTycon(synTyconInfo,repr,implements1,false,false,isAtOriginalTyconDefn) core, members @ extraMembers //| SynTypeDefnRepr.Exception(r) -> @@ -15283,14 +15290,14 @@ module TcDeclarations = begin //------------------------------------------------------------------------- let TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = + let inSig = false let mutRecDefnsAfterSplit = SplitMutRecDefns cenv mutRecDefns - let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv envInitial parent false tpenv (mutRecDefnsAfterSplit,m,scopem) + let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) let mutRecDefnsAfterPrep = mutRecDefnsAfterCore |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> - let (MutRecDefnsPass1DataForTycon(synTyconInfo,repr,_,_,_)) = typeDefnCore - let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) let withBindings,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) @@ -15344,26 +15351,31 @@ module TcDeclarations = begin let hasSelfReferentialCtor = false - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m),implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor) + let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m) + let isAtOriginalTyconDefn = true + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, repr,implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,isAtOriginalTyconDefn) - tyconCore, (synTyconInfo,true,members@extraMembers) + tyconCore, (synTyconInfo,members@extraMembers) // 'type X with ...' in a signature is always interpreted as an extrinsic extension. // Representation-hidden types with members and interfaces are written 'type X = ...' | SynTypeDefnSigRepr.Simple((SynTypeDefnSimpleRepr.None _ as r),_) when nonNil extraMembers -> - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false) - tyconCore, (synTyconInfo,false,extraMembers) + let isAtOriginalTyconDefn = false + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) + tyconCore, (synTyconInfo,extraMembers) | SynTypeDefnSigRepr.Simple(r,_) -> - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false) - tyconCore, (synTyconInfo,true,extraMembers) + let isAtOriginalTyconDefn = true + let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false,isAtOriginalTyconDefn) + tyconCore, (synTyconInfo,extraMembers) let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let private TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefns = // TODO - this is only checking the tycons in the signatures, need to do the module and let elements to - (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun env ((_, (synTyconInfo,isAtOriginalTyconDefn,members)), _, _) -> + (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun env ((tyconCore, (synTyconInfo,members)), _, _) -> let tpenv = emptyUnscopedTyparEnv + let (MutRecDefnsPass1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv env true m typars cs longPath From d3bd794cf45f0ad720170bf52d5f1aa27adeb44d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 13:17:13 +0000 Subject: [PATCH 050/334] fix access to protected constructors --- src/fsharp/TypeChecker.fs | 66 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 046ca2ec732..66dbe0b8c4a 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -12264,7 +12264,7 @@ module TyconBindingChecking = begin /// The collected syntactic input definitions for a single type or type-extension definition type TyconBindingsPassA = - | TyconBindingsPassA of Tycon option * Val list * TyconRef * Typar list * TType * TyconBindingPassA list + | TyconBindingsPassA of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPassA list type MutRecBindingPassA = MutRecShape @@ -12322,15 +12322,15 @@ module TyconBindingChecking = begin // uncheckedBindsRev: accumulation of unchecked bindings let (defnsAs: MutRecBindingsPassA), (tpenv,_,uncheckedBindsRev) = let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) - (initialOuterState, envMutRec, mutRecDecls) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDefns defns -> + (initialOuterState, envMutRec, mutRecDecls) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defns -> let (tpenv,recBindIdx,uncheckedBindsRev) = outerState match defns with | MutRecShape.Module _ -> failwith "unreachable" | MutRecShape.Lets recBinds -> let normRecDefns = [ for (RecDefnBindingInfo(a,b,c,bind)) in recBinds do - yield NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForDefns bind) ] - let bindsAndValues,(tpenv,recBindIdx) = ((tpenv,recBindIdx), normRecDefns) ||> List.mapFold (AnalyzeAndMakeAndPublishRecursiveValue ErrorOnOverrides false cenv envForDefns) + yield NormalizedRecBindingDefn(a,b,c,BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForDecls bind) ] + let bindsAndValues,(tpenv,recBindIdx) = ((tpenv,recBindIdx), normRecDefns) ||> List.mapFold (AnalyzeAndMakeAndPublishRecursiveValue ErrorOnOverrides false cenv envForDecls) let binds = bindsAndValues |> List.map fst |> List.concat let defnAs = MutRecShape.Lets binds @@ -12341,7 +12341,7 @@ module TyconBindingChecking = begin // Class members can access protected members of the implemented type // Class members can access private members in the typ let isExtrinsic = (declKind = ExtrinsicExtensionBinding) - let envForTycon = MakeInnerEnvForTyconRef cenv envForDefns tcref isExtrinsic + let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref isExtrinsic // Re-add the type constructor to make it take precedence for record label field resolutions // This does not apply to extension members: in those cases the relationship between the record labels @@ -12476,7 +12476,7 @@ module TyconBindingChecking = begin | rest -> rest let prelimRecValues = [ for x in defnAs do match x with PassAMember bind -> yield bind.RecBindingInfo.Val | _ -> () ] - let defnAs = MutRecShape.Tycon(TyconBindingsPassA(tyconOpt,prelimRecValues,tcref,copyOfTyconTypars,thisTy,defnAs)) + let defnAs = MutRecShape.Tycon(TyconBindingsPassA(tyconOpt,declKind,prelimRecValues,tcref,copyOfTyconTypars,thisTy,defnAs)) defnAs,(tpenv,recBindIdx,uncheckedBindsRev)) let uncheckedRecBinds = List.rev uncheckedBindsRev @@ -12490,7 +12490,7 @@ module TyconBindingChecking = begin ||> MutRecShapes.extendEnvs (fun envCurrent decls -> let prelimRecValues = decls |> List.collect (function - | MutRecShape.Tycon (TyconBindingsPassA(_,prelimRecValues,_,_,_,_)) -> prelimRecValues + | MutRecShape.Tycon (TyconBindingsPassA(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] | _ -> []) let envInner = AddLocalVals cenv.tcSink scopem prelimRecValues envCurrent @@ -12525,7 +12525,7 @@ module TyconBindingChecking = begin let initialOuterState = (tpenv,([]: PostGeneralizationRecursiveBinding list),([]: PreGeneralizationRecursiveBinding list),uncheckedRecBindsTable,envMutRec) - (initialOuterState,envMutRec,defnsAs) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDefns defnsA -> + (initialOuterState,envMutRec,defnsAs) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defnsA -> let (tpenv,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable,envNonRec) = outerState @@ -12535,7 +12535,7 @@ module TyconBindingChecking = begin let defnBs,(tpenv,_,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = - let initialInnerState = (tpenv,envForDefns,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) + let initialInnerState = (tpenv,envForDecls,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) (initialInnerState,binds) ||> List.mapFold (fun innerState rbind -> let (tpenv,envStatic,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = innerState @@ -12548,9 +12548,9 @@ module TyconBindingChecking = begin let outerState = (tpenv, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable, envNonRec) MutRecShape.Lets defnBs, outerState - | MutRecShape.Tycon (TyconBindingsPassA(tyconOpt, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> + | MutRecShape.Tycon (TyconBindingsPassA(tyconOpt, declKind, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> - let envForTycon = envForDefns + let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref (declKind = ExtrinsicExtensionBinding) // Set up the environment so use-before-definition warnings are given, at least // until we reach a PassAIncrClassCtorJustAfterSuperInit. let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } @@ -12755,10 +12755,10 @@ module TyconBindingChecking = begin // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = + let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = // let (fixupValueExprBinds, methodBinds) = - defnsCs |> MutRecShapes.mapTycons (fun (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> + (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> match defnCs with @@ -12799,7 +12799,7 @@ module TyconBindingChecking = begin | _ -> false) if needsSafeStaticInit && hasStaticBindings then - let rfield = MakeSafeInitField cenv.g envInitial tcref.Range true + let rfield = MakeSafeInitField cenv.g envForDecls tcref.Range true SafeInitField(mkRecdFieldRef tcref rfield.Name, rfield) else NoSafeInitInfo @@ -12818,10 +12818,10 @@ module TyconBindingChecking = begin if tcref.IsStructOrEnumTycon then mkUnit cenv.g tcref.Range, false,None, defnCs else - let inheritsExpr,_ = TcNewExpr cenv envInitial tpenv cenv.g.obj_ty None true (SynExpr.Const(SynConst.Unit,tcref.Range)) tcref.Range + let inheritsExpr,_ = TcNewExpr cenv envForDecls tpenv cenv.g.obj_ty None true (SynExpr.Const(SynConst.Unit,tcref.Range)) tcref.Range inheritsExpr,false,None,defnCs - let envForTycon = MakeInnerEnvForTyconRef cenv envInitial tcref false + let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref false // Compute the cpath used when creating the hidden fields let cpath = envForTycon.eAccessPath @@ -12858,7 +12858,7 @@ module TyconBindingChecking = begin let ctorValueExprBindings = [ (let ctorValueExprBinding = TBind(incrClassCtorLhs.InstanceCtorVal,ctorBodyLambdaExpr,NoSequencePointAtStickyBinding) let rbind = { ValScheme = incrClassCtorLhs.InstanceCtorValScheme ; Binding = ctorValueExprBinding } - FixupLetrecBind cenv envInitial.DisplayEnv generalizedTyparsForRecursiveBlock rbind) ] + FixupLetrecBind cenv envForDecls.DisplayEnv generalizedTyparsForRecursiveBlock rbind) ] @ ( match cctorBodyLambdaExprOpt with | None -> [] @@ -12866,7 +12866,7 @@ module TyconBindingChecking = begin [ (let _,cctorVal, cctorValScheme = incrClassCtorLhs.StaticCtorValInfo.Force() let cctorValueExprBinding = TBind(cctorVal,cctorBodyLambdaExpr,NoSequencePointAtStickyBinding) let rbind = { ValScheme = cctorValScheme; Binding = cctorValueExprBinding } - FixupLetrecBind cenv envInitial.DisplayEnv generalizedTyparsForRecursiveBlock rbind) ] ) + FixupLetrecBind cenv envForDecls.DisplayEnv generalizedTyparsForRecursiveBlock rbind) ] ) // Publish the fields of the representation to the type localReps.PublishIncrClassFields (cenv, denv, cpath, incrClassCtorLhs, safeStaticInitInfo) (* mutation *) @@ -12933,7 +12933,7 @@ module TyconBindingChecking = begin // Check the escape condition for all extraGeneralizableTypars. // First collect up all the extraGeneralizableTypars. let allExtraGeneralizableTypars = - defnsAs |> MutRecShapes.collectTycons |> List.collect (fun (TyconBindingsPassA(_, _, _, copyOfTyconTypars, _, defnAs)) -> + defnsAs |> MutRecShapes.collectTycons |> List.collect (fun (TyconBindingsPassA(_, _, _, _, copyOfTyconTypars, _, defnAs)) -> [ yield! copyOfTyconTypars for defnA in defnAs do match defnA with @@ -12987,15 +12987,15 @@ module TyconBindingChecking = begin for tp in unsolvedTyparsForRecursiveBlockInvolvingGeneralizedVariables do //printfn "solving unsolvedTyparsInvolvingGeneralizedVariable : %s #%d" tp.DisplayName tp.Stamp if (tp.Rigidity <> TyparRigidity.Rigid) && not tp.IsSolved then - ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envInitial.DisplayEnv tp + ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envMutRec.DisplayEnv tp // Now that we know what we've generalized we can adjust the recursive references - let defnsCs = TcMutRecBindings_PassC_FixupRecursiveReferences cenv (envInitial.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) + let defnsCs = TcMutRecBindings_PassC_FixupRecursiveReferences cenv (envMutRec.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let defnsDs = TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envInitial tpenv (envInitial.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) + let defnsDs = TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (envMutRec.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) // INITIALIZATION GRAPHS // let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm @@ -14889,9 +14889,9 @@ module EstablishTypeDefinitionCores = begin // Find all the field types in all the structrual types let tyconsWithStructuralTypes = (envMutRec,withEnvs) - ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo, tyconOpt) -> + ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with - | (typeDefCore,_), Some tycon -> Some (tycon,GetStructuralElementsOfTyconDefn cenv envinner tpenv typeDefCore tycon) + | (typeDefCore,_), Some tycon -> Some (tycon,GetStructuralElementsOfTyconDefn cenv envForDecls tpenv typeDefCore tycon) | _ -> None) |> MutRecShapes.collectTycons |> List.choose id @@ -14900,17 +14900,17 @@ module EstablishTypeDefinitionCores = begin let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv envMutRec.DisplayEnv tyconsWithStructuralTypes (envMutRec,withEnvs) - ||> MutRecShapes.iterTyconsWithEnv (fun envinner (_, tyconOpt) -> - tyconOpt |> Option.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv envinner scSet seSet)) + ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> + tyconOpt |> Option.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv envForDecls scSet seSet)) // Check and publish the explicit constraints. let checkExplicitConstraints checkCxs = - (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo, tyconOpt) -> + (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with | (tyconDefCore,_), Some tycon -> let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo - let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner + let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls let thisTyconRef = mkLocalTyconRef tycon let envinner = MakeInnerEnvForTyconRef cenv envinner thisTyconRef false try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envinner tpenv synTyconConstraints |> ignore @@ -15373,16 +15373,16 @@ module TcDeclarations = begin let private TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefns = // TODO - this is only checking the tycons in the signatures, need to do the module and let elements to - (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun env ((tyconCore, (synTyconInfo,members)), _, _) -> + (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members)), _, _) -> let tpenv = emptyUnscopedTyparEnv let (MutRecDefnsPass1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo - let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv env true m typars cs longPath + let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath - let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars env - let envinner = MakeInnerEnvForTyconRef cenv envinner tcref (declKind = ExtrinsicExtensionBinding) + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForDecls + let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon tcref (declKind = ExtrinsicExtensionBinding) - TcTyconMemberSpecs cenv envinner (TyconContainerInfo(parent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) + TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(parent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) let TcTyconSignatures cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs From 05cb3eaf5060f951314714f00f3e4fe1782ba29d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 13:34:24 +0000 Subject: [PATCH 051/334] get generalization environment right --- src/fsharp/TypeChecker.fs | 47 ++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 66dbe0b8c4a..25b59789a1f 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -12487,20 +12487,20 @@ module TyconBindingChecking = begin let envMutRec, defnsAs = (envMutRec, defnsAs) - ||> MutRecShapes.extendEnvs (fun envCurrent decls -> + ||> MutRecShapes.extendEnvs (fun envForDecls decls -> let prelimRecValues = decls |> List.collect (function | MutRecShape.Tycon (TyconBindingsPassA(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] | _ -> []) - let envInner = AddLocalVals cenv.tcSink scopem prelimRecValues envCurrent - envInner) + let envForDeclsUpdated = AddLocalVals cenv.tcSink scopem prelimRecValues envForDecls + envForDeclsUpdated) (envMutRec, defnsAs, uncheckedRecBinds, tpenv) /// PassB: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = + let TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = let (defnsBs: MutRecBindingsPassB), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = @@ -12523,7 +12523,7 @@ module TyconBindingChecking = begin // The envForTycon is the environment used for name resolution within the let and member bindings // of the type definition. This becomes 'envStatic' and 'envInstance' for the two - let initialOuterState = (tpenv,([]: PostGeneralizationRecursiveBinding list),([]: PreGeneralizationRecursiveBinding list),uncheckedRecBindsTable,envMutRec) + let initialOuterState = (tpenv,([]: PostGeneralizationRecursiveBinding list),([]: PreGeneralizationRecursiveBinding list),uncheckedRecBindsTable,envInitial) (initialOuterState,envMutRec,defnsAs) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defnsA -> @@ -12914,15 +12914,12 @@ module TyconBindingChecking = begin else None) - // Re-add the any tycons to get any C#-style extension members - let envMutRec = AddLocalTyconRefs true g cenv.amap scopem tcrefsWithCSharpExtensionMembers envMutRec - // PassA: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // PassA: also processes their arg patterns - collecting type assertions let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) // PassB: type check pass, convert from ast to tast and collects type assertions, and generalize - let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv (envMutRec, defnsAs, uncheckedRecBinds, scopem) + let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs, uncheckedRecBinds, scopem) let generalizedTyparsForRecursiveBlock = @@ -13118,12 +13115,12 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, let binds = - (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner tyconData -> + (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> let (MutRecDefnsPass2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData let ibinds = - let intfTypes = interfacesFromTypeDefn envinner tyconData - let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envinner.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) + let intfTypes = interfacesFromTypeDefn envForDecls tyconData + let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envForDecls.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat MutRecDefnsPass2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) @@ -14852,17 +14849,17 @@ module EstablishTypeDefinitionCores = begin // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. let withAttrs = - (envMutRec, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconOpt) -> + (envMutRec, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconOpt) -> let res = match origInfo, tyconOpt with - | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner tyconDefCore tycon) + | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envForDecls tyconDefCore tycon) | _ -> None origInfo, res) // Establish the abbreviations (no constraint checking, because constraints not yet established) - (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv FirstPass tyconDefCore tycon attrs + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass tyconDefCore tycon attrs | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. @@ -14910,10 +14907,10 @@ module EstablishTypeDefinitionCores = begin | (tyconDefCore,_), Some tycon -> let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo - let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls let thisTyconRef = mkLocalTyconRef tycon - let envinner = MakeInnerEnvForTyconRef cenv envinner thisTyconRef false - try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envinner tpenv synTyconConstraints |> ignore + let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon thisTyconRef false + try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore with e -> errorRecovery e m | _ -> ()) @@ -14921,13 +14918,13 @@ module EstablishTypeDefinitionCores = begin // No inferred constraints allowed on declared typars (envMutRec,withEnvs) - ||> MutRecShapes.iterTyconsWithEnv (fun envinner (_, tyconOpt) -> - tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envinner.DisplayEnv m))) + ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> + tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m))) // OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) - (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv SecondPass tyconDefCore tycon attrs + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass tyconDefCore tycon attrs | _ -> ()) (envMutRec, withAttrs) |> TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass @@ -14937,10 +14934,10 @@ module EstablishTypeDefinitionCores = begin // Now do the representations. Each baseValOpt is a residue from the representation which is potentially available when // checking the members. let withBaseValsAndSafeInitInfos = - (envMutRec,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + (envMutRec,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> let info = match origInfo, tyconAndAttrsOpt with - | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig tyconDefnCore tycon attrs + | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase6_EstablishRepresentation cenv envForDecls tpenv inSig tyconDefnCore tycon attrs | _ -> None, NoSafeInitInfo (origInfo, Option.map fst tyconAndAttrsOpt, info)) From 56ddb8d69e2e6c18db071d9fbf3dbb0c582ad800 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 13:52:37 +0000 Subject: [PATCH 052/334] get tycon environment right (2) --- src/fsharp/TypeChecker.fs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 25b59789a1f..ad73ec294b1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -11900,7 +11900,6 @@ module IncrClassChecking = begin let MakeCtorForIncrClassConstructionPassC (cenv, env: TcEnv, - _tpenv , /// The lhs information about the implicit constructor ctorInfo:IncrClassCtorLhs, /// The call to the super class constructor @@ -12361,7 +12360,7 @@ module TyconBindingChecking = begin (initialInnerState,binds) ||> List.collectFold (fun innerState defn -> let (TyconBindingDefn(containerInfo,newslotsOK,declKind,classMemberDef,m)) = defn - let (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) = innerState + let (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) = innerState if tcref.IsTypeAbbrev then error(Error(FSComp.SR.tcTypeAbbreviationsMayNotHaveMembers(),(trimRangeToLine m))) // ideally we'd have the 'm' of the type declaration stored here, to avoid needing to trim to line to approx if tcref.IsEnumTycon && (declKind <> ExtrinsicExtensionBinding) then error(Error(FSComp.SR.tcEnumerationsMayNotHaveMembers(),(trimRangeToLine m))) // ideally we'd have the 'm' of the type declaration stored here, to avoid needing to trim to line to approx @@ -12372,10 +12371,10 @@ module TyconBindingChecking = begin match tcref.TypeOrMeasureKind with TyparKind.Measure -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) | _ -> () // PassA: make incrClassCtorLhs - ctorv, thisVal etc, type depends on argty(s) - let incrClassCtorLhs = TcImplictCtorLhsPassA(cenv,env,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) + let incrClassCtorLhs = TcImplictCtorLhsPassA(cenv,envForTycon,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) // PassA: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref - let env = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars env - let innerState = (Some incrClassCtorLhs, env, tpenv, recBindIdx, uncheckedBindsRev) + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envForTycon + let innerState = (Some incrClassCtorLhs, envForTycon, tpenv, recBindIdx, uncheckedBindsRev) [PassAIncrClassCtor incrClassCtorLhs],innerState @@ -12384,7 +12383,7 @@ module TyconBindingChecking = begin // PassA: inherit typ(arg) as base - pass through // PassA: pick up baseValOpt! let baseValOpt = incrClassCtorLhsOpt |> Option.bind (fun x -> x.InstanceCtorBaseValOpt) - let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) [PassAInherit (typ,arg,baseValOpt,m); PassAIncrClassCtorJustAfterSuperInit], innerState @@ -12409,12 +12408,12 @@ module TyconBindingChecking = begin errorR(Error(FSComp.SR.tcStaticLetBindingsRequireClassesWithImplicitConstructors(),m)) // PassA: let-bindings - pass through - let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) [PassAIncrClassBindings (tcref,letBinds,isStatic,isRec,m)], innerState | SynMemberDefn.Member (bind,m),_ -> // PassA: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo - let (NormalizedBinding(_,_,_,_,_,_,_,valSynData,_,_,_,_)) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env bind + let (NormalizedBinding(_,_,_,_,_,_,_,valSynData,_,_,_,_)) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind let (SynValData(memberFlagsOpt,_,_)) = valSynData match tcref.TypeOrMeasureKind with | TyparKind.Type -> () @@ -12428,10 +12427,10 @@ module TyconBindingChecking = begin | _ -> () let rbind = NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,bind) let overridesOK = DeclKind.CanOverrideOrImplement(declKind) - let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv env (tpenv,recBindIdx) rbind + let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv envForTycon (tpenv,recBindIdx) rbind let cbinds = [ for rbind in binds -> PassAMember rbind ] - let innerState = (incrClassCtorLhsOpt, env, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) + let innerState = (incrClassCtorLhsOpt, envForTycon, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) cbinds,innerState #if OPEN_IN_TYPE_DECLARATIONS @@ -12550,10 +12549,13 @@ module TyconBindingChecking = begin | MutRecShape.Tycon (TyconBindingsPassA(tyconOpt, declKind, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> - let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref (declKind = ExtrinsicExtensionBinding) + let isExtrinsic = (declKind = ExtrinsicExtensionBinding) + let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref isExtrinsic + let envForTycon = if isExtrinsic then envForTycon else AddLocalTyconRefs true cenv.g cenv.amap tcref.Range [tcref] envForTycon // Set up the environment so use-before-definition warnings are given, at least // until we reach a PassAIncrClassCtorJustAfterSuperInit. let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } + let reqdThisValTyOpt = Some thisTy // Loop through the definition elements in a type... @@ -12760,11 +12762,8 @@ module TyconBindingChecking = begin // let (fixupValueExprBinds, methodBinds) = (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> match defnCs with - - | PassCIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) :: defnCs -> - // Determine is static fields in this type need to be "protected" against invalid recursive initialization let safeStaticInitInfo = // Safe static init checks are not added to FSharp.Core. The FailInit helper is not defined in some places, and @@ -12851,7 +12850,7 @@ module TyconBindingChecking = begin | PassCIncrClassCtorJustAfterLastLet -> yield PassCCtorJustAfterLastLet | _ -> () ] let memberBinds = memberBindsWithFixups |> List.map (fun x -> x.Binding) - MakeCtorForIncrClassConstructionPassC(cenv,envForTycon,tpenv,incrClassCtorLhs,inheritsExpr,inheritsIsVisible,localDecs,memberBinds,generalizedTyparsForRecursiveBlock,safeStaticInitInfo) + MakeCtorForIncrClassConstructionPassC(cenv,envForTycon,incrClassCtorLhs,inheritsExpr,inheritsIsVisible,localDecs,memberBinds,generalizedTyparsForRecursiveBlock,safeStaticInitInfo) // Generate the (value,expr) pairs for the implicit // object constructor and implicit static initializer @@ -14953,9 +14952,9 @@ module EstablishTypeDefinitionCores = begin (fun envAbove decls -> let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) - let envInner = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove - let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) - envInner) + let envForDecls = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + envForDecls) (tycons, envMutRec, withNewEnvs) From c677ee910d19f694d5f9c8b9edd0c6f2df7618b9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 15:00:11 +0000 Subject: [PATCH 053/334] fix for modules in namespaces --- src/FSharpSource.targets | 2 +- src/fsharp/TypeChecker.fs | 51 +++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 133d8162eff..6dfc90431cd 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -91,7 +91,7 @@ - false + true DEBUG;NO_STRONG_NAMES;$(DefineConstants) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ad73ec294b1..14a032d997b 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15755,50 +15755,49 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let mutRecDefns = - let rec loop dfs : MutRecDefnsInitialData = + let rec loop isNamespace dfs : MutRecDefnsInitialData = [ for def in dfs do match ElimModuleDoBinding def with - | SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" - //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) - //return ((fun e -> e), []), env, env - - | SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" - //| SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> - // let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr - // let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) - // yield Choice1Of2 (SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) - | SynModuleDecl.Types (typeDefs,_) -> for typeDef in typeDefs do yield MutRecShape.Tycon typeDef - | SynModuleDecl.Open _ -> failwith "open not allowed in mutrec sections yet" - //let scopem = unionRanges m.EndRange scopem - //let env = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp - //return ((fun e -> e),[]), env, env - | SynModuleDecl.Let (letrec, binds, m) -> - match parent with - | ParentNone -> CheckLetInNamespace binds m - | Parent _ -> + if isNamespace then CheckLetInNamespace binds m + else if letrec then yield MutRecShape.Lets binds else yield! List.map (List.singleton >> MutRecShape.Lets) binds + | SynModuleDecl.NestedModule(compInfo,synDefs,_isContinuingModule,_m) -> + let mutRecDefs = loop false synDefs + yield MutRecShape.Module (compInfo, mutRecDefs) + + | SynModuleDecl.Open _ -> failwith "open not allowed in mutrec sections yet" + //let scopem = unionRanges m.EndRange scopem + //let env = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp + //return ((fun e -> e),[]), env, env + | SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs //return ((fun e -> e), attrs), env, env - | SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" - | SynModuleDecl.NestedModule(compInfo,synDefs,_isContinuingModule,_m) -> - let mutRecDefs = loop synDefs - yield MutRecShape.Module (compInfo, mutRecDefs) + | SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" + //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) + //return ((fun e -> e), []), env, env + | SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" + //| SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> + // let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr + // let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) + // yield Choice1Of2 (SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) + + | SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" | SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" | SynModuleDecl.DoExpr _ -> failwith "unreachable" ] - loop defs + loop (match parent with ParentNone -> true | Parent _ -> false) defs let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns,m,scopem) @@ -15838,8 +15837,8 @@ and TcModuleOrNamespaceElements cenv parent endm env xml defs = let! compiledDefs, env, envAtEnd = eventually { match defs with - // Hack, "do 0xABBA" indicates a mutrec section - | SynModuleDecl.DoExpr (_,SynExpr.Do (SynExpr.Const (SynConst.Int32 0xabba ,_), _), _) :: defs -> + // #rec indicates a mutrec section + | SynModuleDecl.HashDirective(ParsedHashDirective(("allow_forward_references_in_this_scope" | "rec" | "mutrec" | "fwdrec" | "allow_forward_references"),[],_),_) :: defs -> return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs | _ -> return! TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs From 9d12fd41a311372825ad3ae99f2cdffa1efd9cc1 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 16:27:33 +0000 Subject: [PATCH 054/334] spike support for 'module rec' and 'namespace rec' --- src/fsharp/CompileOps.fs | 56 +- src/fsharp/FSComp.txt | 3 + src/fsharp/LexFilter.fs | 4 +- src/fsharp/TypeChecker.fs | 79 +- src/fsharp/ast.fs | 28 +- src/fsharp/fsi/fsi.fs | 2 +- src/fsharp/pars.fsy | 61 +- src/fsharp/vs/ServiceNavigation.fs | 4 +- src/fsharp/vs/ServiceParseTreeWalk.fs | 4 +- src/fsharp/vs/ServiceUntypedParse.fs | 4 +- .../FSharp.ProjectSystem.FSharp/Project.fs | 686 ++---------------- 11 files changed, 196 insertions(+), 735 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index c066fabdd1d..8f49a1453fd 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -3091,17 +3091,17 @@ let ComputeQualifiedNameOfFileFromUniquePath (m, p: string list) = QualifiedName let QualFileNameOfSpecs filename specs = match specs with - | [SynModuleOrNamespaceSig(modname,true,_,_,_,_,m)] -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespaceSig(modname,_,true,_,_,_,_,m)] -> QualFileNameOfModuleName m filename modname | _ -> QualFileNameOfFilename (rangeN filename 1) filename let QualFileNameOfImpls filename specs = match specs with - | [SynModuleOrNamespace(modname,true,_,_,_,_,m)] -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespace(modname,_,true,_,_,_,_,m)] -> QualFileNameOfModuleName m filename modname | _ -> QualFileNameOfFilename (rangeN filename 1) filename let PrepandPathToQualFileName x (QualifiedNameOfFile(q)) = ComputeQualifiedNameOfFileFromUniquePath (q.idRange,pathOfLid x@[q.idText]) -let PrepandPathToImpl x (SynModuleOrNamespace(p,c,d,e,f,g,h)) = SynModuleOrNamespace(x@p,c,d,e,f,g,h) -let PrepandPathToSpec x (SynModuleOrNamespaceSig(p,c,d,e,f,g,h)) = SynModuleOrNamespaceSig(x@p,c,d,e,f,g,h) +let PrepandPathToImpl x (SynModuleOrNamespace(p,b,c,d,e,f,g,h)) = SynModuleOrNamespace(x@p,b,c,d,e,f,g,h) +let PrepandPathToSpec x (SynModuleOrNamespaceSig(p,b,c,d,e,f,g,h)) = SynModuleOrNamespaceSig(x@p,b,c,d,e,f,g,h) let PrependPathToInput x inp = match inp with @@ -3125,54 +3125,54 @@ let ComputeAnonModuleName check defaultNamespace filename (m: range) = let PostParseModuleImpl (_i,defaultNamespace,isLastCompiland,filename,impl) = match impl with - | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid,isModule,decls,xmlDoc,attribs,access,m)) -> + | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid,isRec,isModule,decls,xmlDoc,attribs,access,m)) -> let lid = match lid with | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(),id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespace(lid,isModule,decls,xmlDoc,attribs,access,m) + SynModuleOrNamespace(lid,isRec,isModule,decls,xmlDoc,attribs,access,m) | ParsedImplFileFragment.AnonModule (defs,m)-> if not isLastCompiland && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix (String.lowercase filename))) then errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),trimRangeToLine m)) let modname = ComputeAnonModuleName (nonNil defs) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespace(modname,true,defs,PreXmlDoc.Empty,[],None,m) + SynModuleOrNamespace(modname,false,true,defs,PreXmlDoc.Empty,[],None,m) - | ParsedImplFileFragment.NamespaceFragment (lid,b,c,d,e,m)-> + | ParsedImplFileFragment.NamespaceFragment (lid,a,b,c,d,e,m)-> let lid = match lid with | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespace(lid,b,c,d,e,None,m) + SynModuleOrNamespace(lid,a,b,c,d,e,None,m) let PostParseModuleSpec (_i,defaultNamespace,isLastCompiland,filename,intf) = match intf with - | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid,isModule,decls,xmlDoc,attribs,access,m)) -> + | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid,isRec,isModule,decls,xmlDoc,attribs,access,m)) -> let lid = match lid with | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(),id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespaceSig(lid,isModule,decls,xmlDoc,attribs,access,m) + SynModuleOrNamespaceSig(lid,isRec,isModule,decls,xmlDoc,attribs,access,m) | ParsedSigFileFragment.AnonModule (defs,m) -> if not isLastCompiland && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix (String.lowercase filename))) then errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),m)) let modname = ComputeAnonModuleName (nonNil defs) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespaceSig(modname,true,defs,PreXmlDoc.Empty,[],None,m) + SynModuleOrNamespaceSig(modname,false,true,defs,PreXmlDoc.Empty,[],None,m) - | ParsedSigFileFragment.NamespaceFragment (lid,b,c,d,e,m)-> + | ParsedSigFileFragment.NamespaceFragment (lid,a,b,c,d,e,m)-> let lid = match lid with | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespaceSig(lid,b,c,d,e,None,m) + SynModuleOrNamespaceSig(lid,a,b,c,d,e,None,m) let PostParseModuleImpls (defaultNamespace,filename,isLastCompiland,ParsedImplFile(hashDirectives,impls)) = - match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid,_,_,_,_,_,_)) -> Some(lid) | _ -> None) with + match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid,_,_,_,_,_,_,_)) -> Some(lid) | _ -> None) with | Some lid when impls.Length > 1 -> errorR(Error(FSComp.SR.buildMultipleToplevelModules(),rangeOfLid lid)) | _ -> @@ -3182,7 +3182,7 @@ let PostParseModuleImpls (defaultNamespace,filename,isLastCompiland,ParsedImplFi let isScript = IsScript filename let scopedPragmas = - [ for (SynModuleOrNamespace(_,_,decls,_,_,_,_)) in impls do + [ for (SynModuleOrNamespace(_,_,_,decls,_,_,_,_)) in impls do for d in decls do match d with | SynModuleDecl.HashDirective (hd,_) -> yield! GetScopedPragmasForHashDirective hd @@ -3192,7 +3192,7 @@ let PostParseModuleImpls (defaultNamespace,filename,isLastCompiland,ParsedImplFi ParsedInput.ImplFile(ParsedImplFileInput(filename,isScript,qualName,scopedPragmas,hashDirectives,impls,isLastCompiland)) let PostParseModuleSpecs (defaultNamespace,filename,isLastCompiland,ParsedSigFile(hashDirectives,specs)) = - match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid,_,_,_,_,_,_)) -> Some(lid) | _ -> None) with + match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid,_,_,_,_,_,_,_)) -> Some(lid) | _ -> None) with | Some lid when specs.Length > 1 -> errorR(Error(FSComp.SR.buildMultipleToplevelModules(),rangeOfLid lid)) | _ -> @@ -3201,7 +3201,7 @@ let PostParseModuleSpecs (defaultNamespace,filename,isLastCompiland,ParsedSigFil let specs = specs |> List.mapi (fun i x -> PostParseModuleSpec(i,defaultNamespace,isLastCompiland,filename,x)) let qualName = QualFileNameOfSpecs filename specs let scopedPragmas = - [ for (SynModuleOrNamespaceSig(_,_,decls,_,_,_,_)) in specs do + [ for (SynModuleOrNamespaceSig(_,_,_,decls,_,_,_,_)) in specs do for d in decls do match d with | SynModuleSigDecl.HashDirective(hd,_) -> yield! GetScopedPragmasForHashDirective hd @@ -3280,12 +3280,12 @@ let ParseOneInputLexbuf (tcConfig:TcConfig,lexResourceManager,conditionalCompila if tcConfig.reportNumDecls then let rec flattenSpecs specs = - specs |> List.collect (function (SynModuleSigDecl.NestedModule (_,subDecls,_)) -> flattenSpecs subDecls | spec -> [spec]) + specs |> List.collect (function (SynModuleSigDecl.NestedModule (_,_,subDecls,_)) -> flattenSpecs subDecls | spec -> [spec]) let rec flattenDefns specs = - specs |> List.collect (function (SynModuleDecl.NestedModule (_,subDecls,_,_)) -> flattenDefns subDecls | defn -> [defn]) + specs |> List.collect (function (SynModuleDecl.NestedModule (_,_,subDecls,_,_)) -> flattenDefns subDecls | defn -> [defn]) - let flattenModSpec (SynModuleOrNamespaceSig(_,_,decls,_,_,_,_)) = flattenSpecs decls - let flattenModImpl (SynModuleOrNamespace(_,_,decls,_,_,_,_)) = flattenDefns decls + let flattenModSpec (SynModuleOrNamespaceSig(_,_,_,decls,_,_,_,_)) = flattenSpecs decls + let flattenModImpl (SynModuleOrNamespace(_,_,_,decls,_,_,_,_)) = flattenDefns decls match res with | ParsedInput.SigFile(ParsedSigFileInput(_,_,_,_,specs)) -> dprintf "parsing yielded %d specs" (List.collect flattenModSpec specs).Length @@ -4608,30 +4608,30 @@ let ProcessMetaCommandsFromInput decls |> List.iter (fun d -> match d with | SynModuleSigDecl.HashDirective (_,m) -> warning(Error(FSComp.SR.buildDirectivesInModulesAreIgnored(),m)) - | SynModuleSigDecl.NestedModule (_,subDecls,_) -> WarnOnIgnoredSpecDecls subDecls + | SynModuleSigDecl.NestedModule (_,_,subDecls,_) -> WarnOnIgnoredSpecDecls subDecls | _ -> ()) let rec WarnOnIgnoredImplDecls decls = decls |> List.iter (fun d -> match d with | SynModuleDecl.HashDirective (_,m) -> warning(Error(FSComp.SR.buildDirectivesInModulesAreIgnored(),m)) - | SynModuleDecl.NestedModule (_,subDecls,_,_) -> WarnOnIgnoredImplDecls subDecls + | SynModuleDecl.NestedModule (_,_,subDecls,_,_) -> WarnOnIgnoredImplDecls subDecls | _ -> ()) - let ProcessMetaCommandsFromModuleSpec state (SynModuleOrNamespaceSig(_,_,decls,_,_,_,_)) = + let ProcessMetaCommandsFromModuleSpec state (SynModuleOrNamespaceSig(_,_,_,decls,_,_,_,_)) = List.fold (fun s d -> match d with | SynModuleSigDecl.HashDirective (h,_) -> ProcessMetaCommand s h - | SynModuleSigDecl.NestedModule (_,subDecls,_) -> WarnOnIgnoredSpecDecls subDecls; s + | SynModuleSigDecl.NestedModule (_,_,subDecls,_) -> WarnOnIgnoredSpecDecls subDecls; s | _ -> s) state decls - let ProcessMetaCommandsFromModuleImpl state (SynModuleOrNamespace(_,_,decls,_,_,_,_)) = + let ProcessMetaCommandsFromModuleImpl state (SynModuleOrNamespace(_,_,_,decls,_,_,_,_)) = List.fold (fun s d -> match d with | SynModuleDecl.HashDirective (h,_) -> ProcessMetaCommand s h - | SynModuleDecl.NestedModule (_,subDecls,_,_) -> WarnOnIgnoredImplDecls subDecls; s + | SynModuleDecl.NestedModule (_,_,subDecls,_,_) -> WarnOnIgnoredImplDecls subDecls; s | _ -> s) state decls diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index ab16418c8b9..3207c762140 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1271,3 +1271,6 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3194,optsResponseFileNotFound,"Response file '%s' not found in '%s'" 3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long" 3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory" +3197,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" +3198,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" +3199,tcRecImplied,"The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored" diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index c8c0ba139fc..40683681901 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -1319,7 +1319,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | NAMESPACE, GLOBAL when namespaceTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtNamespaceHead (namespaceTokenPos, token)) returnToken tokenLexbufState token - | (NAMESPACE | DOT), IDENT _ when namespaceTokenPos.Column < tokenStartPos.Column -> + | (NAMESPACE | DOT | REC), (REC | IDENT _) when namespaceTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtNamespaceHead (namespaceTokenPos, token)) returnToken tokenLexbufState token | IDENT _, DOT when namespaceTokenPos.Column < tokenStartPos.Column -> @@ -1348,7 +1348,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token | MODULE, (PUBLIC | PRIVATE | INTERNAL) when moduleTokenPos.Column < tokenStartPos.Column -> returnToken tokenLexbufState token - | (MODULE | DOT), IDENT _ when moduleTokenPos.Column < tokenStartPos.Column -> + | (MODULE | DOT | REC), (REC | IDENT _) when moduleTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtModuleHead (moduleTokenPos, token)) returnToken tokenLexbufState token | IDENT _, DOT when moduleTokenPos.Column < tokenStartPos.Column -> diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 14a032d997b..9e2c00e18c6 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -5200,7 +5200,7 @@ and RecordNameAndTypeResolutions_IdeallyWithoutHavingOtherEffects cenv env tpenv // The tricky bit is to not also have any other effects from typechecking, namely producing error diagnostics (which may be spurious) or having // side-effects on the typecheck environment. // - // TODO: Deal with the tricky bit. As it stands, we turn off error logging, but still have typechecking environment effects. As a result, + // REVIEW: We are yet to deal with the tricky bit. As it stands, we turn off error logging, but still have typechecking environment effects. As a result, // at the very least, you cannot call this function unless you're already reported a typechecking error (the 'worst' possible outcome would be // to incorrectly solve typecheck constraints as a result of effects in this function, and then have the code compile successfully and behave // in some weird way; so ensure the code can't possibly compile before calling this function as an expedient way to get better IntelliSense). @@ -12996,7 +12996,7 @@ module TyconBindingChecking = begin // INITIALIZATION GRAPHS // let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm - // TODO: this does initialization graphs in each type independently, this is not correct + // TODO: Note that this does initialization graphs in each type independently. let defnsEs = defnsDs |> MutRecShapes.map (fun (tyconOpt, fixupValueExprBinds, methodBinds) -> @@ -14254,7 +14254,7 @@ module EstablishTypeDefinitionCores = begin TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_SealedAttribute attrs let hasMeasureAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureAttribute attrs - // TODO: for hasMeasureableAttr we need to be stricter about checking these + // REVIEW: for hasMeasureableAttr we need to be stricter about checking these // are only used on exactly the right kinds of type definitions and not inconjunction with other attributes. let hasMeasureableAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureableAttribute attrs let hasCLIMutable = HasFSharpAttribute cenv.g cenv.g.attrib_CLIMutableAttribute attrs @@ -14778,7 +14778,7 @@ module EstablishTypeDefinitionCores = begin let TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial parent compInfo = let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo let id = ComputeModuleName longPath - let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs // TODO VERY MINOR: this means typeof in attributes on module declarations can't refer to to mutrec type defs + let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs let modKind = ComputeModuleOrNamespaceKind cenv.g true modAttrs let vis,_ = ComputeAccessAndCompPath envInitial None id.idRange vis parent @@ -15368,7 +15368,7 @@ module TcDeclarations = begin let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let private TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefns = - // TODO - this is only checking the tycons in the signatures, need to do the module and let elements to + // TODO - this is only checking the tycons in the signatures, need to do the module and let elements too (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members)), _, _) -> let tpenv = emptyUnscopedTyparEnv let (MutRecDefnsPass1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore @@ -15422,7 +15422,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs env return env - | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),mdefs,m) -> + | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),_isRec,mdefs,m) -> let id = ComputeModuleName longPath let vis,_ = ComputeAccessAndCompPath env None im vis parent let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,true,mdefs,xml,attribs,vis,m) @@ -15450,7 +15450,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = return env - | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId,isModule,defs,xml,attribs,vis,m)) -> + | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId,isRec,isModule,defs,xml,attribs,vis,m)) -> do for id in longId do CheckNamespaceModuleOrTypeName cenv.g id @@ -15459,7 +15459,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let defs = if isModule then - [SynModuleSigDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),defs,m)] + [SynModuleSigDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,m)] else defs let envinner = LocateEnv cenv.topCcu env enclosingNamespacePath @@ -15655,7 +15655,8 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu | SynModuleDecl.HashDirective _ -> return ((fun e -> e), []), env, env - | SynModuleDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),mdefs,isContinuingModule,m) -> + | SynModuleDecl.NestedModule(compInfo, isRec, mdefs, isContinuingModule, m) -> + let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo let id = ComputeModuleName longPath let modAttrs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs @@ -15666,7 +15667,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent let! (topAttrsNew, _,ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)),_,envAtEnd = - TcModuleOrNamespace cenv env (id,true,mdefs,xml,modAttrs,vis,m) + TcModuleOrNamespace cenv env (id,isRec,true,mdefs,xml,modAttrs,vis,m) let mspec = mspecPriorToOuterOrExplicitSig let mdef = TMDefRec([],FlatList.empty,[ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)],m) @@ -15683,7 +15684,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu return ((fun e -> mdef :: e),topAttrsNew), env, envAtEnd - | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId,isModule,defs,xml,attribs,vis,m)) -> + | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId,isRec,isModule,defs,xml,attribs,vis,m)) -> if !progress then dprintn ("Typecheck implementation " + textOfLid longId) let endm = m.EndRange @@ -15694,13 +15695,13 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let enclosingNamespacePath = if isModule then fst (List.frontAndBack longId) else longId let defs = if isModule then - [SynModuleDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),defs,true,m)] + [SynModuleDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,true,m)] else defs let envinner = LocateEnv cenv.topCcu env enclosingNamespacePath let envinner = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envinner - let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envinner xml defs + let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envinner xml isRec defs let env = if isNil enclosingNamespacePath then @@ -15729,9 +15730,20 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu return ((fun e -> e), []), env, env } -and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) = +and (|MutRecDirective|_|) d = + match d with + | ParsedHashDirective(("allow_forward_references_in_this_scope" | "rec" | "mutrec" | "fwdrec" | "allow_forward_references"),[],_) -> Some () + | _ -> None + +and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) isRec (moreDefs: SynModuleDecl list) = eventually { match moreDefs with + // rec indicates a mutrec section + | defs when isRec -> + return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + // #rec indicates a mutrec section + | SynModuleDecl.HashDirective(MutRecDirective,_) :: defs -> + return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs | (h1 :: t) -> // Lookahead one to find out the scope of the next declaration. let scopem = @@ -15743,7 +15755,7 @@ and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) ( let! h1',env', envAtEnd' = TcModuleOrNamespaceElement cenv parent scopem env h1 // tail recursive - return! TcModuleOrNamespaceElementsAux cenv parent endm ( (h1' :: defsSoFar), env', envAtEnd') t + return! TcModuleOrNamespaceElementsAux cenv parent endm ( (h1' :: defsSoFar), env', envAtEnd') isRec t | [] -> return List.rev defsSoFar,env, envAtEnd } @@ -15770,32 +15782,34 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu if letrec then yield MutRecShape.Lets binds else yield! List.map (List.singleton >> MutRecShape.Lets) binds - | SynModuleDecl.NestedModule(compInfo,synDefs,_isContinuingModule,_m) -> + | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,m) -> + if isRec then warning(Error(FSComp.SR.tcRecImplied(),m)) let mutRecDefs = loop false synDefs yield MutRecShape.Module (compInfo, mutRecDefs) - | SynModuleDecl.Open _ -> failwith "open not allowed in mutrec sections yet" + | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range)) + //| SynModuleDecl.Open _ -> //let scopem = unionRanges m.EndRange scopem //let env = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp //return ((fun e -> e),[]), env, env - | SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" + //| SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs //return ((fun e -> e), attrs), env, env - | SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" + //| SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) //return ((fun e -> e), []), env, env - | SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" + //| SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" //| SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> // let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr // let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) // yield Choice1Of2 (SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) - | SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" - | SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" - | SynModuleDecl.DoExpr _ -> failwith "unreachable" + //| SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" + //| SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" + //| SynModuleDecl.DoExpr _ -> failwith "unreachable" ] loop (match parent with ParentNone -> true | Parent _ -> false) defs @@ -15828,21 +15842,14 @@ and TcMutRecDefsFinish cenv defs m = TMDefRec(tycons,binds,mods,m) -and TcModuleOrNamespaceElements cenv parent endm env xml defs = +and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = eventually { // Ensure the deref_nlpath call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - let! compiledDefs, env, envAtEnd = - eventually { - match defs with - // #rec indicates a mutrec section - | SynModuleDecl.HashDirective(ParsedHashDirective(("allow_forward_references_in_this_scope" | "rec" | "mutrec" | "fwdrec" | "allow_forward_references"),[],_),_) :: defs -> - return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs - | _ -> - return! TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs - } + let! compiledDefs, env, envAtEnd = TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) isRec defs + // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) @@ -15851,7 +15858,7 @@ and TcModuleOrNamespaceElements cenv parent endm env xml defs = return (mexpr, topAttrsNew, env, envAtEnd) } -and TcModuleOrNamespace cenv env (id,isModule,defs,xml,modAttrs,vis,m:range) = +and TcModuleOrNamespace cenv env (id,isRec,isModule,defs,xml,modAttrs,vis,m:range) = eventually { let endm = m.EndRange let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule modAttrs @@ -15868,7 +15875,7 @@ and TcModuleOrNamespace cenv env (id,isModule,defs,xml,modAttrs,vis,m:range) = let innerParent = mkLocalModRef mspec // Now typecheck. - let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent innerParent) endm envinner xml defs + let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent innerParent) endm envinner xml isRec defs // Get the inferred type of the decls. It's precisely the one we created before checking // and mutated as we went. Record it in the mspec. @@ -16058,7 +16065,7 @@ let TypeCheckOneImplFile let envinner, mtypeAcc = MakeInitialEnv env let defs = [ for x in implFileFrags -> SynModuleDecl.NamespaceFragment(x) ] - let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty defs + let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false defs let implFileTypePriorToSig = !mtypeAcc diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 939295309ac..6a303d7f970 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1317,7 +1317,7 @@ and [] SynModuleDecl = | ModuleAbbrev of Ident * LongIdent * range - | NestedModule of SynComponentInfo * SynModuleDecls * bool * range + | NestedModule of SynComponentInfo * isRec: bool * SynModuleDecls * bool * range | Let of bool * SynBinding list * range | DoExpr of SequencePointInfoForBinding * SynExpr * range | Types of SynTypeDefn list * range @@ -1329,14 +1329,14 @@ and member d.Range = match d with | SynModuleDecl.ModuleAbbrev(_,_,m) - | SynModuleDecl.NestedModule(_,_,_,m) + | SynModuleDecl.NestedModule(_,_,_,_,m) | SynModuleDecl.Let(_,_,m) | SynModuleDecl.DoExpr(_,_,m) | SynModuleDecl.Types(_,m) | SynModuleDecl.Exception(_,m) | SynModuleDecl.Open (_,m) | SynModuleDecl.HashDirective (_,m) - | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(_,_,_,_,_,_,m)) + | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(_,_,_,_,_,_,_,m)) | SynModuleDecl.Attributes(_,m) -> m and SynModuleDecls = SynModuleDecl list @@ -1350,7 +1350,7 @@ and [] SynModuleSigDecl = | ModuleAbbrev of Ident * LongIdent * range - | NestedModule of SynComponentInfo * SynModuleSigDecls * range + | NestedModule of SynComponentInfo * isRec : bool * SynModuleSigDecls * range | Val of SynValSig * range | Types of SynTypeDefnSig list * range | Exception of SynExceptionSig * range @@ -1361,29 +1361,29 @@ and member d.Range = match d with | SynModuleSigDecl.ModuleAbbrev (_,_,m) - | SynModuleSigDecl.NestedModule (_,_,m) + | SynModuleSigDecl.NestedModule (_,_,_,m) | SynModuleSigDecl.Val (_,m) | SynModuleSigDecl.Types (_,m) | SynModuleSigDecl.Exception (_,m) | SynModuleSigDecl.Open (_,m) - | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(_,_,_,_,_,_,m)) + | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(_,_,_,_,_,_,_,m)) | SynModuleSigDecl.HashDirective (_,m) -> m and SynModuleSigDecls = SynModuleSigDecl list -/// SynModuleOrNamespace(lid,isModule,decls,xmlDoc,attribs,SynAccess,m) +/// SynModuleOrNamespace(lid,isRec,isModule,decls,xmlDoc,attribs,SynAccess,m) and [] SynModuleOrNamespace = - | SynModuleOrNamespace of LongIdent * (*isModule:*) bool * SynModuleDecls * PreXmlDoc * SynAttributes * SynAccess option * range + | SynModuleOrNamespace of LongIdent * isRec: bool * isModule: bool * SynModuleDecls * PreXmlDoc * SynAttributes * SynAccess option * range member this.Range = match this with - | SynModuleOrNamespace(_,_,_,_,_,_,m) -> m + | SynModuleOrNamespace(_,_,_,_,_,_,_,m) -> m and [] SynModuleOrNamespaceSig = - | SynModuleOrNamespaceSig of LongIdent * (*isModule:*) bool * SynModuleSigDecls * PreXmlDoc * SynAttributes * SynAccess option * range + | SynModuleOrNamespaceSig of LongIdent * isRec: bool * isModule: bool * SynModuleSigDecls * PreXmlDoc * SynAttributes * SynAccess option * range and [] ParsedHashDirective = @@ -1393,13 +1393,13 @@ and [] type ParsedImplFileFragment = | AnonModule of SynModuleDecls * range | NamedModule of SynModuleOrNamespace - | NamespaceFragment of LongIdent * bool * SynModuleDecls * PreXmlDoc * SynAttributes * range + | NamespaceFragment of LongIdent * bool * bool * SynModuleDecls * PreXmlDoc * SynAttributes * range [] type ParsedSigFileFragment = | AnonModule of SynModuleSigDecls * range | NamedModule of SynModuleOrNamespaceSig - | NamespaceFragment of LongIdent * bool * SynModuleSigDecls * PreXmlDoc * SynAttributes * range + | NamespaceFragment of LongIdent * bool * bool * SynModuleSigDecls * PreXmlDoc * SynAttributes * range [] type ParsedFsiInteraction = @@ -1467,8 +1467,8 @@ type ParsedInput = member inp.Range = match inp with - | ParsedInput.ImplFile (ParsedImplFileInput(_,_,_,_,_,(SynModuleOrNamespace(_,_,_,_,_,_,m) :: _),_)) - | ParsedInput.SigFile (ParsedSigFileInput(_,_,_,_,(SynModuleOrNamespaceSig(_,_,_,_,_,_,m) :: _))) -> m + | ParsedInput.ImplFile (ParsedImplFileInput(_,_,_,_,_,(SynModuleOrNamespace(_,_,_,_,_,_,_,m) :: _),_)) + | ParsedInput.SigFile (ParsedSigFileInput(_,_,_,_,(SynModuleOrNamespaceSig(_,_,_,_,_,_,_,m) :: _))) -> m | ParsedInput.ImplFile (ParsedImplFileInput(filename,_,_,_,_,[],_)) | ParsedInput.SigFile (ParsedSigFileInput(filename,_,_,_,[])) -> #if DEBUG diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index ddcaa360308..01727b89271 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -945,7 +945,7 @@ type internal FsiDynamicCompiler let i = nextFragmentId() let prefix = mkFragmentPath i let prefixPath = pathOfLid prefix - let impl = SynModuleOrNamespace(prefix,(* isModule: *) true,defs,PreXmlDoc.Empty,[],None,rangeStdin) + let impl = SynModuleOrNamespace(prefix,(*isRec*)false, (* isModule: *) true,defs,PreXmlDoc.Empty,[],None,rangeStdin) let input = ParsedInput.ImplFile(ParsedImplFileInput(filename,true, ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath),[],[],[impl],true (* isLastCompiland *) )) let istate,tcEnvAtEndOfLastInput = ProcessInputs (istate, [input], showTypes, true, isInteractiveItExpr, prefix) let tcState = istate.tcState diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 63bf263853b..e5bbe2511e7 100755 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -616,28 +616,28 @@ signatureFile: /* The start of a module declaration */ moduleIntro: - | moduleKeyword opt_access path - { $3.Lid,grabXmlDoc(parseState,1),$2 } + | moduleKeyword opt_access opt_rec path + { $3, $4.Lid, grabXmlDoc(parseState,1), $2 } /* The start of a namespace declaration */ namespaceIntro: - | NAMESPACE path - { $2.Lid,grabXmlDoc(parseState,1) } + | NAMESPACE opt_rec path + { $2, $3.Lid, grabXmlDoc(parseState,1) } /* The contents of a signature file */ fileNamespaceSpecs: | fileModuleSpec - { ParsedSigFile([],[ ($1 ([],PreXmlDoc.Empty)) ]) } + { ParsedSigFile([],[ ($1 (false,[],PreXmlDoc.Empty)) ]) } | fileModuleSpec fileNamespaceSpecList { // If there are namespaces, the first fileModuleImpl may only contain # directives let decls = - match ($1 ([],PreXmlDoc.Empty)) with + match ($1 (false,[],PreXmlDoc.Empty)) with | ParsedSigFileFragment.AnonModule(decls,m) -> decls - | ParsedSigFileFragment.NamespaceFragment(_,_, decls, _,_,_) -> decls - | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(_,_,_,_,_,_,m)) -> + | ParsedSigFileFragment.NamespaceFragment(_,_,_, decls, _,_,_) -> decls + | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(_,_,_,_,_,_,_,m)) -> raiseParseErrorAt m (FSComp.SR.parsOnlyHashDirectivesAllowed()) let decls = decls |> List.collect (function @@ -657,7 +657,7 @@ fileNamespaceSpecList: fileNamespaceSpec: | namespaceIntro deprecated_opt_equals fileModuleSpec - { let path,xml = $1 in ($3 (path,xml)) } + { let isRec,path,xml = $1 in ($3 (isRec,path,xml)) } /* The single module declaration that can make up a signature file */ @@ -666,18 +666,18 @@ fileModuleSpec: { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); let m2 = rhs parseState 3 let m = (rhs2 parseState 3 4) - (fun (path,_) -> + let isRec,path2,xml,vis = $3 + (fun (isRec2,path,_) -> if nonNil path then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)); - let path2,xml,vis = $3 let lid = path@path2 - ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid,true, $4, xml,$1,vis,m))) } + ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } | moduleSpfnsPossiblyEmptyBlock { let m = (rhs parseState 1) - (fun (path,xml) -> + (fun (isRec, path, xml) -> match path with | [] -> ParsedSigFileFragment.AnonModule($1, m) - | _ -> ParsedSigFileFragment.NamespaceFragment(path,false, $1, xml,[],m)) } + | _ -> ParsedSigFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } moduleSpfnsPossiblyEmptyBlock: @@ -728,18 +728,20 @@ moduleSpfn: | opt_attributes opt_declVisibility moduleIntro colonOrEquals namedModuleAbbrevBlock { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); - let path,xml,vis = $3 + let isRec, path, xml, vis = $3 + if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec()); if List.length path <> 1 then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleAbbreviationMustBeSimpleName()); if List.length $1 <> 0 then raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsIgnoreAttributesOnModuleAbbreviation()); if isSome(vis) then raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate()); SynModuleSigDecl.ModuleAbbrev(List.head path,$5,rhs2 parseState 3 5) } | opt_attributes opt_declVisibility moduleIntro colonOrEquals moduleSpecBlock - { let path,xml,vis = $3 + { let isRec, path, xml, vis = $3 if List.length path <> 1 then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleDefnMustBeSimpleName()); + if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec()); let info = ComponentInfo($1,[],[],path,xml,false,vis,rhs parseState 3) if isSome($2) then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); - SynModuleSigDecl.NestedModule(info,$5,rhs2 parseState 3 5) } + SynModuleSigDecl.NestedModule(info, isRec, $5, rhs2 parseState 3 5) } | opt_attributes opt_declVisibility tyconSpfns { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); @@ -1045,15 +1047,15 @@ implementationFile: /* The sequence of namespace definitions or a single module definition that makes up an implementation file */ fileNamespaceImpls: | fileModuleImpl - { ParsedImplFile([], [ ($1 ([],PreXmlDoc.Empty)) ]) } + { ParsedImplFile([], [ ($1 (false,[],PreXmlDoc.Empty)) ]) } | fileModuleImpl fileNamespaceImplList { // If there are namespaces, the first fileModuleImpl may only contain # directives let decls = - match ($1 ([],PreXmlDoc.Empty)) with + match ($1 (false,[],PreXmlDoc.Empty)) with | ParsedImplFileFragment.AnonModule(decls,m) -> decls - | ParsedImplFileFragment.NamespaceFragment(_,_, decls, _,_,_) -> decls - | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(_,_,_,_,_,_,m)) -> + | ParsedImplFileFragment.NamespaceFragment(_,_,_, decls, _,_,_) -> decls + | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(_,_,_,_,_,_,_,m)) -> raiseParseErrorAt m (FSComp.SR.parsOnlyHashDirectivesAllowed()) let decls = decls |> List.collect (function @@ -1076,7 +1078,7 @@ fileNamespaceImplList: /* A single namespace definition in an implementation file */ fileNamespaceImpl: | namespaceIntro deprecated_opt_equals fileModuleImpl - { let path,xml = $1 in ($3 (path,xml)) } + { let isRec, path, xml = $1 in ($3 (isRec, path, xml)) } /* A single module definition in an implementation file */ @@ -1085,18 +1087,18 @@ fileModuleImpl: { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); let m2 = rhs parseState 3 let m = (m2, $4) ||> unionRangeWithListBy (fun modu -> modu.Range) - (fun (path,_) -> + let isRec2,path2,xml,vis = $3 + (fun (isRec, path, _) -> if nonNil path then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)); - let path2,xml,vis = $3 let lid = path@path2 - ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid,true, $4, xml,$1,vis,m))) } + ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } | moduleDefnsOrExprPossiblyEmptyOrBlock { let m = (rhs parseState 1) - (fun (path,xml) -> + (fun (isRec, path, xml) -> match path with | [] -> ParsedImplFileFragment.AnonModule($1,m) - | _ -> ParsedImplFileFragment.NamespaceFragment(path,false, $1, xml,[],m)) } + | _ -> ParsedImplFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } /* A collection/block of definitions or expressions making up a module or namespace, possibly empty */ @@ -1220,10 +1222,11 @@ moduleDefn: /* 'module' definitions */ | opt_attributes opt_declVisibility moduleIntro EQUALS namedModuleDefnBlock { if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); - let attribs,(path,xml,vis) = $1,$3 + let attribs, (isRec, path, xml, vis) = $1,$3 match $5 with | Choice1Of2 eqn -> if isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(),rhs parseState 2)); + if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec()); if List.length path <> 1 then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleAbbreviationMustBeSimpleName()); if List.length $1 <> 0 then raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsIgnoreAttributesOnModuleAbbreviation()); if isSome vis then raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate()); @@ -1231,7 +1234,7 @@ moduleDefn: | Choice2Of2 def -> if List.length path <> 1 then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleAbbreviationMustBeSimpleName()); let info = ComponentInfo(attribs,[],[],path,xml,false,vis,rhs parseState 3) - [ SynModuleDecl.NestedModule(info,def,false,(rhs2 parseState 3 4, def) ||> unionRangeWithListBy (fun d -> d.Range) ) ] } + [ SynModuleDecl.NestedModule(info, isRec, def, false,(rhs2 parseState 3 4, def) ||> unionRangeWithListBy (fun d -> d.Range) ) ] } /* unattached custom attributes */ | attributes recover diff --git a/src/fsharp/vs/ServiceNavigation.fs b/src/fsharp/vs/ServiceNavigation.fs index 189f5bca271..a8c07fb2235 100755 --- a/src/fsharp/vs/ServiceNavigation.fs +++ b/src/fsharp/vs/ServiceNavigation.fs @@ -205,7 +205,7 @@ module NavigationImpl = | SynModuleDecl.ModuleAbbrev(id, lid, m) -> [ createDecl(baseName, id, ModuleDecl, iIconGroupModule, m, rangeOfLid lid, []) ] - | SynModuleDecl.NestedModule(ComponentInfo(_, _, _, lid, _, _, _, _), decls, _, m) -> + | SynModuleDecl.NestedModule(ComponentInfo(_, _, _, lid, _, _, _, _), _isRec, decls, _, m) -> // Find let bindings (for the right dropdown) let nested = processNestedDeclarations(decls) let newBaseName = (if (baseName = "") then "" else baseName+".") + (textOfLid lid) @@ -226,7 +226,7 @@ module NavigationImpl = let items = // Show base name for this module only if it's not the root one let singleTopLevel = (modules.Length = 1) - modules |> List.collect (fun (SynModuleOrNamespace(id,isModule,decls,_,_,_,m)) -> + modules |> List.collect (fun (SynModuleOrNamespace(id, _isRec, isModule, decls, _, _, _, m)) -> let baseName = if (not singleTopLevel) then textOfLid id else "" // Find let bindings (for the right dropdown) let nested = processNestedDeclarations(decls) diff --git a/src/fsharp/vs/ServiceParseTreeWalk.fs b/src/fsharp/vs/ServiceParseTreeWalk.fs index 1d08ff52b0f..a85e861752a 100755 --- a/src/fsharp/vs/ServiceParseTreeWalk.fs +++ b/src/fsharp/vs/ServiceParseTreeWalk.fs @@ -136,7 +136,7 @@ module internal AstTraversal = let path = TraverseStep.Module m :: path match m with | SynModuleDecl.ModuleAbbrev(_ident, _longIdent, _range) -> None - | SynModuleDecl.NestedModule(_synComponentInfo, synModuleDecls, _, _range) -> synModuleDecls |> List.map (fun x -> dive x x.Range (traverseSynModuleDecl path)) |> pick decl + | SynModuleDecl.NestedModule(_synComponentInfo, _isRec, synModuleDecls, _, _range) -> synModuleDecls |> List.map (fun x -> dive x x.Range (traverseSynModuleDecl path)) |> pick decl | SynModuleDecl.Let(_, synBindingList, _range) -> synBindingList |> List.map (fun x -> dive x x.RangeOfBindingAndRhs (traverseSynBinding path)) |> pick decl | SynModuleDecl.DoExpr(_sequencePointInfoForBinding, synExpr, _range) -> traverseSynExpr path synExpr | SynModuleDecl.Types(synTypeDefnList, _range) -> synTypeDefnList |> List.map (fun x -> dive x x.Range (traverseSynTypeDefn path)) |> pick decl @@ -147,7 +147,7 @@ module internal AstTraversal = | SynModuleDecl.NamespaceFragment(synModuleOrNamespace) -> traverseSynModuleOrNamespace path synModuleOrNamespace visitor.VisitModuleDecl(defaultTraverse, decl) - and traverseSynModuleOrNamespace path (SynModuleOrNamespace(_longIdent, _isModule, synModuleDecls, _preXmlDoc, _synAttributes, _synAccessOpt, range) as mors) = + and traverseSynModuleOrNamespace path (SynModuleOrNamespace(_longIdent, _isRec, _isModule, synModuleDecls, _preXmlDoc, _synAttributes, _synAccessOpt, range) as mors) = let path = TraverseStep.ModuleOrNamespace mors :: path synModuleDecls |> List.map (fun x -> dive x x.Range (traverseSynModuleDecl path)) |> pick range mors and traverseSynExpr path (expr:SynExpr) = diff --git a/src/fsharp/vs/ServiceUntypedParse.fs b/src/fsharp/vs/ServiceUntypedParse.fs index d4f1b1a606a..60360700ed1 100755 --- a/src/fsharp/vs/ServiceUntypedParse.fs +++ b/src/fsharp/vs/ServiceUntypedParse.fs @@ -312,7 +312,7 @@ type FSharpParseFileResults(errors : FSharpErrorInfo[], input : Ast.ParsedInput yield! walkExpr false expr | SynModuleDecl.ModuleAbbrev _ -> () - | SynModuleDecl.NestedModule(_, decls, _, m) -> + | SynModuleDecl.NestedModule(_, _isRec, decls, _, m) -> if rangeContainsPos m pos then for d in decls do yield! walkDecl d | SynModuleDecl.Types(tydefs, m) -> @@ -325,7 +325,7 @@ type FSharpParseFileResults(errors : FSharpErrorInfo[], input : Ast.ParsedInput () ] // Collect all the items - let walkModule (SynModuleOrNamespace(_,_,decls,_,_,_,m)) = + let walkModule (SynModuleOrNamespace(_,_,_,decls,_,_,_,m)) = if rangeContainsPos m pos then [ for d in decls do yield! walkDecl d ] else diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 378d82dc50f..19dce482e5c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -2,7 +2,7 @@ #nowarn "40" -namespace Microsoft.VisualStudio.FSharp.ProjectSystem +namespace (* rec *) Microsoft.VisualStudio.FSharp.ProjectSystem open Helpers open System @@ -27,6 +27,7 @@ namespace Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.Win32 + open Microsoft.VisualStudio open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.Shell.Flavor @@ -37,22 +38,12 @@ namespace Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.VisualStudio.Editors open Microsoft.VisualStudio.Editors.PropertyPages -#if DESIGNER - open Microsoft.Windows.Design.Host - open Microsoft.Windows.Design.Model - open Microsoft.VisualStudio.Designer.Interfaces - open Microsoft.VisualStudio.TextManager.Interop - open Microsoft.VisualStudio.Shell.Design.Serialization - open Microsoft.VisualStudio.Shell.Design.Serialization.CodeDom -#endif - open Microsoft.VisualStudio - open EnvDTE open Microsoft.Build.BuildEngine open Internal.Utilities.Debug - + #mutrec module internal VSHiveUtilities = /// For a given sub-hive, check to see if a 3rd party has specified any @@ -152,10 +143,10 @@ namespace Microsoft.VisualStudio.FSharp.ProjectSystem [] [] [] + [] [] [] type public IVsMicrosoftInstalledProduct = - interface inherit IVsInstalledProduct abstract IdBmpSplashM : byref -> unit abstract OfficialNameM : on : byref -> unit @@ -163,19 +154,6 @@ namespace Microsoft.VisualStudio.FSharp.ProjectSystem abstract ProductDetailsM : pd : byref -> unit abstract IdIcoLogoForAboutboxM : byref -> unit abstract ProductRegistryName : prn : byref -> unit - end - - exception internal ExitedOk - exception internal ExitedWithError - - //-------------------------------------------------------------------------------------- - // The big mutually recursive set of types. - // FSharpProjectPackage - // EditorFactory - // FSharpProjectFactory - // .... - - type (* start of very large set of mutually recursive OO types *) (* See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. @@ -193,24 +171,16 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. *) - [, - (* NOTE: search for FSHARP-TOOLS-INTERACTIVE-LINK *) - (* NOTE: the cat/sub-cat names appear in an error message in sessions.ml, fix up any changes there *) - "F# Tools", "F# Interactive", // category/sub-category on Tools>Options... - 6000s, 6001s, // resource id for localisation of the above - true)>] // true = supports automation - [] // <-- resource ID for localised name - [, - // The following should place the ToolWindow with the OutputWindow by default. - Orientation=ToolWindowOrientation.Bottom, - Style=VsDockStyle.Tabbed, - PositionX = 0, - PositionY = 0, - Width = 360, - Height = 120, - Window="34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3")>] // where 34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3 = outputToolWindow - [] - internal FSharpProjectPackage() as this = + + (* NOTE: search for FSHARP-TOOLS-INTERACTIVE-LINK *) + (* NOTE: the cat/sub-cat names appear in an error message in sessions.ml, fix up any changes there *) + // true = supports automation + [,"F# Tools", "F# Interactive",6000s, 6001s, true)>] + [] // <-- resource ID for localised name + // The following should place the ToolWindow with the OutputWindow by default, where 34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3 = outputToolWindow + [, Orientation=ToolWindowOrientation.Bottom, Style=VsDockStyle.Tabbed, PositionX = 0, PositionY = 0, Width = 360, Height = 120, Window="34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3")>] + [] + type internal FSharpProjectPackage() as this = inherit ProjectPackage() let mutable vfsiToolWindow = Unchecked.defaultof @@ -310,9 +280,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. this.RegisterProjectFactory(new FSharpProjectFactory(this)) //this.RegisterProjectFactory(new FSharpWPFProjectFactory(this :> IServiceProvider)) -#if DESIGNER - this.RegisterEditorFactory(new EditorFactory(this)) -#endif // was used to ensure the LS has been initialized, because the TypeProviderSecurityGlobals // global state was needed for e.g. Tools\Options //TODO the TypeProviderSecurityGlobals does not exists anymore, remove the initialization? @@ -376,9 +343,9 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. GetToolWindowAsITestVFSI().GetMostRecentLines(n) - and /// Factory for creating our editor, creates FSharp Projects - [] - internal FSharpProjectFactory(package:FSharpProjectPackage ) = + /// Factory for creating our editor, creates FSharp Projects + [] + type internal FSharpProjectFactory(package:FSharpProjectPackage ) = inherit ProjectFactory(package) override this.CreateProject() = @@ -389,43 +356,14 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. (project :> ProjectNode) - and /// This class is a 'fake' project factory that is used by WAP to register WAP specific information about - /// FSharp projects. - [] - internal WAFSharpProjectFactory() = class end + /// This class is a 'fake' project factory that is used by WAP to register WAP specific information about + /// FSharp projects. + [] + type internal WAFSharpProjectFactory() = class end -#if DESIGNER - and [] - [] - [] - public FSharpWPFFlavor(site:IServiceProvider) = - inherit FlavoredProjectBase() - override x.GetGuidProperty(itemId:uint32, propId:int ) = - if (propId = int32 __VSHPROPID2.VSHPROPID_AddItemTemplatesGuid) then - typeof.GUID - else - base.GetGuidProperty(itemId, propId) - - override x.GetProperty(itemId:uint32, propId:int, property:byref) = - base.GetProperty(itemId, propId, &property) - - and [] - internal FSharpWPFProjectFactory(site:IServiceProvider) = - inherit FlavoredProjectFactoryBase() - - /// Create an instance of our project. The initialization will be done later - /// when VS calls InitalizeForOuter on it. - - /// This is only useful if someone else is subtyping us - /// An uninitialized instance of our project - override x.PreCreateForOuter(outerProjectIUnknown:IntPtr) = box (new FSharpWPFFlavor(site)) - -#endif - and - - [] - internal FSharpProjectNode(package:FSharpProjectPackage) as this = + [] + type internal FSharpProjectNode(package:FSharpProjectPackage) as this = inherit ProjectNode() #if FX_ATLEAST_45 @@ -433,9 +371,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. let GUID_MruPage = new Guid("{BF42FC6C-1C43-487F-A524-C2E7BC707479}") #endif let mutable vsProject : VSLangProj.VSProject = null -#if DESIGNER +#if AUTOMATION let mutable codeDomProvider : Microsoft.VisualStudio.Designer.Interfaces.IVSMDCodeDomProvider = null - let mutable designerContext : DesignerContext = null #endif let mutable trackDocumentsHandle = 0u let mutable addFilesNotification : option<(array -> unit)> = None // this object is only used for helping re-order newly added files (VS defaults to alphabetical order) @@ -502,7 +439,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. // The following properties classes are specific to F# so we can use their GUIDs directly this.AddCATIDMapping(typeof, typeof.GUID) this.AddCATIDMapping(typeof, typeof.GUID) -#if DESIGNER +#if AUTOMATION this.AddCATIDMapping(typeof, typeof.GUID) #endif // This one we use the same as F# file nodes since both refer to files @@ -656,23 +593,15 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. this.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) this.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) - begin match TryGetService(x.Site) with + match TryGetService(x.Site) with | Some(libraryManager) -> libraryManager.RegisterHierarchy(this.InteropSafeIVsHierarchy) | _ -> () - end // Listen for changes to files in the project let documentTracker = this.Site.GetService(typeof) :?> IVsTrackProjectDocuments2 documentTracker.AdviseTrackProjectDocumentsEvents(this, &trackDocumentsHandle) |> ignore -#if DESIGNER - //If this is a WPFFlavor-ed project, then add a project-level DesignerContext service to provide - //event handler generation (EventBindingProvider) for the XAML designer. - x.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) -#endif - - /// Returns the outputfilename based on the output type member x.OutputFileName = let assemblyName = this.ProjectMgr.GetProjectProperty(GeneralPropertyPageTag.AssemblyName.ToString(), true) @@ -682,21 +611,12 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. assemblyName + GetOutputExtension(outputType) -#if DESIGNER +#if AUTOMATION /// Retreive the CodeDOM provider member this.CodeDomProvider : IVSMDCodeDomProvider = if (codeDomProvider= null) then codeDomProvider <- (new VSMDFSharpProvider(this.VSProject) :> IVSMDCodeDomProvider) codeDomProvider - - member this.DesignerContext : Microsoft.Windows.Design.Host.DesignerContext = - if (designerContext= null) then - designerContext <- new DesignerContext() - //Set the RuntimeNameProvider so the XAML designer will call it when items are added to - //a design surface. Since the provider does not depend on an item context, we provide it at - //the project level. - designerContext.RuntimeNameProvider <- new FSharpRuntimeNameProvider() - designerContext #endif /// Get the VSProject corresponding to this project @@ -880,7 +800,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. typeof.GUID typeof.GUID |] (VSHiveUtilities.getPriorityExtendedPropertyPages()) -#if DESIGNER +#if AUTOMATION override x.GetAutomationObject() = new OAFSharpProject(this) |> box #endif @@ -984,11 +904,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. let newNode = new FSharpFileNode(this, item, hierarchyId) newNode.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) newNode.OleServiceProvider.AddService(typeof, newNode.ServiceCreator, false) -#if DESIGNER - if not (String.IsNullOrEmpty(includ) && Path.GetExtension(includ).Equals(".xaml", StringComparison.OrdinalIgnoreCase)) then - //Create a DesignerContext for the XAML designer for this file - newNode.OleServiceProvider.AddService(typeof, newNode.ServiceCreator, false) -#endif newNode.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) if (FSharpProjectNode.IsCompilingFSharpFile(includ)) then newNode.OleServiceProvider.AddService(typeof, new OleServiceProvider.ServiceCreatorCallback(this.CreateServices), false) @@ -1404,13 +1319,11 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. /// Creates the services exposed by this project. member x.CreateServices(serviceType:Type) = -#if DESIGNER +#if AUTOMATION if (typeof = serviceType) then this.CodeDomProvider |> box else if (typeof = serviceType) then this.CodeDomProvider.CodeDomProvider - else if (typeof = serviceType) then - this.DesignerContext |> box else #endif if (typeof = serviceType) then @@ -1740,30 +1653,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. result <- null VSConstants.E_NOTIMPL -#if DESIGNER - //Validate input - if (String.IsNullOrEmpty(mkDocument)) then - raise <| ArgumentException("Was null or empty", "mkDocument") - - // Make sure that the document moniker passed to us is part of this project - // We also don't care if it is not a F# file node - let mutable itemid = 0u - ErrorHandler.ThrowOnFailure(x.ParseCanonicalName(mkDocument, &itemid)) |> ignore - let hierNode = x.NodeFromItemId(itemid) - if ((hierNode= null) || not (hierNode :? FSharpFileNode)) then - VSConstants.E_NOTIMPL - else - begin match (propid) with - | i when i = int32 __VSPSEPROPID.VSPSEPROPID_UseGlobalEditorByDefault -> - // we do not want to use global editor for form files - result <- box true - | i when i = int32 __VSPSEPROPID.VSPSEPROPID_ProjectDefaultEditorName -> - result <- box "FSharp Form Editor" - | _ -> () - end - - VSConstants.S_OK -#endif member x.GetSpecificEditorType( _mkDocument:string, guidEditorType:byref ) = // Ideally we should at this point initalize a File extension to EditorFactory guid Map e.g. @@ -1781,17 +1670,15 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. VSConstants.E_NOTIMPL end - and - - // Why is this a separate class, rather than an interface implemented on - // FSharpProjectNode? Because, at the time of initial registration of this - // interface, we are still initializing FSharpProjectNode itself, and trying - // to cast "this" (FSharpProjectNode) to an IVsFoo and passing it to VS wraps - // the object in a COM CCW wrapper, which is then unexpected when the startup - // code later comes along and tries to CCW wrap it again. Using a separate - // class means we have a separate object to CCW wrap, avoiding the problematic - // "double CCW-wrapping" of the same object. - internal SolutionEventsListener(projNode) = + // Why is this a separate class, rather than an interface implemented on + // FSharpProjectNode? Because, at the time of initial registration of this + // interface, we are still initializing FSharpProjectNode itself, and trying + // to cast "this" (FSharpProjectNode) to an IVsFoo and passing it to VS wraps + // the object in a COM CCW wrapper, which is then unexpected when the startup + // code later comes along and tries to CCW wrap it again. Using a separate + // class means we have a separate object to CCW wrap, avoiding the problematic + // "double CCW-wrapping" of the same object. + type internal SolutionEventsListener(projNode) = let mutable queuedWork : option> = None // The CCW wrapper seems to prevent an object-identity test, so we determine whether // two IVsHierarchy objects are equal by comparing their captions. (It's ok if this @@ -1907,13 +1794,11 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. 0 - and - - [] - [] - [] - [] - public FSharpProjectNodeProperties internal (node:FSharpProjectNode) = + [] + [] + [] + [] + type public FSharpProjectNodeProperties internal (node:FSharpProjectNode) = inherit ProjectNodeProperties(node) [] @@ -2061,7 +1946,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. | _ -> raise <| ArgumentException(FSharpSR.GetString(FSharpSR.InvalidRunPostBuildEvent), "value") this.Node.ProjectMgr.SetProjectProperty(ProjectFileConstants.RunPostBuildEvent, runPostBuildEventInteger) - and internal FSharpFolderNode(root : FSharpProjectNode, relativePath : string, projectElement : ProjectElement) = + type internal FSharpFolderNode(root : FSharpProjectNode, relativePath : string, projectElement : ProjectElement) = inherit FolderNode(root, relativePath, projectElement) override x.QueryStatusOnNode(guidCmdGroup:Guid, cmd:uint32, pCmdText:IntPtr, result:byref) = @@ -2092,7 +1977,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. else base.ExecCommandOnNode(guidCmdGroup, cmd, nCmdexecopt, pvaIn, pvaOut) - and internal FSharpBuildAction = + type internal FSharpBuildAction = | None = 0 | Compile = 1 | Content = 2 @@ -2101,7 +1986,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. | Page = 5 | Resource = 6 - and public FSharpBuildActionPropertyDescriptor internal (prop : PropertyDescriptor) = + type public FSharpBuildActionPropertyDescriptor internal (prop : PropertyDescriptor) = inherit PropertyDescriptor(prop) override this.DisplayName = SR.BuildAction @@ -2128,12 +2013,11 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. override this.ShouldSerializeValue(o : obj) = prop.ShouldSerializeValue(o) - and - [] - [] - [] - public FSharpFileNodeProperties internal (node:HierarchyNode) = + [] + [] + [] + type public FSharpFileNodeProperties internal (node:HierarchyNode) = inherit FileNodeProperties(node) [] @@ -2157,8 +2041,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. else base.CreateDesignPropertyDescriptor(propertyDescriptor) - and // Represents most (non-reference) nodes in the solution hierarchy of an F# project (e.g. foo.fs, bar.fsi, app.config) - internal FSharpFileNode(root:FSharpProjectNode, e:ProjectElement, hierarchyId) = + /// Represents most (non-reference) nodes in the solution hierarchy of an F# project (e.g. foo.fs, bar.fsi, app.config) + type internal FSharpFileNode(root:FSharpProjectNode, e:ProjectElement, hierarchyId) = inherit LinkedFileNode(root,e, hierarchyId) static let protectVisualState (root : FSharpProjectNode) (node : HierarchyNode) f = @@ -2186,10 +2070,9 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. let sp = new Microsoft.VisualStudio.Shell.ServiceProvider(iOle) Some(new SelectionElementValueChangedListener(sp, root)) -#if DESIGNER +#if AUTOMATION let mutable vsProjectItem : OAVSProjectItem = null let mutable automationObject : OAFSharpFileItem option = None - let mutable designerContext : DesignerContext = null #endif do selectionChangedListener.Value.Init() @@ -2244,20 +2127,12 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. with get() = x.ItemNode.GetMetadata(ProjectFileConstants.SubType) and set(value) = x.ItemNode.SetMetadata(ProjectFileConstants.SubType, value) -#if DESIGNER +#if AUTOMATION member x.VSProjectItem = if (null = vsProjectItem) then vsProjectItem <- new OAVSProjectItem(x) vsProjectItem - member x.DesignerContext : Microsoft.Windows.Design.Host.DesignerContext = - if (designerContext= null) then - designerContext <- new DesignerContext() - //Set the EventBindingProvider for this XAML file so the designer will call it - //when event handlers need to be generated - designerContext.EventBindingProvider <- new FSharpEventBindingProvider(x.Parent.FindChild(x.Url.Replace(".xaml", ".fs")) :?> FSharpFileNode) - designerContext - override x.Object = x.VSProjectItem |> box #endif @@ -2283,7 +2158,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. finally base.Dispose(disposing) -#if DESIGNER +#if AUTOMATION /// Returns an FSharp FileNode specific object implmenting DTE.ProjectItem override x.GetAutomationObject() = if automationObject.IsNone then @@ -2676,15 +2551,11 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. member x.CreateServices(serviceType:Type ) = if (typeof = serviceType) then x.GetAutomationObject() -#if DESIGNER - else if (typeof = serviceType) then - x.DesignerContext |> box -#endif else null - and /// Knows about special requirements for project to project references - internal FSharpProjectReferenceNode = + /// Knows about special requirements for project to project references + type internal FSharpProjectReferenceNode = inherit ProjectReferenceNode new(root:ProjectNode, element:ProjectElement) = { inherit ProjectReferenceNode(root, element) } @@ -2702,13 +2573,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. /// The error handler delegate to return /// false if reference cannot be added, otherwise true override x.CheckIfCanAddReference() = -#if DESIGNER - //If source project has designer files of subtype form and if the target output (assembly) does not exists - //show a dialog that tells the user to build the target project before the project reference can be added - if not (Internal.Utilities.FileSystem.File.SafeExists(x.ReferencedProjectOutputPath)) && x.HasFormItems() then - AddReferenceCheckResult.Failed(FSharpSR.ProjectReferenceError2) - else -#endif base.CheckIfCanAddReference() /// Evaluates all fsharpfilenode children of the project and returns true if anyone has subtype set to Form @@ -2732,8 +2596,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. projectType :?> string - and /// Reference container node for FSharp references. - internal FSharpReferenceContainerNode(project:FSharpProjectNode) = + /// Reference container node for FSharp references. + type internal FSharpReferenceContainerNode(project:FSharpProjectNode) = inherit ReferenceContainerNode(project :> ProjectNode) override x.AddChild(c) = @@ -2747,7 +2611,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. override x.CreateProjectReferenceNode(selectorData:VSCOMPONENTSELECTORDATA) = (new FSharpProjectReferenceNode(x.ProjectMgr, selectorData.bstrTitle, selectorData.bstrFile, selectorData.bstrProjRef) :> ProjectReferenceNode) - and internal SelectionElementValueChangedListener(serviceProvider:Microsoft.VisualStudio.Shell.ServiceProvider, projMgr:ProjectNode ) = + type internal SelectionElementValueChangedListener(serviceProvider:Microsoft.VisualStudio.Shell.ServiceProvider, projMgr:ProjectNode ) = inherit SelectionListener(serviceProvider) override x.OnElementValueChanged(elementid:uint32, varValueOld:obj, _varValueNew:obj) = @@ -2769,428 +2633,12 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. () hr -#if DESIGNER - and [] - internal EditorFactory(package :FSharpProjectPackage) = class - - let mutable serviceProvider : ServiceProvider = null - - let GetTextBuffer(docDataExisting:System.IntPtr ) : IVsTextLines = - if (docDataExisting = IntPtr.Zero) then - // Create a new IVsTextLines buffer. - let textLinesType = typeof - let mutable riid = textLinesType.GUID - let mutable clsid = typeof.GUID - let textLines = package.CreateInstance(&clsid, &riid, textLinesType) :?> IVsTextLines - - // set the buffer's site - (box textLines :?> IObjectWithSite).SetSite(GetService(serviceProvider :> IServiceProvider)) - textLines - - else - // Use the existing text buffer - let dataObject = Marshal.GetObjectForIUnknown(docDataExisting) - match dataObject with - | :? IVsTextLines as textLines -> - textLines - | :? IVsTextBufferProvider as textBufferProvider -> - // Try get the text buffer from textbuffer provider - let hr, textLines = textBufferProvider.GetTextBuffer() - // REVIEW: ignoring failing HR here - textLines - | _ -> - // Unknown docData type then, so we have to force VS to close the other editor. - ErrorHandler.ThrowOnFailure((int) VSConstants.VS_E_INCOMPATIBLEDOCDATA) |> ignore - null - - member private ef.CreateCodeView(textLines:IVsTextLines, editorCaption:byref, cmdUI:byref) = - let codeWindowType = typeof - let mutable riid = codeWindowType.GUID - let mutable clsid = typeof.GUID - let window = package.CreateInstance(&clsid, &riid, codeWindowType) :?> IVsCodeWindow - ErrorHandler.ThrowOnFailure(window.SetBuffer(textLines)) |> ignore - ErrorHandler.ThrowOnFailure(window.SetBaseEditorCaption(null)) |> ignore - ErrorHandler.ThrowOnFailure(window.GetEditorCaption(READONLYSTATUS.ROSTATUS_Unknown, &editorCaption)) |> ignore - cmdUI <- VSConstants.GUID_TextEditorFactory - Marshal.GetIUnknownForObject(window) - - member private ef.CreateFormView(hierarchy:IVsHierarchy, itemid:uint32, textLines:IVsTextLines, editorCaption:byref, cmdUI:byref) = - // Request the Designer Service - let designerService = GetService(serviceProvider :> IServiceProvider) - - // Create loader for the designer - let designerLoader = designerService.CreateDesignerLoader("Microsoft.VisualStudio.Designer.Serialization.VSDesignerLoader") :?> IVSMDDesignerLoader - - let mutable loaderInitalized = false - try - let provider = GetService(serviceProvider :> IServiceProvider) - // Initialize designer loader - designerLoader.Initialize(provider, hierarchy, (int)itemid, textLines) - loaderInitalized <- true - - // Create the designer - let designer = designerService.CreateDesigner(provider, designerLoader) +#if AUTOMATION - // Get editor caption - editorCaption <- designerLoader.GetEditorCaption(int32 READONLYSTATUS.ROSTATUS_Unknown) - - // Get view from designer - let docView = designer.View - - // Get command guid from designer - cmdUI <- designer.CommandGuid - - Marshal.GetIUnknownForObject(docView) - - with e -> - // The designer loader may have created a reference to the shell or the text buffer. - // In case we fail to create the designer we should manually dispose the loader - // in order to release the references to the shell and the textbuffer - if (loaderInitalized) then - designerLoader.Dispose() - raise(e) - - - member private ef.CreateDocumentView(physicalView:string, hierarchy:IVsHierarchy, itemid:uint32, textLines:IVsTextLines, editorCaption:byref, cmdUI:byref) = - //Init out params - editorCaption <- String.Empty - cmdUI <- Guid.Empty - - if (String.IsNullOrEmpty(physicalView)) then - // create code window as default physical view - ef.CreateCodeView(textLines, &editorCaption, &cmdUI) - else if (String.Compare(physicalView, "design", true, CultureInfo.InvariantCulture) = 0) then - // Create Form view - ef.CreateFormView(hierarchy, itemid, textLines, &editorCaption, &cmdUI) - else - // We couldn't create the view - // Return special error code so VS can try another editor factory. - ErrorHandler.ThrowOnFailure((int)VSConstants.VS_E_UNSUPPORTEDFORMAT) |> ignore - - IntPtr.Zero - - - interface IVsEditorFactory with - member x.SetSite(psp: IOleServiceProvider) = - serviceProvider <- new ServiceProvider(psp) - VSConstants.S_OK - - // This method is called by the Environment (inside IVsUIShellOpenDocument:: - // OpenStandardEditor and OpenSpecificEditor) to map a LOGICAL view to a - // PHYSICAL view. A LOGICAL view identifies the purpose of the view that is - // desired (e.g. a view appropriate for Debugging [LOGVIEWID_Debugging], or a - // view appropriate for text view manipulation :?> by navigating to a find - // result [LOGVIEWID_TextView]). A PHYSICAL view identifies an actual type - // of view implementation that an IVsEditorFactory can create. - // - // NOTE: Physical views are identified by a string of your choice with the - // one constraint that the default/primary physical view for an editor - // *MUST* use a NULL string :?> its physical view name (*pbstrPhysicalView = NULL). - // - // NOTE: It is essential that the implementation of MapLogicalView properly - // validates that the LogicalView desired is actually supported by the editor. - // If an unsupported LogicalView is requested then E_NOTIMPL must be returned. - // - // NOTE: The special Logical Views supported by an Editor Factory must also - // be registered in the local registry hive. LOGVIEWID_Primary is implicitly - // supported by all editor types and does not need to be registered. - // For example, an editor that supports a ViewCode/ViewDesigner scenario - // might register something like the following: - // HKLM\Software\Microsoft\VisualStudio\9.0\Editors\ - // {...guidEditor...}\ - // LogicalViews\ - // {...LOGVIEWID_TextView...} = s '' - // {...LOGVIEWID_Code...} = s '' - // {...LOGVIEWID_Debugging...} = s '' - // {...LOGVIEWID_Designer...} = s 'Form' - // - member this.MapLogicalView(logicalView : Guid byref, physicalView : string byref) = - // initialize out parameter - physicalView <- null - - let isSupportedView = - // Determine the physical view - if (VSConstants.LOGVIEWID_Primary = logicalView) then - // primary view uses NULL :?> pbstrPhysicalView - true - else if (VSConstants.LOGVIEWID_Designer = logicalView) then - physicalView <- "Design" - true - else - false - - if (isSupportedView) then - VSConstants.S_OK - else - // E_NOTIMPL must be returned for any unrecognized rguidLogicalView values - VSConstants.E_NOTIMPL - - member this.Close() = - VSConstants.S_OK - - member this.CreateEditorInstance - (createEditorFlags:uint32, - documentMoniker:string, - physicalView:string, - hierarchy:IVsHierarchy, - itemid:uint32, - docDataExisting:System.IntPtr, - docView : byref, - docData: byref, - editorCaption:byref, - commandUIGuid:byref, - createDocumentWindowFlags:byref) = - // Initialize output parameters - docView <- IntPtr.Zero - docData <- IntPtr.Zero - commandUIGuid <- GuidList.guidEditorFactory - createDocumentWindowFlags <- 0 - editorCaption <- null - - // Validate inputs - if ((createEditorFlags &&& (VSConstants.CEF_OPENFILE ||| VSConstants.CEF_SILENT)) = 0u) then - VSConstants.E_INVALIDARG - else - - - // Get a text buffer - let textLines = GetTextBuffer(docDataExisting) - - // Assign docData IntPtr to either existing docData or the new text buffer - if (docDataExisting <> IntPtr.Zero) then - docData <- docDataExisting - Marshal.AddRef(docData) |> ignore - else - docData <- Marshal.GetIUnknownForObject(textLines) - - try - docView <- this.CreateDocumentView(physicalView, hierarchy, itemid, textLines, &editorCaption, &commandUIGuid) - VSConstants.S_OK - finally - if (docView = IntPtr.Zero) then - if (docDataExisting <> docData && docData <> IntPtr.Zero) then - // Cleanup the instance of the docData that we have addref'ed - Marshal.Release(docData) |> ignore - docData <- IntPtr.Zero - end - end // class EditorFactory - - and - - /// This class provides the event handler generation for the - /// WPF designer. Note that this object is NOT required for languages - /// where the CodeDom is used for event handler generation. This is needed - /// in the case of FSharp due to limitations in the static compiler - /// support. - FSharpEventBindingProvider(fsFile:FSharpFileNode ) = - inherit EventBindingProvider() - let project = fsFile.ProjectMgr - - /// This method will get the CodeDomDocDataAdapter corresponding to the active XAML file in - /// the designer. - - /// The CodeDomDocDataAdapter for the .py file that corresponds to the active xaml file - let GetDocDataAdapterForFSharpFile() = - let codeDom = GetService2(GetProvider(fsFile) :> IServiceProvider) - let project = (project :?> FSharpProjectNode) in - let data = new DocData(project.ProjectMgr.Site, fsFile.Url) - let cdDocDataAdapter = new CodeDomDocDataAdapter(project.ProjectMgr.Site, data) - cdDocDataAdapter - - /// The CodeTypeDeclaration for the .py file that corresponds to the active xaml file - let GetCodeDomForFSharpFile() = - GetDocDataAdapterForFSharpFile().TypeDeclaration - - let GetHandlersFromActiveFsharpFile(methodName:string ) = - let methods = new List() - //We expect that fsharp files that contain the event wiring for XAML files contain a namespace - //and a class. - for (memb:CodeTypeMember) in GetCodeDomForFSharpFile().Members do - //We just match on the element name here (e.g. button1_Click), not on parameters - if (memb.Name = methodName) then - methods.Add(memb) - - methods - - override x.AddEventHandler(eventDescription:EventDescription, objectName:string, methodName:string ) = - let Init = "__init__" - //This is not the most optimal solution for WPF since we will call FindLogicalNode for each event handler, - //but it simplifies the code generation for now. - - let adapter = GetDocDataAdapterForFSharpFile() - - //Find the __init__ method - let meth = - let searchResult = - seq { for x in adapter.TypeDeclaration.Members -> x } - |> Seq.tryFind (fun (ctMember:CodeTypeMember ) -> (ctMember :? CodeConstructor) && (ctMember.Name = Init)) - match searchResult with - | None -> (new CodeConstructor(Name=Init) :> CodeMemberMethod) - | Some ctMember -> (ctMember :?> CodeMemberMethod) in - - //Create a code statement which looks like: LogicalTreeHelper.FindLogicalNode(self.Root, "button1").Click += self.button1_Click - failwith "AddEventHandler: NYI" - assert false - (* - let logicalTreeHelper = new CodeTypeReferenceExpression("LogicalTreeHelper") - let findLogicalNodeMethod = new CodeMethodReferenceExpression(logicalTreeHelper, "FindLogicalNode") - let selfWindow = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "Root") - let findLogicalNodeInvoke = new CodeMethodInvokeExpression( findLogicalNodeMethod, selfWindow.ToString(), new CodeSnippetExpression("\'" + objectName + "\'")) - let createDelegateExpression = new CodeDelegateCreateExpression(new CodeTypeReference("System.EventHandler"), new CodeThisReferenceExpression(), methodName) - let attachEvent = new CodeAttachEventStatement(findLogicalNodeInvoke, eventDescription.Name, createDelegateExpression) - meth.Statements.Add(attachEvent) - adapter.Generate() - *) - - - override x.AllowClassNameForMethodName() = - true - - override x.CreateMethod(eventDescription:EventDescription, methodName:string ) = - let meth = new CodeMemberMethod() - meth.Name <- methodName - - for (param:EventParameter) in eventDescription.Parameters do - meth.Parameters.Add(new CodeParameterDeclarationExpression(param.TypeName, param.Name)) |> ignore - - //Finally, add the new method to the class - let adapter = GetDocDataAdapterForFSharpFile() - adapter.TypeDeclaration.Members.Add(meth) |> ignore - adapter.Generate() - true - - override x.CreateUniqueMethodName(objectName:string, eventDescription:EventDescription ) = - let originalMethodName = String.Format(CultureInfo.InvariantCulture, "{0}_{1}", [| box objectName; box eventDescription.Name |]) - let mutable methodName = originalMethodName - - let mutable methods = GetHandlersFromActiveFsharpFile(String.Format(CultureInfo.InvariantCulture, "{0}_{1}", [| box objectName; box eventDescription.Name |])) - while (methods.Count > 0) do - //Try to append a _# at the end until we find an unused method name - let matchRes = Regex.Match(methodName, @"_\d+$") - if not (matchRes.Success) then - methodName <- originalMethodName + "_1" - else - let nextValue = Int32.Parse(matchRes.Value.Substring(1)) + 1 - methodName <- String.Format(CultureInfo.InvariantCulture, "{0}_{1}", [| box originalMethodName; box nextValue |]) - methods <- GetHandlersFromActiveFsharpFile(methodName) - - methodName - - override x. GetCompatibleMethods(eventDescription:EventDescription ) = - raise <| NotImplementedException() - - override x.GetMethodHandlers(eventDescription:EventDescription, objectName:string) = - [| for ( memb:CodeTypeMember) in GetCodeDomForFSharpFile().Members do - if (memb :? CodeConstructor) then - let ctor = memb :?> CodeConstructor - for (statement:CodeStatement) in ctor.Statements do - if (statement :? CodeAttachEventStatement) then - let codeAttach = statement :?> CodeAttachEventStatement - //Skip if this is not the event that the designer is looking for. - if not(codeAttach.Event.EventName <> eventDescription.Name) then - if (codeAttach.Event.TargetObject :? CodeMethodInvokeExpression) then - let findLogNode = codeAttach.Event.TargetObject :?> CodeMethodInvokeExpression - if (findLogNode.Parameters.Count >= 2) then - if (findLogNode.Parameters.[1] :? CodePrimitiveExpression) then - let targetObjectName = (findLogNode.Parameters.[1] :?> CodePrimitiveExpression).Value.ToString().Trim([| '"' |]) - if(targetObjectName.Equals(objectName, StringComparison.Ordinal)) then - if (codeAttach.Listener :? CodeDelegateCreateExpression) then - yield ((codeAttach.Listener :?> CodeDelegateCreateExpression).MethodName) |] - |> Seq.readonly - - override x.IsExistingMethodName(eventDescription:EventDescription, methodName:string) = - let elements = GetHandlersFromActiveFsharpFile(methodName) - elements.Count <> 0 - - override x.RemoveEventHandler(eventDescription:EventDescription, objectName:string, methodName:string) = - raise <| NotImplementedException() - - override x.RemoveMethod(eventDescription:EventDescription, methodName:string) = - raise <| NotImplementedException() - - override x.SetClassName(className:string) = - () - - override x.ShowMethod(eventDescription:EventDescription, methodName:string) = - let adapter = GetDocDataAdapterForFSharpFile() - let methodsToShow = GetHandlersFromActiveFsharpFile(methodName) - if (methodsToShow= null || methodsToShow.Count < 1) then - false - else - - let mutable point = new Point() - if (methodsToShow.[0] <> null) then - //We can't navigate to every method, so just take the first one in the list. - let pt = methodsToShow.[0].UserData.[ box(typeof) ] - if (pt <> null) then - point <- (pt :?> Point) - //Get IVsTextManager to navigate to the code - let mgr = (Package.GetGlobalService(typeof) :?> IVsTextManager) - let mutable logViewCode = VSConstants.LOGVIEWID_Code - ErrorHandler.Succeeded(mgr.NavigateToLineAndColumn(adapter.DocData.Buffer, &logViewCode, point.Y - 1, point.X, point.Y - 1, point.X)) - - override x.ValidateMethodName(eventDescription:EventDescription, methodName:string) = - () - - - and FSharpRuntimeNameProvider() = - inherit RuntimeNameProvider() - override x.CreateValidName(proposal:string ) = proposal - override x.IsExistingName(name:string ) = - //We will get uniqueness in the XAML file via the matchScope predicate. - //In a more complete implementation, this method would verify that there isn't - //a member in the code behind file with the given name. - false - - override x.NameFactory = (new FSharpRuntimeNameFactory() :> RuntimeNameFactory) - - and - - [] - FSharpRuntimeNameFactory() = - inherit RuntimeNameFactory() - override x.CreateUniqueName(itemType:Type, proposedName:string, matchScope:Predicate, rootScope:bool, provider:RuntimeNameProvider ) = - if (null = itemType) then raise <| ArgumentNullException("itemType") - if (null = matchScope) then raise <| ArgumentNullException("matchScope") - if (null = provider) then raise <| ArgumentNullException("provider") - - let mutable name = null - let mutable baseName = proposedName - - if (String.IsNullOrEmpty(baseName)) then - baseName <- TypeDescriptor.GetClassName(itemType) - let lastDot = baseName.LastIndexOf('.') - if (lastDot <> -1) then - baseName <- baseName.Substring(lastDot + 1) - - // Names should start with a lower-case character - baseName <- System.Char.ToLower(baseName.[0], CultureInfo.InvariantCulture).ToString() + baseName.Substring(1) - - let mutable idx = 1 - let mutable isUnique = false - while not (isUnique) do - name <- String.Format(CultureInfo.InvariantCulture, "{0}{1}", [| box baseName; box idx |]) - idx <- idx + 1 - - // Test for uniqueness - isUnique <- not (matchScope.Invoke(name)) - - let tempName = name - name <- provider.CreateValidName(tempName) - - if not (String.Equals(name, tempName, StringComparison.Ordinal)) then - // RNP has changed the name, test again for uniqueness - isUnique <- not (matchScope.Invoke(name)) - - if (isUnique && rootScope) then - // Root name scope means we have to let the RNP test for uniqueness too - isUnique <- not (provider.IsExistingName(name)) - name - - and /// Add support for automation on py files. - [] - [] - public OAFSharpFileItem(project:OAProject, node:FileNode) = + /// Add support for automation on fs files. + [] + [] + type public OAFSharpFileItem(project:OAProject, node:FileNode) = inherit OAFileItem(project, node) let mutable codeModel : EnvDTE.FileCodeModel = null @@ -3216,8 +2664,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. else base.Open(viewKind) - and [] - public OAFSharpProject(fsharpProject:FSharpProjectNode) = + [] + type public OAFSharpProject(fsharpProject:FSharpProjectNode) = inherit OAProject(fsharpProject) override x.CodeModel : EnvDTE.CodeModel = From eed675b055ac81c7e89cacf2669833ac28ebc45e Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 10 Mar 2016 22:41:22 +0000 Subject: [PATCH 055/334] allow open and exceptions in mutrec groups --- src/fsharp/FSComp.txt | 1 + src/fsharp/TypeChecker.fs | 246 ++++++++++-------- src/fsharp/ast.fs | 8 +- src/fsharp/vs/ServiceNavigation.fs | 18 +- src/fsharp/vs/ServiceParseTreeWalk.fs | 4 + .../FSharp.ProjectSystem.FSharp/Project.fs | 2 +- 6 files changed, 163 insertions(+), 116 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 3207c762140..8da52035e93 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1274,3 +1274,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3197,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3198,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" 3199,tcRecImplied,"The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored" +3200,tcOpenFirstInMutRec,"'open' declarations must come first in a module in a recursive declaration group" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 9e2c00e18c6..36cf18c1546 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3780,14 +3780,16 @@ type ValSpecResult = ValSpecResult of ParentRef * ValMemberInfoTransient option //------------------------------------------------------------------------- [] -type MutRecShape<'TypeData, 'LetsData, 'ModuleData> = +type MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> = | Tycon of 'TypeData | Lets of 'LetsData - | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData> list + | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> list + | Open of 'OpenData module MutRecShapes = let rec map f1 f2 f3 x = x |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 a) | MutRecShape.Lets b -> MutRecShape.Lets (f2 b) | MutRecShape.Module (c,d) -> MutRecShape.Module (f3 c, map f1 f2 f3 d)) @@ -3800,6 +3802,7 @@ module MutRecShapes = let rec mapWithEnv f1 f2 (env: 'Env) x = x |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 env a) | MutRecShape.Lets b -> MutRecShape.Lets (f2 env b) | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv f1 f2 env2 d)) @@ -3808,6 +3811,7 @@ module MutRecShapes = let rec mapWithParent parent f1 f2 f3 xs = xs |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) | MutRecShape.Lets b -> MutRecShape.Lets (f3 parent b) | MutRecShape.Module (c,d) -> @@ -3818,6 +3822,7 @@ module MutRecShapes = let env = f2 env xs env, xs |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a | MutRecShape.Tycon a -> MutRecShape.Tycon a | MutRecShape.Lets b -> MutRecShape.Lets b | MutRecShape.Module (c,ds) -> @@ -3842,58 +3847,61 @@ module MutRecShapes = xs |> List.collect (fun elem -> match elem with | MutRecShape.Tycon a -> [elem; MutRecShape.Lets (f1 a)] + | MutRecShape.Open _ -> [elem] | MutRecShape.Lets _ -> [elem] | MutRecShape.Module (c,d) -> [MutRecShape.Module (c, expandTycons f1 d)]) let rec mapFoldWithEnv f1 z env xs = (z,xs) ||> List.mapFold (fun z x -> match x with - | MutRecShape.Tycon _ -> let x2,z = f1 z env x in x2, z - | MutRecShape.Lets _ -> let x2,z = f1 z env x in x2, z - | MutRecShape.Module ((c,env2),ds) -> let ds2,z = mapFoldWithEnv f1 z env2 ds in MutRecShape.Module ((c, env2), ds2),z) + | MutRecShape.Module ((c,env2),ds) -> let ds2,z = mapFoldWithEnv f1 z env2 ds in MutRecShape.Module ((c, env2), ds2),z + | _ -> let x2,z = f1 z env x in x2, z) let rec collectTycons x = x |> List.collect (function | MutRecShape.Tycon a -> [a] - | MutRecShape.Lets _ -> [] - | MutRecShape.Module (_,d) -> collectTycons d) + | MutRecShape.Module (_,d) -> collectTycons d + | _ -> []) let topTycons x = x |> List.choose (function MutRecShape.Tycon a -> Some a | _ -> None) - let rec iter f1 f2 f3 x = + let rec iter f1 f2 f3 f4 x = x |> List.iter (function | MutRecShape.Tycon a -> f1 a | MutRecShape.Lets b -> f2 b - | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 d) + | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 f4 d + | MutRecShape.Open a -> f4 a) - let iterTycons f1 x = iter f1 ignore ignore x - let iterModules f1 x = iter ignore ignore f1 x + let iterTycons f1 x = iter f1 ignore ignore ignore x + let iterModules f1 x = iter ignore ignore f1 ignore x - let rec iterWithEnv f1 f2 env x = + let rec iterWithEnv f1 f2 f3 env x = x |> List.iter (function | MutRecShape.Tycon a -> f1 env a | MutRecShape.Lets b -> f2 env b - | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 env d) + | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 f3 env d + | MutRecShape.Open a -> f3 env a) - let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) env xs + let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) (fun _env _x -> ()) env xs type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * DeclKind * SynBinding +type MutRecDataForOpenDecl = MutRecDataForOpenDecl of LongIdent * range -type MutRecSignatureInitialData = MutRecShape list -type MutRecDefnsInitialData = MutRecShape list +type MutRecSignatureInitialData = MutRecShape list +type MutRecDefnsInitialData = MutRecShape list type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool -type MutRecDefnsPass1Data = MutRecShape list +type MutRecDefnsPass1Data = MutRecShape list type MutRecDefnsPass2DataForTycon = MutRecDefnsPass2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK type MutRecDefnsPass2DataForModule = MutRecDefnsPass2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace -type MutRecDefnsPass2Data = MutRecShape list +type MutRecDefnsPass2Data = MutRecShape list type MutRecDefnsPass2InfoForTycon = MutRecDefnsPass2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list -type MutRecDefnsPass2Info = MutRecShape list +type MutRecDefnsPass2Info = MutRecShape list /// RecursiveBindingInfo - flows through initial steps of TcLetrec @@ -12265,7 +12273,7 @@ module TyconBindingChecking = begin type TyconBindingsPassA = | TyconBindingsPassA of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPassA list - type MutRecBindingPassA = MutRecShape + type MutRecBindingPassA = MutRecShape /// The collected syntactic input definitions for a recursive group of type or type-extension definitions type MutRecBindingsPassA = MutRecBindingPassA list @@ -12287,7 +12295,7 @@ module TyconBindingChecking = begin type TyconBindingsPassB = TyconBindingsPassB of Tycon option * TyconRef * TyconBindingPassB list - type MutRecBindingPassB = MutRecShape + type MutRecBindingPassB = MutRecShape type MutRecBindingsPassB = MutRecBindingPassB list @@ -12303,7 +12311,7 @@ module TyconBindingChecking = begin type TyconBindingsPassC = TyconBindingsPassC of Tycon option * TyconRef * TyconBindingPassC list - type MutRecBindingPassC = MutRecShape + type MutRecBindingPassC = MutRecShape type MutRecBindingsPassC = MutRecBindingPassC list @@ -12325,6 +12333,7 @@ module TyconBindingChecking = begin let (tpenv,recBindIdx,uncheckedBindsRev) = outerState match defns with | MutRecShape.Module _ -> failwith "unreachable" + | MutRecShape.Open x -> MutRecShape.Open x, outerState | MutRecShape.Lets recBinds -> let normRecDefns = [ for (RecDefnBindingInfo(a,b,c,bind)) in recBinds do @@ -12530,6 +12539,7 @@ module TyconBindingChecking = begin match defnsA with | MutRecShape.Module _ -> failwith "unreachable" + | MutRecShape.Open x -> MutRecShape.Open x, outerState | MutRecShape.Lets binds -> let defnBs,(tpenv,_,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = @@ -13535,27 +13545,33 @@ let CheckForDuplicateModule _cenv env nm m = // Bind exception definitions //------------------------------------------------------------------------- -module TcExceptionDeclarations = begin +module TcExceptionDeclarations = - let private TcExnDefnCore cenv env parent tpenv (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,args,_,_,_),repr,doc,vis,m)) = + let TcExnDefnCore_Phase0 cenv env parent (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_,_,_,_),_,doc,vis,m)) = let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs + if not (String.isUpper id.idText) then errorR(NotUpperCaseConstructor(m)) + let vis,cpath = ComputeAccessAndCompPath env None m vis parent + let vis = TcRecdUnionAndEnumDeclarations.CombineReprAccess parent vis + CheckForDuplicateConcreteType cenv env (id.idText + "Exception") id.idRange + CheckForDuplicateConcreteType cenv env id.idText id.idRange + NewExn cpath id vis (TExnFresh (MakeRecdFieldsTable [])) attrs (doc.ToXmlDoc()) + + let TcExnDefnCore_Phase6_EstablishRepresentation cenv env parent (exnc: Entity) (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = let args = match args with (UnionCaseFields args) -> args | _ -> error(Error(FSComp.SR.tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors(),m)) let ad = env.eAccessRights + let id = exnc.Id - let args' = List.mapi (fun i fdef -> TcRecdUnionAndEnumDeclarations.TcAnonFieldDecl cenv env parent tpenv ("Data" + string i) fdef) args + let args' = List.mapi (fun i fdef -> TcRecdUnionAndEnumDeclarations.TcAnonFieldDecl cenv env parent emptyUnscopedTyparEnv ("Data" + string i) fdef) args TcRecdUnionAndEnumDeclarations.ValidateFieldNames(args, args') - if not (String.isUpper id.idText) then errorR(NotUpperCaseConstructor(m)) - let vis,cpath = ComputeAccessAndCompPath env None m vis parent - let vis = TcRecdUnionAndEnumDeclarations.CombineReprAccess parent vis - let exnc = - match repr with + let repr = + match reprIdOpt with | Some longId -> match ResolveExprLongIdent cenv.tcSink cenv.nameResolver m ad env.eNameResEnv TypeNameResolutionInfo.Default longId with | Item.ExnCase exnc, [] -> CheckTyconAccessible cenv.amap m env.eAccessRights exnc |> ignore if List.length args' <> 0 then errorR (Error(FSComp.SR.tcExceptionAbbreviationsShouldNotHaveArgumentList(),m)) - NewExn cpath id vis (TExnAbbrevRepr exnc) attrs (doc.ToXmlDoc()) + TExnAbbrevRepr exnc | Item.CtorGroup(_,meths) , [] -> // REVIEW: check this really is an exception type match args' with @@ -13570,7 +13586,7 @@ module TcExceptionDeclarations = begin match minfo.EnclosingType with | AppTy cenv.g (tcref,_) as ety when (TypeDefinitelySubsumesTypeNoCoercion 0 cenv.g cenv.amap m cenv.g.exn_ty ety) -> let tref = tcref.CompiledRepresentationForNamedType - NewExn cpath id vis (TExnAsmRepr tref) attrs (doc.ToXmlDoc()) + TExnAsmRepr tref | _ -> error(Error(FSComp.SR.tcExceptionAbbreviationsMustReferToValidExceptions(),m)) | _ -> @@ -13578,13 +13594,19 @@ module TcExceptionDeclarations = begin | _ -> error (Error(FSComp.SR.tcNotAnException(),m)) | None -> - NewExn cpath id vis (TExnFresh (MakeRecdFieldsTable args')) attrs (doc.ToXmlDoc()) + TExnFresh (MakeRecdFieldsTable args') - let tcaug = exnc.TypeContents - tcaug.tcaug_super <- Some cenv.g.exn_ty + exnc.Data.entity_exn_info <- repr + + let item = Item.ExnCase(mkLocalTyconRef exnc) + CallNameResolutionSink cenv.tcSink (id.idRange,env.NameEnv,item,item,ItemOccurence.Binding,env.DisplayEnv,env.eAccessRights) + args' + + let private TcExnDefnCore cenv env parent synExnDefnRepr = + let exnc = TcExnDefnCore_Phase0 cenv env parent synExnDefnRepr + let args' = TcExnDefnCore_Phase6_EstablishRepresentation cenv env parent exnc synExnDefnRepr + exnc.TypeContents.tcaug_super <- Some cenv.g.exn_ty - CheckForDuplicateConcreteType cenv env (id.idText ^ "Exception") id.idRange - CheckForDuplicateConcreteType cenv env id.idText id.idRange PublishTypeDefn cenv env exnc let structuralTypes = args' |> List.map (fun rf -> (rf.FormalType, rf.Range)) @@ -13592,6 +13614,7 @@ module TcExceptionDeclarations = begin let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv env.DisplayEnv [(exnc,structuralTypes)] // Augment the exception constructor with comparison and hash methods if needed + // TODO: Check exception abbreviations in mutually recursive groups, they may get augmentation bindings (?) incorrectly let binds = match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnNone | TExnAsmRepr _ -> [] @@ -13599,14 +13622,11 @@ module TcExceptionDeclarations = begin AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv env scSet seSet exnc AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv exnc - let item = Item.ExnCase(mkLocalTyconRef exnc) - CallNameResolutionSink cenv.tcSink (id.idRange,env.NameEnv,item,item,ItemOccurence.Binding,env.DisplayEnv,env.eAccessRights) - binds,exnc - let TcExnDefn cenv envInitial parent tpenv (SynExceptionDefn(core,aug,m),scopem) = - let binds1,exnc = TcExnDefnCore cenv envInitial parent tpenv core + let TcExnDefn cenv envInitial parent (SynExceptionDefn(core,aug,m),scopem) = + let binds1,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let defns = [MutRecShape.Tycon(MutRecDefnsPass2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] @@ -13617,13 +13637,12 @@ module TcExceptionDeclarations = begin binds1 @ binds2flat @ binds3,exnc,env let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core,aug,_),scopem) = - let binds,exnc = TcExnDefnCore cenv envInitial parent tpenv core + let binds,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let ecref = mkLocalEntityRef exnc let vals,_ = TcTyconMemberSpecs cenv envMutRec (ContainerInfo(parent,Some(MemberOrValContainerInfo(ecref,None,None,NoSafeInitInfo,[])))) ModuleOrMemberBinding tpenv aug binds,vals,ecref,envMutRec -end /// Bind type definitions @@ -13756,6 +13775,10 @@ module EstablishTypeDefinitionCores = begin let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) + match synTyconRepr with + | SynTypeDefnSimpleRepr.Exception synExnDefnRepr -> + TcExceptionDeclarations.TcExnDefnCore_Phase0 cenv env parent synExnDefnRepr + | _ -> let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) // Augmentations of type definitions are allowed within the same file as long as no new type representation or abbreviation is given @@ -13776,7 +13799,7 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Record (vis,_,_) -> vis | SynTypeDefnSimpleRepr.General _ -> None | SynTypeDefnSimpleRepr.Enum _ -> None - //| SynTypeDefnSimpleRepr.Exception _ -> None + | SynTypeDefnSimpleRepr.Exception _ -> None let visOfRepr,_ = ComputeAccessAndCompPath env None id.idRange visOfRepr parent let visOfRepr = combineAccess vis visOfRepr @@ -13813,6 +13836,7 @@ module EstablishTypeDefinitionCores = begin let repr = match synTyconRepr with + | SynTypeDefnSimpleRepr.Exception _ -> TNoRepr | SynTypeDefnSimpleRepr.None m -> // Run InferTyconKind to raise errors on inconsistent attribute sets InferTyconKind cenv.g (TyconHiddenRepr,attrs,[],[],inSig,true,m) |> ignore @@ -14137,7 +14161,7 @@ module EstablishTypeDefinitionCores = begin // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_> list) = + let private TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14161,6 +14185,7 @@ module EstablishTypeDefinitionCores = begin let implementedTys,inheritedTys = match synTyconRepr with + | SynTypeDefnSimpleRepr.Exception _ -> [], [] | SynTypeDefnSimpleRepr.General (kind,inherits,slotsigs,fields,isConcrete,_,_,m) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14197,6 +14222,7 @@ module EstablishTypeDefinitionCores = begin try let super = match synTyconRepr with + | SynTypeDefnSimpleRepr.Exception _ -> Some cenv.g.exn_ty | SynTypeDefnSimpleRepr.None _ -> None | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None | SynTypeDefnSimpleRepr.Union _ -> None @@ -14340,9 +14366,14 @@ module EstablishTypeDefinitionCores = begin CallNameResolutionSink cenv.tcSink (unionCase.Range,nenv,item,item,ItemOccurence.Binding,envinner.DisplayEnv,ad) CallEnvSink cenv.tcSink (unionCase.Id.idRange, nenv', ad) - let theTypeRepresentation, baseValOpt, safeInitInfo = + let typeRepr, baseValOpt, safeInitInfo = match synTyconRepr with + | SynTypeDefnSimpleRepr.Exception synExnDefnRepr -> + let parent = Parent (mkLocalTyconRef tycon) + TcExceptionDeclarations.TcExnDefnCore_Phase6_EstablishRepresentation cenv envinner parent tycon synExnDefnRepr |> ignore + TNoRepr, None, NoSafeInitInfo + | SynTypeDefnSimpleRepr.None _ -> hiddenReprChecks(false) noAllowNullLiteralAttributeCheck() @@ -14500,6 +14531,7 @@ module EstablishTypeDefinitionCores = begin let baseIdOpt = match synTyconRepr with | SynTypeDefnSimpleRepr.None _ -> None + | SynTypeDefnSimpleRepr.Exception _ -> None | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None @@ -14558,7 +14590,7 @@ module EstablishTypeDefinitionCores = begin fsobjmodel_rfields= MakeRecdFieldsTable (vfld :: fields') } repr, None, NoSafeInitInfo - tycon.Data.entity_tycon_repr <- theTypeRepresentation + tycon.Data.entity_tycon_repr <- typeRepr // We check this just after establishing the representation if TyconHasUseNullAsTrueValueAttribute cenv.g tycon && not (CanHaveUseNullAsTrueValueAttribute cenv.g tycon) then errorR(Error(FSComp.SR.tcInvalidUseNullAsTrueValue(),m)) @@ -14793,7 +14825,7 @@ module EstablishTypeDefinitionCores = begin let innerParent = Parent (mkLocalModRef mspec) MutRecDefnsPass2DataForModule (mtypeAcc, mspec), innerParent - let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = + let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = // First define the type constructors and the abbreviations, if any. Skip augmentations. let withTycons = @@ -14825,6 +14857,7 @@ module EstablishTypeDefinitionCores = begin (fun envAbove (MutRecDefnsPass2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> + let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt) -> tyconOpt | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPass2DataForModule (_, mspec),_) -> Some mspec | _ -> None) @@ -14833,11 +14866,15 @@ module EstablishTypeDefinitionCores = begin CheckForDuplicateConcreteType cenv envAbove tycon.LogicalName tycon.Range CheckForDuplicateModule cenv envAbove tycon.LogicalName tycon.Range PublishTypeDefn cenv envAbove tycon + for mspec in mspecs do PublishModuleDefn cenv envAbove mspec - let envInner = AddLocalTycons cenv.g cenv.amap scopem tycons envAbove - let envInner = (envInner, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) - envInner) + + // Add the type definitions, modules and "open" declarations + let envForDecls = (envAbove, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) + let envForDecls = AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls + let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + envForDecls) // Updates the types of the modules to contain the inferred contents so far withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> @@ -14952,7 +14989,9 @@ module EstablishTypeDefinitionCores = begin (fun envAbove decls -> let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) - let envForDecls = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) + let envForDecls = (envAbove, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) + let envForDecls = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) envForDecls) @@ -15011,8 +15050,8 @@ module TcDeclarations = begin error(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) let declaredTypars = TcTyparDecls cenv envInitial typars - let envinner = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envInitial - let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envinner emptyUnscopedTyparEnv cs + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envInitial + let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envForTycon emptyUnscopedTyparEnv cs declaredTypars |> List.iter (SetTyparRigid cenv.g envInitial.DisplayEnv m) if not (typarsAEquiv cenv.g TypeEquivEnv.Empty reqTypars declaredTypars) then errorR(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) @@ -15257,19 +15296,13 @@ module TcDeclarations = begin let core = MutRecDefnsPass1DataForTycon(synTyconInfo,repr,implements1,false,false,isAtOriginalTyconDefn) core, members @ extraMembers - //| SynTypeDefnRepr.Exception(r) -> - // let core = MutRecDefnsPass1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false) - // core,[ ] - - //and private SplitTyconDefns cenv tycons = - // let a,b = tycons |> List.map (SplitTyconDefn cenv) |> List.unzip - // a, List.concat b + | SynTypeDefnRepr.Exception(r) -> + let isAtOriginalTyconDefn = true + let core = MutRecDefnsPass1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) + core, extraMembers let SplitMutRecDefns cenv mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons (SplitTyconDefn cenv) - //let SplitExnDefn (SynExceptionDefn(core,aug,m)) = - // [ Choice1Of2 core ], [ (fun exnc -> MutRecDefnsPass2DataForTycon(ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots)) ] - let private PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo @@ -15462,16 +15495,16 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = [SynModuleSigDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,m)] else defs - let envinner = LocateEnv cenv.topCcu env enclosingNamespacePath + let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath - let envinner = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envinner + let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envinner xml defs + let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml defs let env = if isNil enclosingNamespacePath then envAtEnd else - let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envinner.eCompPath !(envinner.eModuleOrNamespaceTypeAccumulator) + let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envForNamespace.eCompPath !(envForNamespace.eModuleOrNamespaceTypeAccumulator) let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env modulTypeRoot @@ -15530,10 +15563,10 @@ and TcModuleOrNamespaceSignatureElements cenv parent env (id,modKind,defs,m:rang let endm = m.EndRange // use end of range for errors // Create the module type that will hold the results of type checking.... - let envinner,mtypeAcc = MakeInnerEnv env id modKind + let envForModule,mtypeAcc = MakeInnerEnv env id modKind // Now typecheck the signature, using mutation to fill in the submodule description. - let! envAtEnd = TcSignatureElements cenv parent endm envinner xml defs + let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml defs // mtypeAcc has now accumulated the module type return !mtypeAcc, envAtEnd @@ -15562,14 +15595,14 @@ let ElimModuleDoBinding bind = SynModuleDecl.Let(false,[bind2],m) | _ -> bind -let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_> list) env = +let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_,_> list) env = let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTycons env let checkTycon (tycon: Tycon) = if not tycon.IsTypeAbbrev && Zset.contains tycon freeInEnv then let nm = tycon.DisplayName errorR(Error(FSComp.SR.tcTypeUsedInInvalidWay(nm, nm, nm), tycon.Range)) - binds |> MutRecShapes.iter (fst >> Option.iter checkTycon) ignore ignore + binds |> MutRecShapes.iterTycons (fst >> Option.iter checkTycon) let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTraitSolutions env let checkBinds (binds: Binding list) = @@ -15578,7 +15611,7 @@ let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_> list) env = let nm = bind.Var.DisplayName errorR(Error(FSComp.SR.tcMemberUsedInInvalidWay(nm, nm, nm), bind.Var.Range)) - binds |> MutRecShapes.iter (snd >> checkBinds) checkBinds ignore + binds |> MutRecShapes.iter (snd >> checkBinds) checkBinds ignore ignore let CheckLetInNamespace binds m = match binds with @@ -15609,7 +15642,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu return ((fun e -> e), []), env, env | SynModuleDecl.Exception (edef,m) -> - let binds,decl,env = TcExceptionDeclarations.TcExnDefn cenv env parent tpenv (edef,scopem) + let binds,decl,env = TcExceptionDeclarations.TcExnDefn cenv env parent (edef,scopem) return ((fun e -> TMDefRec([decl], FlatList.ofList binds, [],m) :: e),[]), env, env | SynModuleDecl.Types (typeDefs,m) -> @@ -15698,16 +15731,16 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu [SynModuleDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,true,m)] else defs - let envinner = LocateEnv cenv.topCcu env enclosingNamespacePath - let envinner = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envinner + let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath + let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envinner xml isRec defs + let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs let env = if isNil enclosingNamespacePath then envAtEnd else - let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envinner.eCompPath !(envinner.eModuleOrNamespaceTypeAccumulator) + let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envForNamespace.eCompPath !(envForNamespace.eModuleOrNamespaceTypeAccumulator) let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env modulTypeRoot @@ -15721,7 +15754,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); modulTypeRoot] env - let mexprRoot = BuildRootModuleExpr enclosingNamespacePath envinner.eCompPath mexpr + let mexprRoot = BuildRootModuleExpr enclosingNamespacePath envForNamespace.eCompPath mexpr return ((fun e -> mexprRoot :: e),topAttrs), env, envAtEnd @@ -15767,32 +15800,41 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let mutRecDefns = - let rec loop isNamespace dfs : MutRecDefnsInitialData = - [ for def in dfs do + let rec loop isNamespace defs : MutRecDefnsInitialData = + (true,defs) ||> List.collectFold (fun openOk def -> match ElimModuleDoBinding def with | SynModuleDecl.Types (typeDefs,_) -> - for typeDef in typeDefs do - yield MutRecShape.Tycon typeDef + let decls = typeDefs |> List.map MutRecShape.Tycon + decls, false | SynModuleDecl.Let (letrec, binds, m) -> - - if isNamespace then CheckLetInNamespace binds m + if isNamespace then + CheckLetInNamespace binds m; [], false else - if letrec then yield MutRecShape.Lets binds - else yield! List.map (List.singleton >> MutRecShape.Lets) binds + if letrec then [MutRecShape.Lets binds], false + else List.map (List.singleton >> MutRecShape.Lets) binds, false | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,m) -> if isRec then warning(Error(FSComp.SR.tcRecImplied(),m)) let mutRecDefs = loop false synDefs - yield MutRecShape.Module (compInfo, mutRecDefs) - - | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range)) - //| SynModuleDecl.Open _ -> - //let scopem = unionRanges m.EndRange scopem - //let env = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp - //return ((fun e -> e),[]), env, env - + let decls = [MutRecShape.Module (compInfo, mutRecDefs)] + decls, false + + | SynModuleDecl.Open (LongIdentWithDots(lid,_), m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let decls = [ MutRecShape.Open (MutRecDataForOpenDecl(lid, m)) ] + decls, openOk + + | SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr + let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) + let decls = [ MutRecShape.Tycon(SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) ] + decls, openOk + + | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range))) + |> fst //| SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs //return ((fun e -> e), attrs), env, env @@ -15801,16 +15843,10 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) //return ((fun e -> e), []), env, env - //| SynModuleDecl.Exception _ -> failwith "exception definitions not allowed in mutrec sections yet" - //| SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> - // let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr - // let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) - // yield Choice1Of2 (SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) //| SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" //| SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" //| SynModuleDecl.DoExpr _ -> failwith "unreachable" - ] loop (match parent with ParentNone -> true | Parent _ -> false) defs let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions @@ -15830,7 +15866,7 @@ and TcMutRecDefsFinish cenv defs m = let binds = defs |> List.collect (function MutRecShape.Tycon (_,binds) | MutRecShape.Lets binds -> binds | _ -> []) let mods = defs |> List.choose (function - | MutRecShape.Tycon _ | MutRecShape.Lets _ -> None + | MutRecShape.Tycon _ | MutRecShape.Open _ | MutRecShape.Lets _ -> None | MutRecShape.Module ((MutRecDefnsPass2DataForModule(mtypeAcc, mspec), _),mdefs) -> let mexpr = TcMutRecDefsFinish cenv mdefs m // Apply the functions for each declaration to build the overall expression-builder @@ -15866,7 +15902,7 @@ and TcModuleOrNamespace cenv env (id,isRec,isModule,defs,xml,modAttrs,vis,m:rang CheckNamespaceModuleOrTypeName cenv.g id - let envinner, mtypeAcc = MakeInnerEnv env id modKind + let envForModule, mtypeAcc = MakeInnerEnv env id modKind // Create the new module specification to hold the accumulated results of the type of the module // Also record this in the environment as the accumulator @@ -15875,7 +15911,7 @@ and TcModuleOrNamespace cenv env (id,isRec,isModule,defs,xml,modAttrs,vis,m:rang let innerParent = mkLocalModRef mspec // Now typecheck. - let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent innerParent) endm envinner xml isRec defs + let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent innerParent) endm envForModule xml isRec defs // Get the inferred type of the decls. It's precisely the one we created before checking // and mutated as we went. Record it in the mspec. diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 6a303d7f970..695c6ce661b 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1110,7 +1110,7 @@ and /// An abstract definition , "type X" | None of range /// An exception definition , "exception E = ..." - //| Exception of SynExceptionDefnRepr + | Exception of SynExceptionDefnRepr member this.Range = match this with | Union(_,_,m) @@ -1120,7 +1120,7 @@ and | LibraryOnlyILAssembly(_,m) | TypeAbbrev(_,_,m) | None(m) -> m - // | Exception t -> t.Range + | Exception t -> t.Range and SynEnumCases = SynEnumCase list @@ -1259,12 +1259,12 @@ and SynTypeDefnRepr = | ObjectModel of SynTypeDefnKind * SynMemberDefns * range | Simple of SynTypeDefnSimpleRepr * range - //| Exception of SynExceptionDefnRepr + | Exception of SynExceptionDefnRepr member this.Range = match this with | ObjectModel(_,_,m) -> m | Simple(_,m) -> m - //| Exception t -> t.Range + | Exception t -> t.Range and [] diff --git a/src/fsharp/vs/ServiceNavigation.fs b/src/fsharp/vs/ServiceNavigation.fs index a8c07fb2235..02b752e84c8 100755 --- a/src/fsharp/vs/ServiceNavigation.fs +++ b/src/fsharp/vs/ServiceNavigation.fs @@ -136,9 +136,19 @@ module NavigationImpl = | _ -> [] // Process a class declaration or F# type declaration - let rec processTycon baseName (TypeDefn(ComponentInfo(_, _, _, lid, _, _, _, _), repr, membDefns, m)) = + let rec processExnDefnRepr baseName nested (SynExceptionDefnRepr(_, (UnionCase(_, id, fldspec, _, _, _)), _, _, _, m)) = + // Exception declaration + [ createDecl(baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested) ] + + // Process a class declaration or F# type declaration + and processExnDefn baseName (SynExceptionDefn(repr, membDefns, _)) = + let nested = processMembers membDefns |> snd + processExnDefnRepr baseName nested repr + + and processTycon baseName (TypeDefn(ComponentInfo(_, _, _, lid, _, _, _, _), repr, membDefns, m)) = let topMembers = processMembers membDefns |> snd match repr with + | SynTypeDefnRepr.Exception repr -> processExnDefnRepr baseName [] repr | SynTypeDefnRepr.ObjectModel(_, membDefns, mb) -> // F# class declaration let members = processMembers membDefns |> snd @@ -215,11 +225,7 @@ module NavigationImpl = createDeclLid(baseName, lid, ModuleDecl, iIconGroupModule, m, unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid lid) other), nested)::other | SynModuleDecl.Types(tydefs, _) -> tydefs |> List.collect (processTycon baseName) - - | SynModuleDecl.Exception(SynExceptionDefn(SynExceptionDefnRepr(_, (UnionCase(_, id, fldspec, _, _, _)), _, _, _, _), membDefns, _), m) -> - // Exception declaration - let nested = processMembers membDefns |> snd - [ createDecl(baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested) ] + | SynModuleDecl.Exception (defn,_) -> processExnDefn baseName defn | _ -> [] ) // Collect all the items diff --git a/src/fsharp/vs/ServiceParseTreeWalk.fs b/src/fsharp/vs/ServiceParseTreeWalk.fs index a85e861752a..792af9f4bf6 100755 --- a/src/fsharp/vs/ServiceParseTreeWalk.fs +++ b/src/fsharp/vs/ServiceParseTreeWalk.fs @@ -455,6 +455,10 @@ module internal AstTraversal = let path = TraverseStep.TypeDefn tydef :: path [ match synTypeDefnRepr with + | SynTypeDefnRepr.Exception _ -> + // This node is generated in TypeChecker.fs, not in the AST. + // But note exception declarations are missing from this tree walk. + () | SynTypeDefnRepr.ObjectModel(synTypeDefnKind, synMemberDefns, _oRange) -> // traverse inherit function is used to capture type specific data required for processing Inherit part let traverseInherit (synType : SynType, range : range) = diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 19dce482e5c..204ee81b81f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -44,7 +44,7 @@ namespace (* rec *) Microsoft.VisualStudio.FSharp.ProjectSystem open Internal.Utilities.Debug #mutrec - + module internal VSHiveUtilities = /// For a given sub-hive, check to see if a 3rd party has specified any /// custom/extended property pages. From 1a47078277a1fdd5312e01e526dbf646b6e814b3 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 11 Mar 2016 13:33:53 +0000 Subject: [PATCH 056/334] clarify phase names --- src/fsharp/TypeChecker.fs | 480 +++++++++--------- .../FSharp.ProjectSystem.FSharp/Project.fs | 4 +- 2 files changed, 249 insertions(+), 235 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 36cf18c1546..9f6025851b1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3844,12 +3844,18 @@ module MutRecShapes = env2, xs2 |> mapModules (fun ((data,_oldEnv : 'Env),newEnv) -> (data,newEnv)) let rec expandTycons f1 xs = - xs |> List.collect (fun elem -> + let preBinds, postBinds = + xs |> List.map (fun elem -> + match elem with + | MutRecShape.Tycon a -> f1 a + | _ -> [], []) + |> List.unzip + [MutRecShape.Lets (List.concat preBinds)] @ + (xs |> List.map (fun elem -> match elem with - | MutRecShape.Tycon a -> [elem; MutRecShape.Lets (f1 a)] - | MutRecShape.Open _ -> [elem] - | MutRecShape.Lets _ -> [elem] - | MutRecShape.Module (c,d) -> [MutRecShape.Module (c, expandTycons f1 d)]) + | MutRecShape.Module (c,d) -> MutRecShape.Module (c, expandTycons f1 d) + | _ -> elem)) @ + [MutRecShape.Lets (List.concat postBinds)] let rec mapFoldWithEnv f1 z env xs = (z,xs) ||> List.mapFold (fun z x -> @@ -3893,15 +3899,15 @@ type MutRecDataForOpenDecl = MutRecDataForOpenDecl of LongIdent * range type MutRecSignatureInitialData = MutRecShape list type MutRecDefnsInitialData = MutRecShape list -type MutRecDefnsPass1DataForTycon = MutRecDefnsPass1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool -type MutRecDefnsPass1Data = MutRecShape list +type MutRecDefnsPhase1DataForTycon = MutRecDefnsPhase1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool +type MutRecDefnsPhase1Data = MutRecShape list -type MutRecDefnsPass2DataForTycon = MutRecDefnsPass2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK -type MutRecDefnsPass2DataForModule = MutRecDefnsPass2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace -type MutRecDefnsPass2Data = MutRecShape list +type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK +type MutRecDefnsPhase2DataForModule = MutRecDefnsPhase2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace +type MutRecDefnsPhase2Data = MutRecShape list -type MutRecDefnsPass2InfoForTycon = MutRecDefnsPass2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list -type MutRecDefnsPass2Info = MutRecShape list +type MutRecDefnsPhase2InfoForTycon = MutRecDefnsPhase2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list +type MutRecDefnsPhase2Info = MutRecShape list /// RecursiveBindingInfo - flows through initial steps of TcLetrec @@ -11500,7 +11506,7 @@ module IncrClassChecking = begin /// Check and elaborate the "left hand side" of the implicit class construction /// syntax. - let TcImplictCtorLhsPassA(cenv, env, tpenv, tcref:TyconRef, vis, attrs, spats, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy) = + let TcImplictCtorLhs_Phase2A(cenv, env, tpenv, tcref:TyconRef, vis, attrs, spats, thisIdOpt, baseValOpt: Val option, safeInitInfo, m, copyOfTyconTypars, objTy, thisTy) = let baseValOpt = match GetSuperTypeOfType cenv.g cenv.amap m objTy with @@ -11854,7 +11860,7 @@ module IncrClassChecking = begin /// Fix up the references to the locals, e.g. /// v -> this.fieldv /// f x -> this.method x - member localRep.FixupIncrClassExprPassC thisValOpt safeStaticInitInfo (thisTyInst:TypeInst) expr = + member localRep.FixupIncrClassExprPhase2C thisValOpt safeStaticInitInfo (thisTyInst:TypeInst) expr = // fixup: intercept and expr rewrite let FixupExprNode rw e = //dprintfn "Fixup %s" (showL (exprL e)) @@ -11898,14 +11904,14 @@ module IncrClassChecking = begin IsUnderQuotations=true } expr - type IncrClassConstructionBindingsPassC = - | PassCBindings of IncrClassBindingGroup list - | PassCCtorJustAfterSuperInit - | PassCCtorJustAfterLastLet + type IncrClassConstructionBindingsPhase2C = + | Phase2CBindings of IncrClassBindingGroup list + | Phase2CCtorJustAfterSuperInit + | Phase2CCtorJustAfterLastLet /// Given a set of 'let' bindings (static or not, recursive or not) that make up a class, /// generate their initialization expression(s). - let MakeCtorForIncrClassConstructionPassC + let MakeCtorForIncrClassConstructionPhase2C (cenv, env: TcEnv, /// The lhs information about the implicit constructor @@ -11915,7 +11921,7 @@ module IncrClassChecking = begin /// Should we place a sequence point at the 'inheritedTys call? inheritsIsVisible, /// The declarations - decs : IncrClassConstructionBindingsPassC list, + decs : IncrClassConstructionBindingsPhase2C list, memberBinds : Binding list, /// Record any unconstrained type parameters generalized for the outer members as "free choices" in the let bindings generalizedTyparsForRecursiveBlock, @@ -11954,10 +11960,10 @@ module IncrClassChecking = begin let (staticForcedFieldVars,instanceForcedFieldVars) = ((emptyFreeVars,emptyFreeVars),decs) ||> List.fold (fun (staticForcedFieldVars,instanceForcedFieldVars) dec -> match dec with - | PassCCtorJustAfterLastLet - | PassCCtorJustAfterSuperInit -> + | Phase2CCtorJustAfterLastLet + | Phase2CCtorJustAfterSuperInit -> (staticForcedFieldVars,instanceForcedFieldVars) - | PassCBindings decs -> + | Phase2CBindings decs -> ((staticForcedFieldVars,instanceForcedFieldVars),decs) ||> List.fold (fun (staticForcedFieldVars,instanceForcedFieldVars) dec -> match dec with | IncrClassBindingGroup(binds,isStatic,_) -> @@ -11996,7 +12002,7 @@ module IncrClassChecking = begin let TransBind (reps:IncrClassReprInfo) (TBind(v,rhsExpr,spBind)) = if v.MustInline then error(Error(FSComp.SR.tcLocalClassBindingsCannotBeInline(),v.Range)) - let rhsExpr = reps.FixupIncrClassExprPassC (Some thisVal) safeStaticInitInfo thisTyInst rhsExpr + let rhsExpr = reps.FixupIncrClassExprPhase2C (Some thisVal) safeStaticInitInfo thisTyInst rhsExpr // The initialization of the 'ref cell' variable for 'this' is the only binding which comes prior to the super init let isPriorToSuperInit = @@ -12046,7 +12052,7 @@ module IncrClassChecking = begin match safeStaticInitInfo with | SafeInitField (rfref, _) -> let setExpr = mkStaticRecdFieldSet (rfref, thisTyInst, mkInt cenv.g m idx, m) - let setExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) NoSafeInitInfo thisTyInst setExpr + let setExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) NoSafeInitInfo thisTyInst setExpr Some setExpr | NoSafeInitInfo -> None @@ -12082,7 +12088,7 @@ module IncrClassChecking = begin ([],actions,methodBinds),reps | IncrClassDo (doExpr,isStatic) -> - let doExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) safeStaticInitInfo thisTyInst doExpr + let doExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) safeStaticInitInfo thisTyInst doExpr let binder = (fun e -> mkSequential SequencePointsAtSeq doExpr.Range doExpr e) let isPriorToSuperInit = false if isStatic then @@ -12096,13 +12102,13 @@ module IncrClassChecking = begin let TransDec (reps:IncrClassReprInfo) dec = match dec with // The call to the base class constructor is done so we can set the ref cell - | PassCCtorJustAfterSuperInit -> + | Phase2CCtorJustAfterSuperInit -> let binders = [ match ctorInfo.InstanceCtorSafeThisValOpt with | None -> () | Some v -> let setExpr = mkRefCellSet cenv.g m ctorInfo.InstanceCtorThisVal.Type (exprForVal m v) (exprForVal m ctorInfo.InstanceCtorThisVal) - let setExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr + let setExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr let binder = (fun e -> mkSequential SequencePointsAtSeq setExpr.Range setExpr e) let isPriorToSuperInit = false yield (isPriorToSuperInit,binder) ] @@ -12111,12 +12117,12 @@ module IncrClassChecking = begin // The last 'let' binding is done so we can set the initialization condition for the collection of object fields // which now allows members to be called. - | PassCCtorJustAfterLastLet -> + | Phase2CCtorJustAfterLastLet -> let binders = [ match ctorInfo.InstanceCtorSafeInitInfo with | SafeInitField (rfref, _) -> let setExpr = mkRecdFieldSet cenv.g (exprForVal m thisVal, rfref, thisTyInst, mkOne cenv.g m, m) - let setExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr + let setExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr let binder = (fun e -> mkSequential SequencePointsAtSeq setExpr.Range setExpr e) let isPriorToSuperInit = false yield (isPriorToSuperInit,binder) @@ -12125,7 +12131,7 @@ module IncrClassChecking = begin ([],binders,[]),reps - | PassCBindings decs -> + | Phase2CBindings decs -> let initActions, reps = List.mapFold (TransTrueDec false) reps decs let cctorInitActions, ctorInitActions, methodBinds = List.unzip3 initActions (List.concat cctorInitActions, List.concat ctorInitActions, List.concat methodBinds), reps @@ -12185,7 +12191,7 @@ module IncrClassChecking = begin // // As a result, the most natural way to implement this would be to simply capture arg0 if needed // and access all variables via that. This would be done by rewriting the inheritsExpr as follows: - // let inheritsExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) thisTyInst inheritsExpr + // let inheritsExpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) thisTyInst inheritsExpr // However, the rules of IL mean we are not actually allowed to capture arg0 // and store it as a closure field before the base class constructor is called. // @@ -12201,7 +12207,7 @@ module IncrClassChecking = begin // Rewrite the expression to convert it to a load of a field if needed. // We are allowed to load fields from our own object even though we haven't called // the super class cosntructor yet. - let ldexpr = reps.FixupIncrClassExprPassC (Some(thisVal)) safeStaticInitInfo thisTyInst (exprForVal m v) + let ldexpr = reps.FixupIncrClassExprPhase2C (Some(thisVal)) safeStaticInitInfo thisTyInst (exprForVal m v) mkInvisibleLet m v ldexpr inheritsExpr let spAtSuperInit = (if inheritsIsVisible then SequencePointsAtSeq else SuppressSequencePointOnExprOfSequential) @@ -12242,84 +12248,84 @@ end // - generalize definitions (fixing up recursive instances) // - build ctor binding // - Yields set of recursive bindings for the ctors and members of the types. -module TyconBindingChecking = begin +module TyconBindingChecking = open IncrClassChecking /// Represents one element in a type definition, after the first phase - type TyconBindingPassA = + type TyconBindingPhase2A = /// An entry corresponding to the definition of the implicit constructor for a class - | PassAIncrClassCtor of IncrClassCtorLhs + | Phase2AIncrClassCtor of IncrClassCtorLhs /// An 'inherit' declaration in an incremental class /// - /// PassAInherit (typ,arg,baseValOpt,m) - | PassAInherit of SynType * SynExpr * Val option * range + /// Phase2AInherit (typ,arg,baseValOpt,m) + | Phase2AInherit of SynType * SynExpr * Val option * range /// A set of value or function definitions in an incremental class /// - /// PassAIncrClassBindings (tcref,letBinds,isStatic,isRec,m) - | PassAIncrClassBindings of TyconRef * Ast.SynBinding list * bool * bool * range + /// Phase2AIncrClassBindings (tcref,letBinds,isStatic,isRec,m) + | Phase2AIncrClassBindings of TyconRef * Ast.SynBinding list * bool * bool * range /// A 'member' definition in a class - | PassAMember of PreCheckingRecursiveBinding + | Phase2AMember of PreCheckingRecursiveBinding #if OPEN_IN_TYPE_DECLARATIONS /// A dummy declaration, should we ever support 'open' in type definitions - | PassAOpen of LongIdent * range + | Phase2AOpen of LongIdent * range #endif /// Indicates the super init has just been called, 'this' may now be published - | PassAIncrClassCtorJustAfterSuperInit + | Phase2AIncrClassCtorJustAfterSuperInit /// Indicates the last 'field' has been initialized, only 'do' comes after - | PassAIncrClassCtorJustAfterLastLet + | Phase2AIncrClassCtorJustAfterLastLet /// The collected syntactic input definitions for a single type or type-extension definition - type TyconBindingsPassA = - | TyconBindingsPassA of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPassA list + type TyconBindingsPhase2A = + | TyconBindingsPhase2A of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPhase2A list - type MutRecBindingPassA = MutRecShape + type MutRecBindingPhase2A = MutRecShape /// The collected syntactic input definitions for a recursive group of type or type-extension definitions - type MutRecBindingsPassA = MutRecBindingPassA list + type MutRecBindingsPhase2A = MutRecBindingPhase2A list /// Represents one element in a type definition, after the second phase - type TyconBindingPassB = - | PassBIncrClassCtor of IncrClassCtorLhs * Tast.Binding option - | PassBInherit of Expr * Val option + type TyconBindingPhase2B = + | Phase2BIncrClassCtor of IncrClassCtorLhs * Tast.Binding option + | Phase2BInherit of Expr * Val option /// A set of value of function definitions in a class definition with an implicit consructor. - | PassBIncrClassBindings of IncrClassBindingGroup list - | PassBMember of int + | Phase2BIncrClassBindings of IncrClassBindingGroup list + | Phase2BMember of int /// An intermediate definition that represent the point in an implicit class definition where /// the super type has been initialized. - | PassBIncrClassCtorJustAfterSuperInit + | Phase2BIncrClassCtorJustAfterSuperInit /// An intermediate definition that represent the point in an implicit class definition where /// the last 'field' has been initialized, i.e. only 'do' and 'member' definitions come after /// this point. - | PassBIncrClassCtorJustAfterLastLet + | Phase2BIncrClassCtorJustAfterLastLet - type TyconBindingsPassB = TyconBindingsPassB of Tycon option * TyconRef * TyconBindingPassB list + type TyconBindingsPhase2B = TyconBindingsPhase2B of Tycon option * TyconRef * TyconBindingPhase2B list - type MutRecBindingPassB = MutRecShape + type MutRecBindingPhase2B = MutRecShape - type MutRecBindingsPassB = MutRecBindingPassB list + type MutRecBindingsPhase2B = MutRecBindingPhase2B list /// Represents one element in a type definition, after the third phase - type TyconBindingPassC = - | PassCIncrClassCtor of IncrClassCtorLhs * Tast.Binding option - | PassCInherit of Expr * Val option - | PassCIncrClassBindings of IncrClassBindingGroup list - | PassCMember of PreInitializationGraphEliminationBinding + type TyconBindingPhase2C = + | Phase2CIncrClassCtor of IncrClassCtorLhs * Tast.Binding option + | Phase2CInherit of Expr * Val option + | Phase2CIncrClassBindings of IncrClassBindingGroup list + | Phase2CMember of PreInitializationGraphEliminationBinding // Indicates the last 'field' has been initialized, only 'do' comes after - | PassCIncrClassCtorJustAfterSuperInit - | PassCIncrClassCtorJustAfterLastLet + | Phase2CIncrClassCtorJustAfterSuperInit + | Phase2CIncrClassCtorJustAfterLastLet - type TyconBindingsPassC = TyconBindingsPassC of Tycon option * TyconRef * TyconBindingPassC list + type TyconBindingsPhase2C = TyconBindingsPhase2C of Tycon option * TyconRef * TyconBindingPhase2C list - type MutRecBindingPassC = MutRecShape + type MutRecBindingPhase2C = MutRecShape - type MutRecBindingsPassC = MutRecBindingPassC list + type MutRecBindingsPhase2C = MutRecBindingPhase2C list - // PassA: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals - // PassA: also processes their arg patterns - collecting type assertions - let TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPass2Info) = + // _Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals + // _Phase2A: also processes their arg patterns - collecting type assertions + let TcMutRecBindings__Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = // The basic iteration over the declarations in a single type definition // State: @@ -12327,7 +12333,7 @@ module TyconBindingChecking = begin // recBindIdx: index of the recursive binding // prelimRecValuesRev: accumulation of prelim value entries // uncheckedBindsRev: accumulation of unchecked bindings - let (defnsAs: MutRecBindingsPassA), (tpenv,_,uncheckedBindsRev) = + let (defnsAs: MutRecBindingsPhase2A), (tpenv,_,uncheckedBindsRev) = let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) (initialOuterState, envMutRec, mutRecDecls) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defns -> let (tpenv,recBindIdx,uncheckedBindsRev) = outerState @@ -12344,7 +12350,7 @@ module TyconBindingChecking = begin let defnAs = MutRecShape.Lets binds defnAs,(tpenv,recBindIdx,List.rev binds @ uncheckedBindsRev) - | MutRecShape.Tycon (MutRecDefnsPass2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, binds)) -> + | MutRecShape.Tycon (MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, binds)) -> // Class members can access protected members of the implemented type // Class members can access private members in the typ @@ -12379,21 +12385,21 @@ module TyconBindingChecking = begin | SynMemberDefn.ImplicitCtor (vis,attrs,spats,thisIdOpt, m), ContainerInfo(_,Some(MemberOrValContainerInfo(tcref, _, baseValOpt, safeInitInfo, _))) -> match tcref.TypeOrMeasureKind with TyparKind.Measure -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) | _ -> () - // PassA: make incrClassCtorLhs - ctorv, thisVal etc, type depends on argty(s) - let incrClassCtorLhs = TcImplictCtorLhsPassA(cenv,envForTycon,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) - // PassA: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref + // _Phase2A: make incrClassCtorLhs - ctorv, thisVal etc, type depends on argty(s) + let incrClassCtorLhs = TcImplictCtorLhs_Phase2A(cenv,envForTycon,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) + // _Phase2A: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref let envForTycon = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envForTycon let innerState = (Some incrClassCtorLhs, envForTycon, tpenv, recBindIdx, uncheckedBindsRev) - [PassAIncrClassCtor incrClassCtorLhs],innerState + [Phase2AIncrClassCtor incrClassCtorLhs],innerState | SynMemberDefn.ImplicitInherit (typ,arg,_baseIdOpt,m),_ -> match tcref.TypeOrMeasureKind with TyparKind.Measure -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) | _ -> () - // PassA: inherit typ(arg) as base - pass through - // PassA: pick up baseValOpt! + // _Phase2A: inherit typ(arg) as base - pass through + // _Phase2A: pick up baseValOpt! let baseValOpt = incrClassCtorLhsOpt |> Option.bind (fun x -> x.InstanceCtorBaseValOpt) let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) - [PassAInherit (typ,arg,baseValOpt,m); PassAIncrClassCtorJustAfterSuperInit], innerState + [Phase2AInherit (typ,arg,baseValOpt,m); Phase2AIncrClassCtorJustAfterSuperInit], innerState @@ -12416,12 +12422,12 @@ module TyconBindingChecking = begin if isStatic && isNone incrClassCtorLhsOpt then errorR(Error(FSComp.SR.tcStaticLetBindingsRequireClassesWithImplicitConstructors(),m)) - // PassA: let-bindings - pass through + // _Phase2A: let-bindings - pass through let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) - [PassAIncrClassBindings (tcref,letBinds,isStatic,isRec,m)], innerState + [Phase2AIncrClassBindings (tcref,letBinds,isStatic,isRec,m)], innerState | SynMemberDefn.Member (bind,m),_ -> - // PassA: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo + // _Phase2A: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo let (NormalizedBinding(_,_,_,_,_,_,_,valSynData,_,_,_,_)) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind let (SynValData(memberFlagsOpt,_,_)) = valSynData match tcref.TypeOrMeasureKind with @@ -12437,7 +12443,7 @@ module TyconBindingChecking = begin let rbind = NormalizedRecBindingDefn(containerInfo,newslotsOK,declKind,bind) let overridesOK = DeclKind.CanOverrideOrImplement(declKind) let (binds,_values),(tpenv,recBindIdx) = AnalyzeAndMakeAndPublishRecursiveValue overridesOK false cenv envForTycon (tpenv,recBindIdx) rbind - let cbinds = [ for rbind in binds -> PassAMember rbind ] + let cbinds = [ for rbind in binds -> Phase2AMember rbind ] let innerState = (incrClassCtorLhsOpt, envForTycon, tpenv, recBindIdx, List.rev binds @ uncheckedBindsRev) cbinds,innerState @@ -12445,52 +12451,52 @@ module TyconBindingChecking = begin #if OPEN_IN_TYPE_DECLARATIONS | SynMemberDefn.Open (mp,m),_ -> let innerState = (incrClassCtorLhsOpt,env,tpenv,recBindIdx,prelimRecValuesRev,uncheckedBindsRev) - [ PassAOpen (mp,m) ], innerState + [ Phase2AOpen (mp,m) ], innerState #endif | _ -> error(InternalError("Unexpected definition",m))) - // If no constructor call, insert PassAIncrClassCtorJustAfterSuperInit at start + // If no constructor call, insert Phase2AIncrClassCtorJustAfterSuperInit at start let defnAs = match defnAs with - | (PassAIncrClassCtor _ as b1) :: rest -> + | (Phase2AIncrClassCtor _ as b1) :: rest -> let rest = - if rest |> List.exists (function PassAIncrClassCtorJustAfterSuperInit -> true | _ -> false) then + if rest |> List.exists (function Phase2AIncrClassCtorJustAfterSuperInit -> true | _ -> false) then rest else - PassAIncrClassCtorJustAfterSuperInit :: rest - // Insert PassAIncrClassCtorJustAfterLastLet at the point where local construction is known to have been finished + Phase2AIncrClassCtorJustAfterSuperInit :: rest + // Insert Phase2AIncrClassCtorJustAfterLastLet at the point where local construction is known to have been finished let rest = let isAfter b = match b with #if OPEN_IN_TYPE_DECLARATIONS - | PassAOpen _ + | Phase2AOpen _ #endif - | PassAIncrClassCtor _ | PassAInherit _ | PassAIncrClassCtorJustAfterSuperInit -> false - | PassAIncrClassBindings (_,binds,_,_,_) -> binds |> List.exists (function (Binding (_,DoBinding,_,_,_,_,_,_,_,_,_,_)) -> true | _ -> false) - | PassAIncrClassCtorJustAfterLastLet - | PassAMember _ -> true + | Phase2AIncrClassCtor _ | Phase2AInherit _ | Phase2AIncrClassCtorJustAfterSuperInit -> false + | Phase2AIncrClassBindings (_,binds,_,_,_) -> binds |> List.exists (function (Binding (_,DoBinding,_,_,_,_,_,_,_,_,_,_)) -> true | _ -> false) + | Phase2AIncrClassCtorJustAfterLastLet + | Phase2AMember _ -> true let restRev = List.rev rest let afterRev = restRev |> Seq.takeWhile isAfter |> Seq.toList let beforeRev = restRev |> Seq.skipWhile isAfter |> Seq.toList [ yield! List.rev beforeRev - yield PassAIncrClassCtorJustAfterLastLet + yield Phase2AIncrClassCtorJustAfterLastLet yield! List.rev afterRev ] b1 :: rest // Cover the case where this is not a type with an implicit constructor. | rest -> rest - let prelimRecValues = [ for x in defnAs do match x with PassAMember bind -> yield bind.RecBindingInfo.Val | _ -> () ] - let defnAs = MutRecShape.Tycon(TyconBindingsPassA(tyconOpt,declKind,prelimRecValues,tcref,copyOfTyconTypars,thisTy,defnAs)) + let prelimRecValues = [ for x in defnAs do match x with Phase2AMember bind -> yield bind.RecBindingInfo.Val | _ -> () ] + let defnAs = MutRecShape.Tycon(TyconBindingsPhase2A(tyconOpt,declKind,prelimRecValues,tcref,copyOfTyconTypars,thisTy,defnAs)) defnAs,(tpenv,recBindIdx,uncheckedBindsRev)) let uncheckedRecBinds = List.rev uncheckedBindsRev // Updates the types of the modules to contain the inferred contents to far - defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> + defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) let envMutRec, defnsAs = @@ -12498,7 +12504,7 @@ module TyconBindingChecking = begin ||> MutRecShapes.extendEnvs (fun envForDecls decls -> let prelimRecValues = decls |> List.collect (function - | MutRecShape.Tycon (TyconBindingsPassA(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues + | MutRecShape.Tycon (TyconBindingsPhase2A(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] | _ -> []) let envForDeclsUpdated = AddLocalVals cenv.tcSink scopem prelimRecValues envForDecls @@ -12506,11 +12512,11 @@ module TyconBindingChecking = begin (envMutRec, defnsAs, uncheckedRecBinds, tpenv) - /// PassB: check each of the bindings, convert from ast to tast and collects type assertions. + /// Phase2B: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecBindingsPassA, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPassB * _ * _ = + let TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecBindingsPhase2A, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPhase2B * _ * _ = - let (defnsBs: MutRecBindingsPassB), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = + let (defnsBs: MutRecBindingsPhase2B), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList @@ -12557,13 +12563,13 @@ module TyconBindingChecking = begin let outerState = (tpenv, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable, envNonRec) MutRecShape.Lets defnBs, outerState - | MutRecShape.Tycon (TyconBindingsPassA(tyconOpt, declKind, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> + | MutRecShape.Tycon (TyconBindingsPhase2A(tyconOpt, declKind, _, tcref, copyOfTyconTypars, thisTy, defnAs)) -> let isExtrinsic = (declKind = ExtrinsicExtensionBinding) let envForTycon = MakeInnerEnvForTyconRef cenv envForDecls tcref isExtrinsic let envForTycon = if isExtrinsic then envForTycon else AddLocalTyconRefs true cenv.g cenv.amap tcref.Range [tcref] envForTycon // Set up the environment so use-before-definition warnings are given, at least - // until we reach a PassAIncrClassCtorJustAfterSuperInit. + // until we reach a Phase2AIncrClassCtorJustAfterSuperInit. let envForTycon = { envForTycon with eCtorInfo = Some (InitialImplicitCtorInfo()) } let reqdThisValTyOpt = Some thisTy @@ -12584,9 +12590,9 @@ module TyconBindingChecking = begin let (tpenv,envInstance,envStatic,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = innerState match defnA with - // PassB for the definition of an implicit constructor. Enrich the instance environments + // Phase2B for the definition of an implicit constructor. Enrich the instance environments // with the implicit ctor args. - | PassAIncrClassCtor incrClassCtorLhs -> + | Phase2AIncrClassCtor incrClassCtorLhs -> let envInstance = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envInstance let envStatic = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envStatic @@ -12597,19 +12603,19 @@ module TyconBindingChecking = begin let safeThisValBindOpt = TcLetrecComputeCtorSafeThisValBind cenv incrClassCtorLhs.InstanceCtorSafeThisValOpt let innerState = (tpenv,envInstance,envStatic,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) - PassBIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt), innerState + Phase2BIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt), innerState - // PassB: typecheck the argument to an 'inherits' call and build the new object expr for the inherit-call - | PassAInherit (synBaseTy,arg,baseValOpt,m) -> + // Phase2B: typecheck the argument to an 'inherits' call and build the new object expr for the inherit-call + | Phase2AInherit (synBaseTy,arg,baseValOpt,m) -> let baseTy,tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurence.Use envInstance tpenv synBaseTy let inheritsExpr,tpenv = TcNewExpr cenv envInstance tpenv baseTy (Some synBaseTy.Range) true arg m let envInstance = match baseValOpt with Some baseVal -> AddLocalVal cenv.tcSink scopem baseVal envInstance | None -> envInstance let envNonRec = match baseValOpt with Some baseVal -> AddLocalVal cenv.tcSink scopem baseVal envNonRec | None -> envNonRec let innerState = (tpenv,envInstance,envStatic,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) - PassBInherit (inheritsExpr,baseValOpt), innerState + Phase2BInherit (inheritsExpr,baseValOpt), innerState - // PassB: let and let rec value and function definitions - | PassAIncrClassBindings (tcref,binds,isStatic,isRec,bindsm) -> + // Phase2B: let and let rec value and function definitions + | Phase2AIncrClassBindings (tcref,binds,isStatic,isRec,bindsm) -> let envForBinding = if isStatic then envStatic else envInstance let binds,bindRs,env,tpenv = if isRec then @@ -12652,31 +12658,31 @@ module TyconBindingChecking = begin let envInstance = (if isStatic then (binds,envInstance) ||> List.foldBack (fun b e -> AddLocalVal cenv.tcSink scopem b.Var e) else env) let envStatic = (if isStatic then env else envStatic) let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - PassBIncrClassBindings bindRs,innerState + Phase2BIncrClassBindings bindRs,innerState - | PassAIncrClassCtorJustAfterSuperInit -> + | Phase2AIncrClassCtorJustAfterSuperInit -> let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - PassBIncrClassCtorJustAfterSuperInit, innerState + Phase2BIncrClassCtorJustAfterSuperInit, innerState - | PassAIncrClassCtorJustAfterLastLet -> + | Phase2AIncrClassCtorJustAfterLastLet -> let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - PassBIncrClassCtorJustAfterLastLet , innerState + Phase2BIncrClassCtorJustAfterLastLet , innerState #if OPEN_IN_TYPE_DECLARATIONS - | PassAOpen(mp,m) -> + | Phase2AOpen(mp,m) -> let envInstance = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem envInstance mp let envStatic = TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem envStatic mp let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - PassBOpen,innerState + Phase2BOpen,innerState #endif // Note: this path doesn't add anything the environment, because the member is already available off via its type - | PassAMember rbind -> + | Phase2AMember rbind -> - // PassB: Typecheck member binding, generalize them later, when all type constraints are known + // Phase2B: Typecheck member binding, generalize them later, when all type constraints are known // static members are checked under envStatic. // envStatic contains class typars and the (ungeneralized) members on the class(es). // envStatic has no instance-variables (local let-bindings or ctor args). @@ -12700,9 +12706,9 @@ module TyconBindingChecking = begin TcLetrecBinding (cenv,envForBinding,scopem,extraGeneralizableTypars,reqdThisValTyOpt) (envNonRec, generalizedRecBinds, preGeneralizationRecBinds, tpenv, uncheckedRecBindsTable) rbind let innerState = (tpenv, envInstance, envStatic, envNonRec, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable) - PassBMember rbind.RecBindingInfo.Index, innerState) + Phase2BMember rbind.RecBindingInfo.Index, innerState) - let defnBs = MutRecShape.Tycon (TyconBindingsPassB(tyconOpt, tcref, defnBs)) + let defnBs = MutRecShape.Tycon (TyconBindingsPhase2B(tyconOpt, tcref, defnBs)) let outerState = (tpenv, generalizedRecBinds, preGeneralizationRecBinds, uncheckedRecBindsTable, envNonRec) defnBs, outerState) @@ -12716,47 +12722,47 @@ module TyconBindingChecking = begin // Choose type scheme implicit constructors and adjust their recursive types. // Fixup recursive references to members. - let TcMutRecBindings_PassC_FixupRecursiveReferences cenv (denv, defnsBs: MutRecBindingsPassB, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = + let TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (denv, defnsBs: MutRecBindingsPhase2B, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = // Build an index ---> binding map let generalizedBindingsMap = generalizedRecBinds |> List.map (fun pgrbind -> (pgrbind.RecBindingInfo.Index, pgrbind)) |> Map.ofList defnsBs |> MutRecShapes.mapTyconsAndLets - // PassC: Fixup member bindings - (fun (TyconBindingsPassB(tyconOpt, tcref, defnBs)) -> + // Phase2C: Fixup member bindings + (fun (TyconBindingsPhase2B(tyconOpt, tcref, defnBs)) -> let defnCs = defnBs |> List.map (fun defnB -> - // PassC: Generalise implicit ctor val + // Phase2C: Generalise implicit ctor val match defnB with - | PassBIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) -> + | Phase2BIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) -> let valscheme = incrClassCtorLhs.InstanceCtorValScheme let valscheme = ChooseCanonicalValSchemeAfterInference cenv.g denv valscheme scopem AdjustRecType cenv incrClassCtorLhs.InstanceCtorVal valscheme - PassCIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) + Phase2CIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) - | PassBInherit (inheritsExpr,basevOpt) -> - PassCInherit (inheritsExpr,basevOpt) + | Phase2BInherit (inheritsExpr,basevOpt) -> + Phase2CInherit (inheritsExpr,basevOpt) - | PassBIncrClassBindings bindRs -> - PassCIncrClassBindings bindRs + | Phase2BIncrClassBindings bindRs -> + Phase2CIncrClassBindings bindRs - | PassBIncrClassCtorJustAfterSuperInit -> - PassCIncrClassCtorJustAfterSuperInit + | Phase2BIncrClassCtorJustAfterSuperInit -> + Phase2CIncrClassCtorJustAfterSuperInit - | PassBIncrClassCtorJustAfterLastLet -> - PassCIncrClassCtorJustAfterLastLet + | Phase2BIncrClassCtorJustAfterLastLet -> + Phase2CIncrClassCtorJustAfterLastLet - | PassBMember idx -> - // PassC: Fixup member bindings + | Phase2BMember idx -> + // Phase2C: Fixup member bindings let generalizedBinding = generalizedBindingsMap.[idx] let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind - PassCMember pgbrind) - TyconBindingsPassC(tyconOpt, tcref,defnCs)) + Phase2CMember pgbrind) + TyconBindingsPhase2C(tyconOpt, tcref,defnCs)) - // PassC: Fixup let bindings + // Phase2C: Fixup let bindings (fun bindIdxs -> [ for idx in bindIdxs do let generalizedBinding = generalizedBindingsMap.[idx] @@ -12767,12 +12773,12 @@ module TyconBindingChecking = begin // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPassC) = + let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPhase2C) = // let (fixupValueExprBinds, methodBinds) = - (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPassC(tyconOpt, tcref,defnCs)) -> + (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPhase2C(tyconOpt, tcref,defnCs)) -> match defnCs with - | PassCIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) :: defnCs -> + | Phase2CIncrClassCtor (incrClassCtorLhs, safeThisValBindOpt) :: defnCs -> // Determine is static fields in this type need to be "protected" against invalid recursive initialization let safeStaticInitInfo = @@ -12799,7 +12805,7 @@ module TyconBindingChecking = begin // We only need safe static init checks if there are some static field bindings (actually, we look for non-method bindings) let hasStaticBindings = defnCs |> List.exists (function - | PassCIncrClassBindings groups -> + | Phase2CIncrClassBindings groups -> groups |> List.exists (function | IncrClassBindingGroup(binds,isStatic,_) -> let nonMethodBinds = binds |> List.filter (IncrClassReprInfo.IsMethodRepr cenv >> not) @@ -12819,8 +12825,8 @@ module TyconBindingChecking = begin // Assumes inherit call immediately follows implicit ctor. Checked by CheckMembersForm let inheritsExpr,inheritsIsVisible,_,defnCs = - match defnCs |> List.partition (function PassCInherit _ -> true | _ -> false) with - | [PassCInherit (inheritsExpr,baseValOpt)], defnCs -> + match defnCs |> List.partition (function Phase2CInherit _ -> true | _ -> false) with + | [Phase2CInherit (inheritsExpr,baseValOpt)], defnCs -> inheritsExpr,true,baseValOpt,defnCs | _ -> @@ -12837,17 +12843,17 @@ module TyconBindingChecking = begin let localDecs = defnCs |> List.filter (function - | PassCIncrClassBindings _ - | PassCIncrClassCtorJustAfterSuperInit - | PassCIncrClassCtorJustAfterLastLet -> true + | Phase2CIncrClassBindings _ + | Phase2CIncrClassCtorJustAfterSuperInit + | Phase2CIncrClassCtorJustAfterLastLet -> true | _ -> false) - let memberBindsWithFixups = defnCs |> List.choose (function PassCMember pgrbind -> Some pgrbind | _ -> None) + let memberBindsWithFixups = defnCs |> List.choose (function Phase2CMember pgrbind -> Some pgrbind | _ -> None) // Extend localDecs with "let safeThisVal = ref null" if there is a safeThisVal let localDecs = match safeThisValBindOpt with | None -> localDecs - | Some bind -> PassCIncrClassBindings [IncrClassBindingGroup([bind],false,false)] :: localDecs + | Some bind -> Phase2CIncrClassBindings [IncrClassBindingGroup([bind],false,false)] :: localDecs // Carve out the initialization sequence and decide on the localRep let ctorBodyLambdaExpr,cctorBodyLambdaExprOpt,methodBinds,localReps = @@ -12855,12 +12861,12 @@ module TyconBindingChecking = begin let localDecs = [ for localDec in localDecs do match localDec with - | PassCIncrClassBindings(binds) -> yield PassCBindings binds - | PassCIncrClassCtorJustAfterSuperInit -> yield PassCCtorJustAfterSuperInit - | PassCIncrClassCtorJustAfterLastLet -> yield PassCCtorJustAfterLastLet + | Phase2CIncrClassBindings(binds) -> yield Phase2CBindings binds + | Phase2CIncrClassCtorJustAfterSuperInit -> yield Phase2CCtorJustAfterSuperInit + | Phase2CIncrClassCtorJustAfterLastLet -> yield Phase2CCtorJustAfterLastLet | _ -> () ] let memberBinds = memberBindsWithFixups |> List.map (fun x -> x.Binding) - MakeCtorForIncrClassConstructionPassC(cenv,envForTycon,incrClassCtorLhs,inheritsExpr,inheritsIsVisible,localDecs,memberBinds,generalizedTyparsForRecursiveBlock,safeStaticInitInfo) + MakeCtorForIncrClassConstructionPhase2C(cenv,envForTycon,incrClassCtorLhs,inheritsExpr,inheritsIsVisible,localDecs,memberBinds,generalizedTyparsForRecursiveBlock,safeStaticInitInfo) // Generate the (value,expr) pairs for the implicit // object constructor and implicit static initializer @@ -12893,7 +12899,7 @@ module TyconBindingChecking = begin // Members have at least as many type parameters as the enclosing class. Just grab the type variables for the type. let thisTyInst = List.map mkTyparTy (List.take (tcref.Typars(v.Range).Length) v.Typars) - let x = localReps.FixupIncrClassExprPassC thisValOpt safeStaticInitInfo thisTyInst x + let x = localReps.FixupIncrClassExprPhase2C thisValOpt safeStaticInitInfo thisTyInst x { pgrbind with Binding = TBind(v,x,spBind) } ) @@ -12901,7 +12907,7 @@ module TyconBindingChecking = begin // Cover the case where this is not a class with an implicit constructor | defnCs -> - let memberBindsWithFixups = defnCs |> List.choose (function PassCMember pgrbind -> Some pgrbind | _ -> None) + let memberBindsWithFixups = defnCs |> List.choose (function Phase2CMember pgrbind -> Some pgrbind | _ -> None) tyconOpt, memberBindsWithFixups,[]) // |> List.unzip // let fixupValueExprBinds = List.concat fixupValueExprBinds @@ -12910,25 +12916,25 @@ module TyconBindingChecking = begin /// Main routine - let TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls : MutRecDefnsPass2Info) = + let TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = let g = cenv.g // TODO: This needs to be factored into each environment computation // TESTING: Test cases where nested modules have C#-style extension members to check they are added to the // correct environments. let tcrefsWithCSharpExtensionMembers = - mutRecDecls |> MutRecShapes.topTycons |> List.choose (fun (MutRecDefnsPass2InfoForTycon(_,tcref, _, declKind, _)) -> + mutRecDecls |> MutRecShapes.topTycons |> List.choose (fun (MutRecDefnsPhase2InfoForTycon(_,tcref, _, declKind, _)) -> if TyconRefHasAttribute g scopem g.attrib_ExtensionAttribute tcref && (declKind <> DeclKind.ExtrinsicExtensionBinding) then Some tcref else None) - // PassA: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals - // PassA: also processes their arg patterns - collecting type assertions - let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_PassA_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) + // _Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals + // _Phase2A: also processes their arg patterns - collecting type assertions + let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings__Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) - // PassB: type check pass, convert from ast to tast and collects type assertions, and generalize - let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_PassB_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs, uncheckedRecBinds, scopem) + // Phase2B: type check pass, convert from ast to tast and collects type assertions, and generalize + let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs, uncheckedRecBinds, scopem) let generalizedTyparsForRecursiveBlock = @@ -12939,11 +12945,11 @@ module TyconBindingChecking = begin // Check the escape condition for all extraGeneralizableTypars. // First collect up all the extraGeneralizableTypars. let allExtraGeneralizableTypars = - defnsAs |> MutRecShapes.collectTycons |> List.collect (fun (TyconBindingsPassA(_, _, _, _, copyOfTyconTypars, _, defnAs)) -> + defnsAs |> MutRecShapes.collectTycons |> List.collect (fun (TyconBindingsPhase2A(_, _, _, _, copyOfTyconTypars, _, defnAs)) -> [ yield! copyOfTyconTypars for defnA in defnAs do match defnA with - | PassAMember rbind -> yield! rbind.RecBindingInfo.EnclosingDeclaredTypars + | Phase2AMember rbind -> yield! rbind.RecBindingInfo.EnclosingDeclaredTypars | _ -> () ]) // Now check they don't escape the overall scope of the recursive set of types @@ -12965,10 +12971,10 @@ module TyconBindingChecking = begin let allTypes = [ for pgrbind in generalizedRecBinds do yield pgrbind.RecBindingInfo.Val.Type - for (TyconBindingsPassB(_tyconOpt, _tcref, defnBs)) in MutRecShapes.collectTycons defnsBs do + for (TyconBindingsPhase2B(_tyconOpt, _tcref, defnBs)) in MutRecShapes.collectTycons defnsBs do for defnB in defnBs do match defnB with - | PassBIncrClassCtor (incrClassCtorLhs, _) -> + | Phase2BIncrClassCtor (incrClassCtorLhs, _) -> yield incrClassCtorLhs.InstanceCtorVal.Type | _ -> () @@ -12996,7 +13002,7 @@ module TyconBindingChecking = begin ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envMutRec.DisplayEnv tp // Now that we know what we've generalized we can adjust the recursive references - let defnsCs = TcMutRecBindings_PassC_FixupRecursiveReferences cenv (envMutRec.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) + let defnsCs = TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (envMutRec.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings @@ -13021,24 +13027,22 @@ module TyconBindingChecking = begin let envFinal = AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers envMutRec let envFinal = let ctorVals = - defnsBs |> MutRecShapes.topTycons |> List.collect (fun (TyconBindingsPassB(_tyconOpt, _tcref, defnBs)) -> + defnsBs |> MutRecShapes.topTycons |> List.collect (fun (TyconBindingsPhase2B(_tyconOpt, _tcref, defnBs)) -> [ for defnB in defnBs do match defnB with - | PassBIncrClassCtor (incrClassCtorLhs, _) -> yield incrClassCtorLhs.InstanceCtorVal + | Phase2BIncrClassCtor (incrClassCtorLhs, _) -> yield incrClassCtorLhs.InstanceCtorVal | _ -> () ]) AddLocalVals cenv.tcSink scopem ctorVals envFinal defnsEs,envFinal -end - //------------------------------------------------------------------------- // The member portions of class defns //------------------------------------------------------------------------- -let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPass2Data) = +let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = - let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) members |> List.collect (function | SynMemberDefn.Interface(ity,defnOpt,_) -> @@ -13071,7 +13075,7 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, | _ -> []) let interfaceMembersFromTypeDefn tyconMembersData (ity',defn,_) implTySet = - let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity',implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) defn |> List.choose (fun mem -> match mem with @@ -13084,7 +13088,7 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, try // Some preliminary checks mutRecDefns |> MutRecShapes.iterTycons (fun tyconData -> - let (MutRecDefnsPass2DataForTycon(_, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData + let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData let tcaug = tcref.TypeContents if tcaug.tcaug_closed && declKind <> ExtrinsicExtensionBinding then error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type",m)) @@ -13100,7 +13104,7 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, // The rest should have been removed by splitting, they belong to "core" (they are "shape" of type, not implementation) | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(),mem.Range)))) - let tyconBindingsOfTypeDefn (MutRecDefnsPass2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = + let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) members |> List.choose (fun memb -> @@ -13125,13 +13129,13 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, let binds = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> - let (MutRecDefnsPass2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData + let (MutRecDefnsPhase2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData let ibinds = let intfTypes = interfacesFromTypeDefn envForDecls tyconData let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envForDecls.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat - MutRecDefnsPass2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) + MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) TyconBindingChecking.TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, binds) @@ -13547,7 +13551,7 @@ let CheckForDuplicateModule _cenv env nm m = module TcExceptionDeclarations = - let TcExnDefnCore_Phase0 cenv env parent (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_,_,_,_),_,doc,vis,m)) = + let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_,_,_,_),_,doc,vis,m)) = let attrs = TcAttributes cenv env AttributeTargets.ExnDecl synAttrs if not (String.isUpper id.idText) then errorR(NotUpperCaseConstructor(m)) let vis,cpath = ComputeAccessAndCompPath env None m vis parent @@ -13556,7 +13560,7 @@ module TcExceptionDeclarations = CheckForDuplicateConcreteType cenv env id.idText id.idRange NewExn cpath id vis (TExnFresh (MakeRecdFieldsTable [])) attrs (doc.ToXmlDoc()) - let TcExnDefnCore_Phase6_EstablishRepresentation cenv env parent (exnc: Entity) (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = + let TcExnDefnCore_Phase1G_EstablishRepresentation cenv env parent (exnc: Entity) (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = let args = match args with (UnionCaseFields args) -> args | _ -> error(Error(FSComp.SR.tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors(),m)) let ad = env.eAccessRights let id = exnc.Id @@ -13603,8 +13607,8 @@ module TcExceptionDeclarations = args' let private TcExnDefnCore cenv env parent synExnDefnRepr = - let exnc = TcExnDefnCore_Phase0 cenv env parent synExnDefnRepr - let args' = TcExnDefnCore_Phase6_EstablishRepresentation cenv env parent exnc synExnDefnRepr + let exnc = TcExnDefnCore_Phase1A cenv env parent synExnDefnRepr + let args' = TcExnDefnCore_Phase1G_EstablishRepresentation cenv env parent exnc synExnDefnRepr exnc.TypeContents.tcaug_super <- Some cenv.g.exn_ty PublishTypeDefn cenv env exnc @@ -13629,7 +13633,7 @@ module TcExceptionDeclarations = let binds1,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) - let defns = [MutRecShape.Tycon(MutRecDefnsPass2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] + let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] let binds2,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type @@ -13659,7 +13663,7 @@ module TcExceptionDeclarations = /// refer to the types being defined. However a functional version of this /// would need to re-implement certain type relations to work over a /// partial representation of types. -module EstablishTypeDefinitionCores = begin +module EstablishTypeDefinitionCores = /// Compute the mangled name of a type definition. 'doErase' is true for all type definitions except type abbreviations. let private ComputeTyconName (longPath: Ident list, doErase:bool, typars: Typars) = @@ -13720,7 +13724,7 @@ module EstablishTypeDefinitionCores = begin /// Get the component types that make a record, union or struct type. /// /// Used when determining if a structural type supports structural comparison. - let private GetStructuralElementsOfTyconDefn cenv env tpenv (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) tycon = + let private GetStructuralElementsOfTyconDefn cenv env tpenv (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) tycon = let thisTyconRef = mkLocalTyconRef tycon let m = tycon.Range let env = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) env @@ -13771,13 +13775,13 @@ module EstablishTypeDefinitionCores = begin /// - computing the mangled name for C /// but /// - we don't yet 'properly' establish constraints on type parameters - let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor, _)) = + let private TcTyconDefnCore_Phase1A_BuildInitialTycon cenv env parent (MutRecDefnsPhase1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor, _)) = let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) match synTyconRepr with | SynTypeDefnSimpleRepr.Exception synExnDefnRepr -> - TcExceptionDeclarations.TcExnDefnCore_Phase0 cenv env parent synExnDefnRepr + TcExceptionDeclarations.TcExnDefnCore_Phase1A cenv env parent synExnDefnRepr | _ -> let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) @@ -13818,7 +13822,7 @@ module EstablishTypeDefinitionCores = begin /// /// synTyconInfo: Syntactic AST for the name, attributes etc. of the type constructor /// synTyconRepr: Syntactic AST for the RHS of the type definition - let private TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envinner (MutRecDefnsPass1DataForTycon(synTyconInfo,synTyconRepr,_,_,_,_)) (tycon:Tycon) = + let private TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envinner (MutRecDefnsPhase1DataForTycon(synTyconInfo,synTyconRepr,_,_,_,_)) (tycon:Tycon) = let (ComponentInfo(synAttrs,typars, _,_, _, _,_,_)) = synTyconInfo let m = tycon.Range let id = tycon.Id @@ -13945,7 +13949,7 @@ module EstablishTypeDefinitionCores = begin /// Check and establish a 'type X = ABC<...>' provided type definition - let private TcTyconDefnCore_Phase2_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon:Tycon, rhsType:SynType, tcrefForContainer:TyconRef, theRootType:Tainted, checkTypeName, args, m) = + let private TcTyconDefnCore_Phase1C_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon:Tycon, rhsType:SynType, tcrefForContainer:TyconRef, theRootType:Tainted, checkTypeName, args, m) = let tcref = mkLocalTyconRef tycon try @@ -14098,7 +14102,7 @@ module EstablishTypeDefinitionCores = begin // such as 'isTupleTy' will return reliable results, e.g. isTupleTy on the /// TAST type for 'PairOfInts' will report 'true' // - let private TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14132,7 +14136,7 @@ module EstablishTypeDefinitionCores = begin | Some (tcrefForContainer, providedTypeAfterStaticArguments, checkTypeName, args, m) -> // If this is a generative provided type definition then establish the provided type and all its nested types. Only do this on the first pass. if firstPass then - TcTyconDefnCore_Phase2_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon, rhsType, tcrefForContainer, providedTypeAfterStaticArguments, checkTypeName, args, m) + TcTyconDefnCore_Phase1C_EstablishDeclarationForGeneratedSetOfTypes cenv inSig (tycon, rhsType, tcrefForContainer, providedTypeAfterStaticArguments, checkTypeName, args, m) | None -> #else ignore inSig @@ -14161,7 +14165,7 @@ module EstablishTypeDefinitionCores = begin // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = + let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14170,7 +14174,7 @@ module EstablishTypeDefinitionCores = begin (envMutRec, mutRecDecls) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (tyconDefCore,_), Some (tycon, checkedAttrs) -> - let (MutRecDefnsPass1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = tyconDefCore + let (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = tyconDefCore let m = tycon.Range let tcref = mkLocalTyconRef tycon let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner @@ -14261,7 +14265,7 @@ module EstablishTypeDefinitionCores = begin with e -> errorRecovery e m)) /// Establish the fields, dispatch slots and union cases of a type - let private TcTyconDefnCore_Phase6_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPass1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = let m = tycon.Range try let id = tycon.Id @@ -14371,7 +14375,7 @@ module EstablishTypeDefinitionCores = begin | SynTypeDefnSimpleRepr.Exception synExnDefnRepr -> let parent = Parent (mkLocalTyconRef tycon) - TcExceptionDeclarations.TcExnDefnCore_Phase6_EstablishRepresentation cenv envinner parent tycon synExnDefnRepr |> ignore + TcExceptionDeclarations.TcExnDefnCore_Phase1G_EstablishRepresentation cenv envinner parent tycon synExnDefnRepr |> ignore TNoRepr, None, NoSafeInitInfo | SynTypeDefnSimpleRepr.None _ -> @@ -14807,7 +14811,7 @@ module EstablishTypeDefinitionCores = begin let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm^FSharpModuleSuffix | _ -> nm) - let TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial parent compInfo = + let TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial parent compInfo = let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo let id = ComputeModuleName longPath let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs @@ -14823,21 +14827,21 @@ module EstablishTypeDefinitionCores = begin let _envinner, mtypeAcc = MakeInnerEnv envInitial id modKind let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) let innerParent = Parent (mkLocalModRef mspec) - MutRecDefnsPass2DataForModule (mtypeAcc, mspec), innerParent + MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), innerParent - let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = + let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = // First define the type constructors and the abbreviations, if any. Skip augmentations. let withTycons = typeDefCores |> MutRecShapes.mapWithParent parent - (fun innerParent modInfo -> TcTyconDefnCore_Phase0_BuildInitialModule cenv envInitial innerParent modInfo) + (fun innerParent modInfo -> TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial innerParent modInfo) (fun innerParent ((tyconDefCore,_) as c) -> - let (MutRecDefnsPass1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = tyconDefCore + let (MutRecDefnsPhase1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = tyconDefCore let tyconOpt = if isAtOriginalTyconDefn then - Some (TcTyconDefnCore_Phase0_BuildInitialTycon cenv envInitial innerParent tyconDefCore) + Some (TcTyconDefnCore_Phase1A_BuildInitialTycon cenv envInitial innerParent tyconDefCore) else None c, tyconOpt) @@ -14854,12 +14858,12 @@ module EstablishTypeDefinitionCores = begin // they are well-formed (e.g. free of abbreviation cycles - see bug 952) let envMutRec, withEnvs = (envInitial, withTycons) ||> MutRecShapes.computeEnvs - (fun envAbove (MutRecDefnsPass2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt) -> tyconOpt | _ -> None) - let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPass2DataForModule (_, mspec),_) -> Some mspec | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) for tycon in tycons do // recheck these in case type is a duplicate in a mutually recursive set @@ -14877,7 +14881,7 @@ module EstablishTypeDefinitionCores = begin envForDecls) // Updates the types of the modules to contain the inferred contents so far - withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> + withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) @@ -14888,14 +14892,14 @@ module EstablishTypeDefinitionCores = begin (envMutRec, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconOpt) -> let res = match origInfo, tyconOpt with - | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1_EstablishBasicKind cenv inSig envForDecls tyconDefCore tycon) + | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envForDecls tyconDefCore tycon) | _ -> None origInfo, res) // Establish the abbreviations (no constraint checking, because constraints not yet established) (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass tyconDefCore tycon attrs + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass tyconDefCore tycon attrs | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. @@ -14907,7 +14911,7 @@ module EstablishTypeDefinitionCores = begin CheckForCyclicAbbreviations tycons // Establish the super type and interfaces (no constraint checking, because constraints not yet established) - (envMutRec, withAttrs) |> TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass + (envMutRec, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass // REVIEW: we should separate the checking for cyclic hierarchies and cyclic structs // REVIEW: this is because in some extreme cases the TcTyparConstraints call below could @@ -14941,7 +14945,7 @@ module EstablishTypeDefinitionCores = begin (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with | (tyconDefCore,_), Some tycon -> - let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore + let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls let thisTyconRef = mkLocalTyconRef tycon @@ -14960,10 +14964,10 @@ module EstablishTypeDefinitionCores = begin // OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase2_Phase4_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass tyconDefCore tycon attrs + | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass tyconDefCore tycon attrs | _ -> ()) - (envMutRec, withAttrs) |> TcTyconDefnCore_Phase3_Phase5_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass + (envMutRec, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass checkExplicitConstraints CheckCxs // Now all the type parameters, abbreviations, constraints and kind information is established. @@ -14973,7 +14977,7 @@ module EstablishTypeDefinitionCores = begin (envMutRec,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> let info = match origInfo, tyconAndAttrsOpt with - | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase6_EstablishRepresentation cenv envForDecls tpenv inSig tyconDefnCore tycon attrs + | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envForDecls tpenv inSig tyconDefnCore tycon attrs | _ -> None, NoSafeInitInfo (origInfo, Option.map fst tyconAndAttrsOpt, info)) @@ -14981,14 +14985,18 @@ module EstablishTypeDefinitionCores = begin // REVIEW: checking for cyclic inheritance is happening too late. See note above. CheckForCyclicStructsAndInheritance cenv tycons - // Reconstruct the environments all over again - this will add the union cases and fields. + // By now we've established the full contents of type definitions apart from their + // members and any fields determined by implicit construction. We know the kinds and + // representations of types and have established them as valid. + // + // We now reconstruct the active environments all over again - this will add the union cases and fields. let envMutRec, withNewEnvs = (envInitial, withBaseValsAndSafeInitInfos) ||> MutRecShapes.recomputeEnvs - (fun envAbove (MutRecDefnsPass2DataForModule (mtypeAcc, mspec), _) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) - let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPass2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPhase2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) let envForDecls = (envAbove, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) let envForDecls = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls @@ -14997,8 +15005,6 @@ module EstablishTypeDefinitionCores = begin (tycons, envMutRec, withNewEnvs) -end // module EstablishTypeDefinitionCores - module TcDeclarations = begin @@ -15286,19 +15292,19 @@ module TcDeclarations = begin | _ -> false) let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m) let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) - let core = MutRecDefnsPass1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor,isAtOriginalTyconDefn) core, members @ extraMembers | SynTypeDefnRepr.Simple(repr,_) -> let members = [] let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) - let core = MutRecDefnsPass1DataForTycon(synTyconInfo,repr,implements1,false,false,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,repr,implements1,false,false,isAtOriginalTyconDefn) core, members @ extraMembers | SynTypeDefnRepr.Exception(r) -> let isAtOriginalTyconDefn = true - let core = MutRecDefnsPass1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) core, extraMembers let SplitMutRecDefns cenv mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons (SplitTyconDefn cenv) @@ -15312,7 +15318,7 @@ module TcDeclarations = begin if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclm)) - MutRecDefnsPass2DataForTycon(tyconOpt, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) + MutRecDefnsPhase2DataForTycon(tyconOpt, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) //------------------------------------------------------------------------- // Bind type definitions - main @@ -15326,14 +15332,24 @@ module TcDeclarations = begin let mutRecDefnsAfterPrep = mutRecDefnsAfterCore |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> - let (MutRecDefnsPass1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore + let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) let withBindings,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) // Note: generating these bindings must come after generating the members, since some in the case of structs some fields // may be added by generating the implicit construction syntax - let withExtraBindings = withBindings |> MutRecShapes.expandTycons (fun (tyconOpt, _) -> match tyconOpt with None -> [] | Some tycon -> AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv tycon @ AddAugmentationDeclarations.AddGenericEqualityBindings cenv env tycon) + let withExtraBindings = + withBindings |> MutRecShapes.expandTycons (fun (tyconOpt, _) -> + match tyconOpt with + | None -> [],[] + | Some tycon -> + // We put the hash/compare bindings before the type definitions and the + // equality bindings after because tha is the order they've always been generated + // in, and there are code generation tests to check that. + let binds = AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv tycon + let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env tycon + binds, binds3) // Check for cyclic structs and inheritance all over again, since we may have added some fields to the struct when generating the implicit construction syntax EstablishTypeDefinitionCores.CheckForCyclicStructsAndInheritance cenv tycons @@ -15382,7 +15398,7 @@ module TcDeclarations = begin let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m) let isAtOriginalTyconDefn = true - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, repr,implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,isAtOriginalTyconDefn) + let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, repr,implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,isAtOriginalTyconDefn) tyconCore, (synTyconInfo,members@extraMembers) @@ -15390,12 +15406,12 @@ module TcDeclarations = begin // Representation-hidden types with members and interfaces are written 'type X = ...' | SynTypeDefnSigRepr.Simple((SynTypeDefnSimpleRepr.None _ as r),_) when nonNil extraMembers -> let isAtOriginalTyconDefn = false - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) + let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) tyconCore, (synTyconInfo,extraMembers) | SynTypeDefnSigRepr.Simple(r,_) -> let isAtOriginalTyconDefn = true - let tyconCore = MutRecDefnsPass1DataForTycon (synTyconInfo, r, implements1, false, false,isAtOriginalTyconDefn) + let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false,isAtOriginalTyconDefn) tyconCore, (synTyconInfo,extraMembers) let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature @@ -15404,7 +15420,7 @@ module TcDeclarations = begin // TODO - this is only checking the tycons in the signatures, need to do the module and let elements too (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members)), _, _) -> let tpenv = emptyUnscopedTyparEnv - let (MutRecDefnsPass1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore + let (MutRecDefnsPhase1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath @@ -15867,7 +15883,7 @@ and TcMutRecDefsFinish cenv defs m = let mods = defs |> List.choose (function | MutRecShape.Tycon _ | MutRecShape.Open _ | MutRecShape.Lets _ -> None - | MutRecShape.Module ((MutRecDefnsPass2DataForModule(mtypeAcc, mspec), _),mdefs) -> + | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(mtypeAcc, mspec), _),mdefs) -> let mexpr = TcMutRecDefsFinish cenv mdefs m // Apply the functions for each declaration to build the overall expression-builder mspec.Data.entity_modul_contents <- notlazy !mtypeAcc diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 204ee81b81f..d442b81803f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -2,7 +2,7 @@ #nowarn "40" -namespace (* rec *) Microsoft.VisualStudio.FSharp.ProjectSystem +namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem open Helpers open System @@ -43,8 +43,6 @@ namespace (* rec *) Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.Build.BuildEngine open Internal.Utilities.Debug - #mutrec - module internal VSHiveUtilities = /// For a given sub-hive, check to see if a 3rd party has specified any /// custom/extended property pages. From b128822f447fdd93dba24f4e770cc82be9175700 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 11 Mar 2016 13:47:54 +0000 Subject: [PATCH 057/334] add docs for phases --- src/fsharp/TypeChecker.fs | 134 ++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 69 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 9f6025851b1..99fc3157b6b 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -11388,7 +11388,7 @@ let TcAndPublishMemberSpec cenv env containerInfo declKind tpenv memb = | SynMemberSig.Member(valSpfn,memberFlags,_) -> TcAndPublishValSpec (cenv,env,containerInfo,declKind,Some memberFlags,tpenv,valSpfn) | SynMemberSig.Interface _ -> - // These are done in TcTypeDefnCores + // These are done in TcMutRecDefns_Phase1 [],tpenv @@ -11462,7 +11462,7 @@ let TcOpenDecl tcSink g amap m scopem env (longId : Ident list) = exception ParameterlessStructCtor of range /// Incremental class definitions -module IncrClassChecking = begin +module IncrClassChecking = /// Represents a single group of bindings in a class with an implicit constructor type IncrClassBindingGroup = @@ -12236,19 +12236,17 @@ module IncrClassChecking = begin ctorBody,cctorBodyOpt,methodBinds,reps -end -// Checking of members and 'let' bindings in classes + +// Checking of mutually recursive types, members and 'let' bindings in classes // // Technique: multiple passes. -// - create val_specs for recursive items given names and args -// - type check AST to TAST collecting (sufficient) type constraints -// - determine typars to generalize over -// - generalize definitions (fixing up recursive instances) -// - build ctor binding -// - Yields set of recursive bindings for the ctors and members of the types. -module TyconBindingChecking = +// Phase1: create and establish type definitions and core representation information +// Phase2A: create Vals for recursive items given names and args +// Phase2B-D: type check AST to TAST collecting (sufficient) type constraints, +// generalize definitions, fix up recursive instances, build ctor binding +module MutRecBindingChecking = open IncrClassChecking @@ -12323,9 +12321,9 @@ module TyconBindingChecking = - // _Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals - // _Phase2A: also processes their arg patterns - collecting type assertions - let TcMutRecBindings__Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = + // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals + // Phase2A: also processes their arg patterns - collecting type assertions + let TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = // The basic iteration over the declarations in a single type definition // State: @@ -12385,9 +12383,9 @@ module TyconBindingChecking = | SynMemberDefn.ImplicitCtor (vis,attrs,spats,thisIdOpt, m), ContainerInfo(_,Some(MemberOrValContainerInfo(tcref, _, baseValOpt, safeInitInfo, _))) -> match tcref.TypeOrMeasureKind with TyparKind.Measure -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) | _ -> () - // _Phase2A: make incrClassCtorLhs - ctorv, thisVal etc, type depends on argty(s) + // Phase2A: make incrClassCtorLhs - ctorv, thisVal etc, type depends on argty(s) let incrClassCtorLhs = TcImplictCtorLhs_Phase2A(cenv,envForTycon,tpenv,tcref,vis,attrs,spats,thisIdOpt,baseValOpt,safeInitInfo,m,copyOfTyconTypars,objTy,thisTy) - // _Phase2A: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref + // Phase2A: Add copyOfTyconTypars from incrClassCtorLhs - or from tcref let envForTycon = AddDeclaredTypars CheckForDuplicateTypars incrClassCtorLhs.InstanceCtorDeclaredTypars envForTycon let innerState = (Some incrClassCtorLhs, envForTycon, tpenv, recBindIdx, uncheckedBindsRev) @@ -12395,8 +12393,8 @@ module TyconBindingChecking = | SynMemberDefn.ImplicitInherit (typ,arg,_baseIdOpt,m),_ -> match tcref.TypeOrMeasureKind with TyparKind.Measure -> error(Error(FSComp.SR.tcMeasureDeclarationsRequireStaticMembers(), m)) | _ -> () - // _Phase2A: inherit typ(arg) as base - pass through - // _Phase2A: pick up baseValOpt! + // Phase2A: inherit typ(arg) as base - pass through + // Phase2A: pick up baseValOpt! let baseValOpt = incrClassCtorLhsOpt |> Option.bind (fun x -> x.InstanceCtorBaseValOpt) let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) [Phase2AInherit (typ,arg,baseValOpt,m); Phase2AIncrClassCtorJustAfterSuperInit], innerState @@ -12422,12 +12420,12 @@ module TyconBindingChecking = if isStatic && isNone incrClassCtorLhsOpt then errorR(Error(FSComp.SR.tcStaticLetBindingsRequireClassesWithImplicitConstructors(),m)) - // _Phase2A: let-bindings - pass through + // Phase2A: let-bindings - pass through let innerState = (incrClassCtorLhsOpt,envForTycon,tpenv,recBindIdx,uncheckedBindsRev) [Phase2AIncrClassBindings (tcref,letBinds,isStatic,isRec,m)], innerState | SynMemberDefn.Member (bind,m),_ -> - // _Phase2A: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo + // Phase2A: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo let (NormalizedBinding(_,_,_,_,_,_,_,valSynData,_,_,_,_)) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind let (SynValData(memberFlagsOpt,_,_)) = valSynData match tcref.TypeOrMeasureKind with @@ -12909,14 +12907,10 @@ module TyconBindingChecking = | defnCs -> let memberBindsWithFixups = defnCs |> List.choose (function Phase2CMember pgrbind -> Some pgrbind | _ -> None) tyconOpt, memberBindsWithFixups,[]) - // |> List.unzip -// let fixupValueExprBinds = List.concat fixupValueExprBinds - // let methodBinds = List.concat methodBinds - // (fixupValueExprBinds, methodBinds) - /// Main routine - let TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = + /// Check the members and 'let' definitions in a mutually recursive group of definitions. + let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls: MutRecDefnsPhase2Info) = let g = cenv.g // TODO: This needs to be factored into each environment computation @@ -12929,9 +12923,9 @@ module TyconBindingChecking = else None) - // _Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals - // _Phase2A: also processes their arg patterns - collecting type assertions - let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings__Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) + // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals + // Phase2A: also processes their arg patterns - collecting type assertions + let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) // Phase2B: type check pass, convert from ast to tast and collects type assertions, and generalize let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs, uncheckedRecBinds, scopem) @@ -13037,10 +13031,10 @@ module TyconBindingChecking = defnsEs,envFinal //------------------------------------------------------------------------- -// The member portions of class defns -//------------------------------------------------------------------------- - -let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = +// + +/// Check and establish the interface implementations, members, 'let' definitions in a mutually recursive group of definitions. +let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) @@ -13127,7 +13121,7 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(),memb.Range))) - let binds = + let binds : MutRecDefnsPhase2Info = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> let (MutRecDefnsPhase2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData @@ -13137,7 +13131,7 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) - TyconBindingChecking.TcMutRecBindingInfos cenv envInitial tpenv bindsm scopem (envMutRec, binds) + MutRecBindingChecking.TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRec, binds) with e -> errorRecovery e scopem; [], envMutRec @@ -13145,8 +13139,8 @@ let TcMutRecBindingDefns cenv envInitial parent bindsm scopem (envMutRec: TcEnv, // Build augmentation declarations //------------------------------------------------------------------------- -module AddAugmentationDeclarations = begin - let tcaug_has_nominal_interface g (tcaug: TyconAugmentation) tcref = +module AddAugmentationDeclarations = + let tcaugHasNominalInterface g (tcaug: TyconAugmentation) tcref = tcaug.tcaug_interfaces |> List.exists (fun (x,_,_) -> isAppTy g x && tyconRefEq g (tcrefOfAppTy g x) tcref) @@ -13161,7 +13155,7 @@ module AddAugmentationDeclarations = begin let hasExplicitIComparable = tycon.HasInterface cenv.g cenv.g.mk_IComparable_ty - let hasExplicitGenericIComparable = tcaug_has_nominal_interface cenv.g tcaug cenv.g.system_GenericIComparable_tcref + let hasExplicitGenericIComparable = tcaugHasNominalInterface cenv.g tcaug cenv.g.system_GenericIComparable_tcref let hasExplicitIStructuralComparable = tycon.HasInterface cenv.g cenv.g.mk_IStructuralComparable_ty if hasExplicitIComparable then @@ -13245,7 +13239,7 @@ module AddAugmentationDeclarations = begin // Note: tycon.HasOverride only gives correct results after we've done the type augmentation let hasExplicitObjectEqualsOverride = tycon.HasOverride cenv.g "Equals" [cenv.g.obj_ty] - let hasExplicitGenericIEquatable = tcaug_has_nominal_interface cenv.g tcaug cenv.g.system_GenericIEquatable_tcref + let hasExplicitGenericIEquatable = tcaugHasNominalInterface cenv.g tcaug cenv.g.system_GenericIEquatable_tcref if hasExplicitGenericIEquatable then errorR(Error(FSComp.SR.tcImplementsIEquatableExplicitly(tycon.DisplayName),m)) @@ -13265,10 +13259,12 @@ module AddAugmentationDeclarations = begin else [] else [] -end -module TyconConstraintInference = begin +/// Infer 'comparison' and 'equality' constraints from type definitions +module TyconConstraintInference = + + /// Infer 'comparison' constraints from type definitions let InferSetOfTyconsSupportingComparable cenv (denv: DisplayEnv) tyconsWithStructuralTypes = let g = cenv.g @@ -13397,6 +13393,7 @@ module TyconConstraintInference = begin // Return the set of structural type definitions which support the relation uneliminatedTycons + /// Infer 'equality' constraints from type definitions let InferSetOfTyconsSupportingEquatable cenv (denv: DisplayEnv) (tyconsWithStructuralTypes:(Tycon * _) list) = let g = cenv.g @@ -13522,8 +13519,6 @@ module TyconConstraintInference = begin // Return the set of structural type definitions which support the relation uneliminatedTycons -end - //------------------------------------------------------------------------- // Helpers for modules, types and exception declarations @@ -13533,13 +13528,13 @@ let ComputeModuleName (longPath: Ident list) = if longPath.Length <> 1 then error(Error(FSComp.SR.tcInvalidModuleName(),(List.head longPath).idRange)) longPath.Head -let CheckForDuplicateConcreteType _cenv env nm m = +let CheckForDuplicateConcreteType env nm m = let curr = GetCurrAccumulatedModuleOrNamespaceType env if Map.containsKey nm curr.AllEntitiesByCompiledAndLogicalMangledNames then // Use 'error' instead of 'errorR' here to avoid cascading errors - see bug 1177 in FSharp 1.0 error (Duplicate(FSComp.SR.tcTypeExceptionOrModule(),nm,m)) -let CheckForDuplicateModule _cenv env nm m = +let CheckForDuplicateModule env nm m = let curr = GetCurrAccumulatedModuleOrNamespaceType env if curr.ModulesAndNamespacesByDemangledName.ContainsKey(nm) then errorR (Duplicate(FSComp.SR.tcTypeOrModule(),nm,m)) @@ -13549,6 +13544,7 @@ let CheckForDuplicateModule _cenv env nm m = // Bind exception definitions //------------------------------------------------------------------------- +/// Check 'exception' declarations in implementations and signatures module TcExceptionDeclarations = let TcExnDefnCore_Phase1A cenv env parent (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_,_,_,_),_,doc,vis,m)) = @@ -13556,8 +13552,8 @@ module TcExceptionDeclarations = if not (String.isUpper id.idText) then errorR(NotUpperCaseConstructor(m)) let vis,cpath = ComputeAccessAndCompPath env None m vis parent let vis = TcRecdUnionAndEnumDeclarations.CombineReprAccess parent vis - CheckForDuplicateConcreteType cenv env (id.idText + "Exception") id.idRange - CheckForDuplicateConcreteType cenv env id.idText id.idRange + CheckForDuplicateConcreteType env (id.idText + "Exception") id.idRange + CheckForDuplicateConcreteType env id.idText id.idRange NewExn cpath id vis (TExnFresh (MakeRecdFieldsTable [])) attrs (doc.ToXmlDoc()) let TcExnDefnCore_Phase1G_EstablishRepresentation cenv env parent (exnc: Entity) (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = @@ -13634,7 +13630,7 @@ module TcExceptionDeclarations = let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] - let binds2,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, defns) + let binds2,env = TcMutRecDefns_Phase2 cenv envInitial parent m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env exnc @@ -13786,8 +13782,8 @@ module EstablishTypeDefinitionCores = let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) // Augmentations of type definitions are allowed within the same file as long as no new type representation or abbreviation is given - CheckForDuplicateConcreteType cenv env id.idText id.idRange - CheckForDuplicateModule cenv env id.idText id.idRange + CheckForDuplicateConcreteType env id.idText id.idRange + CheckForDuplicateModule env id.idText id.idRange let vis,cpath = ComputeAccessAndCompPath env None id.idRange vis parent // Establish the visibility of the representation, e.g. @@ -14819,9 +14815,9 @@ module EstablishTypeDefinitionCores = let vis,_ = ComputeAccessAndCompPath envInitial None id.idRange vis parent - CheckForDuplicateModule cenv envInitial id.idText id.idRange + CheckForDuplicateModule envInitial id.idText id.idRange let id = ident (AdjustModuleName modKind id.idText, id.idRange) - CheckForDuplicateConcreteType cenv envInitial id.idText im + CheckForDuplicateConcreteType envInitial id.idText im CheckNamespaceModuleOrTypeName cenv.g id let _envinner, mtypeAcc = MakeInnerEnv envInitial id modKind @@ -14829,10 +14825,13 @@ module EstablishTypeDefinitionCores = let innerParent = Parent (mkLocalModRef mspec) MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), innerParent - let TcTypeDefnCores cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = - // First define the type constructors and the abbreviations, if any. Skip augmentations. - let withTycons = + + let TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = + + // Phase 1A - build Entity for type definitions, exception definitions and module definitions. + // Also for abbreviations of any of these. Augmentations are skipped in this phase. + let withEntities = typeDefCores |> MutRecShapes.mapWithParent parent @@ -14857,7 +14856,7 @@ module EstablishTypeDefinitionCores = // We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles - see bug 952) let envMutRec, withEnvs = - (envInitial, withTycons) ||> MutRecShapes.computeEnvs + (envInitial, withEntities) ||> MutRecShapes.computeEnvs (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> @@ -14867,8 +14866,8 @@ module EstablishTypeDefinitionCores = for tycon in tycons do // recheck these in case type is a duplicate in a mutually recursive set - CheckForDuplicateConcreteType cenv envAbove tycon.LogicalName tycon.Range - CheckForDuplicateModule cenv envAbove tycon.LogicalName tycon.Range + CheckForDuplicateConcreteType envAbove tycon.LogicalName tycon.Range + CheckForDuplicateModule envAbove tycon.LogicalName tycon.Range PublishTypeDefn cenv envAbove tycon for mspec in mspecs do @@ -14903,10 +14902,7 @@ module EstablishTypeDefinitionCores = | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. - let tycons = - withTycons - |> MutRecShapes.collectTycons - |> List.choose snd + let tycons = withEntities |> MutRecShapes.collectTycons |> List.choose snd CheckForCyclicAbbreviations tycons @@ -15327,7 +15323,7 @@ module TcDeclarations = begin let TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = let inSig = false let mutRecDefnsAfterSplit = SplitMutRecDefns cenv mutRecDefns - let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) + let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) let mutRecDefnsAfterPrep = mutRecDefnsAfterCore @@ -15335,7 +15331,7 @@ module TcDeclarations = begin let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) - let withBindings,env = TcMutRecBindingDefns cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) + let withBindings,env = TcMutRecDefns_Phase2 cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) // Note: generating these bindings must come after generating the members, since some in the case of structs some fields // may be added by generating the implicit construction syntax @@ -15431,7 +15427,7 @@ module TcDeclarations = begin let TcTyconSignatures cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs - let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcTypeDefnCores cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) let _ = TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefnsAfterCore envMutRec end @@ -15556,8 +15552,8 @@ and TcModuleOrNamespaceSignature cenv env (id:Ident,isModule,defs,xml,attribs,vi CheckNamespaceModuleOrTypeName cenv.g id let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule attribs let modName = EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText - if isModule then CheckForDuplicateConcreteType cenv env modName id.idRange - if isModule then CheckForDuplicateModule cenv env id.idText id.idRange + if isModule then CheckForDuplicateConcreteType env modName id.idRange + if isModule then CheckForDuplicateModule env id.idText id.idRange // Now typecheck the signature, accumulating and then recording the submodule description. let id = ident (modName, id.idRange) @@ -15711,8 +15707,8 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let modAttrs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g true modAttrs - CheckForDuplicateConcreteType cenv env (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText) im - CheckForDuplicateModule cenv env id.idText id.idRange + CheckForDuplicateConcreteType env (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText) im + CheckForDuplicateModule env id.idText id.idRange let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent let! (topAttrsNew, _,ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)),_,envAtEnd = From 42d4c6d4c68be6541a3a151d4b2899b07baa7385 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 11 Mar 2016 22:52:16 +0000 Subject: [PATCH 058/334] correct F# extension members in mutrec --- src/fsharp/TypeChecker.fs | 352 +++++++++++++++++++------------------- 1 file changed, 180 insertions(+), 172 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 99fc3157b6b..dc1b156f837 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3839,21 +3839,19 @@ module MutRecShapes = MutRecShape.Module ((c,env2), ds2) | x -> x) - let rec recomputeEnvs f1 f2 (env: 'Env) xs = - let env2, xs2 = xs |> computeEnvs f1 f2 env - env2, xs2 |> mapModules (fun ((data,_oldEnv : 'Env),newEnv) -> (data,newEnv)) + let dropEnvs xs = xs |> mapModules fst - let rec expandTycons f1 xs = + let rec expandTycons f1 env xs = let preBinds, postBinds = xs |> List.map (fun elem -> match elem with - | MutRecShape.Tycon a -> f1 a + | MutRecShape.Tycon a -> f1 env a | _ -> [], []) |> List.unzip [MutRecShape.Lets (List.concat preBinds)] @ (xs |> List.map (fun elem -> match elem with - | MutRecShape.Module (c,d) -> MutRecShape.Module (c, expandTycons f1 d) + | MutRecShape.Module ((c,env2),d) -> MutRecShape.Module ((c,env2), expandTycons f1 env2 d) | _ -> elem)) @ [MutRecShape.Lets (List.concat postBinds)] @@ -3902,7 +3900,7 @@ type MutRecDefnsInitialData = MutRecShape list -type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK +type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * ParentRef * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK type MutRecDefnsPhase2DataForModule = MutRecDefnsPhase2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace type MutRecDefnsPhase2Data = MutRecShape list @@ -12323,7 +12321,7 @@ module MutRecBindingChecking = // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // Phase2A: also processes their arg patterns - collecting type assertions - let TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls : MutRecDefnsPhase2Info) = + let TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRec, mutRecDefns : MutRecDefnsPhase2Info) = // The basic iteration over the declarations in a single type definition // State: @@ -12333,7 +12331,7 @@ module MutRecBindingChecking = // uncheckedBindsRev: accumulation of unchecked bindings let (defnsAs: MutRecBindingsPhase2A), (tpenv,_,uncheckedBindsRev) = let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) - (initialOuterState, envMutRec, mutRecDecls) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defns -> + (initialOuterState, envMutRec, mutRecDefns) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defns -> let (tpenv,recBindIdx,uncheckedBindsRev) = outerState match defns with | MutRecShape.Module _ -> failwith "unreachable" @@ -12493,22 +12491,7 @@ module MutRecBindingChecking = let uncheckedRecBinds = List.rev uncheckedBindsRev - // Updates the types of the modules to contain the inferred contents to far - defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) - - let envMutRec, defnsAs = - (envMutRec, defnsAs) - ||> MutRecShapes.extendEnvs (fun envForDecls decls -> - let prelimRecValues = - decls |> List.collect (function - | MutRecShape.Tycon (TyconBindingsPhase2A(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues - | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] - | _ -> []) - let envForDeclsUpdated = AddLocalVals cenv.tcSink scopem prelimRecValues envForDecls - envForDeclsUpdated) - - (envMutRec, defnsAs, uncheckedRecBinds, tpenv) + (defnsAs, uncheckedRecBinds, tpenv) /// Phase2B: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. @@ -12758,7 +12741,7 @@ module MutRecBindingChecking = let vxbind = TcLetrecAdjustMemberForSpecialVals cenv generalizedBinding let pgbrind = FixupLetrecBind cenv denv generalizedTyparsForRecursiveBlock vxbind Phase2CMember pgbrind) - TyconBindingsPhase2C(tyconOpt, tcref,defnCs)) + TyconBindingsPhase2C(tyconOpt, tcref, defnCs)) // Phase2C: Fixup let bindings (fun bindIdxs -> @@ -12771,7 +12754,7 @@ module MutRecBindingChecking = // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPhase2C) = + let TcMutRecBindings_Phase2D_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPhase2C) = // let (fixupValueExprBinds, methodBinds) = (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPhase2C(tyconOpt, tcref,defnCs)) -> @@ -12909,23 +12892,69 @@ module MutRecBindingChecking = tyconOpt, memberBindsWithFixups,[]) + /// Compute the active environments within each nested module. + let TcMutRecDefns_ComputeEnvs (cenv: cenv) getTyconOpt scopem m envInitial mutRecShape = + (envInitial, mutRecShape) ||> MutRecShapes.computeEnvs + (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove decls -> + + let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) + let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) + let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) + + // Add the type definitions, modules and "open" declarations + let envForDecls = AddLocalTycons cenv.g cenv.amap scopem tycons envAbove + let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) + envForDecls) + /// Check the members and 'let' definitions in a mutually recursive group of definitions. - let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRec, mutRecDecls: MutRecDefnsPhase2Info) = + let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRecPrelimWithReprs: TcEnv, mutRecDefns: MutRecDefnsPhase2Info) = let g = cenv.g + let denv = envMutRecPrelimWithReprs.DisplayEnv - // TODO: This needs to be factored into each environment computation - // TESTING: Test cases where nested modules have C#-style extension members to check they are added to the - // correct environments. - let tcrefsWithCSharpExtensionMembers = - mutRecDecls |> MutRecShapes.topTycons |> List.choose (fun (MutRecDefnsPhase2InfoForTycon(_,tcref, _, declKind, _)) -> - if TyconRefHasAttribute g scopem g.attrib_ExtensionAttribute tcref && (declKind <> DeclKind.ExtrinsicExtensionBinding) then - Some tcref - else - None) // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // Phase2A: also processes their arg patterns - collecting type assertions - let (envMutRec, defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv scopem tpenv (envMutRec, mutRecDecls) + let (defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRecPrelimWithReprs, mutRecDefns) + + // Updates the types of the modules to contain the inferred contents to far, which includes values and members + defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + + // Updates the environments to include the values + // We must open all modules from scratch again because there may be extension methods and/or AutoOpen + let envMutRec, defnsAs = + (envInitial, MutRecShapes.dropEnvs defnsAs) + ||> TcMutRecDefns_ComputeEnvs cenv (fun (TyconBindingsPhase2A(tyconOpt,_,_,_,_,_,_)) -> tyconOpt) scopem scopem + ||> MutRecShapes.extendEnvs (fun envForDecls decls -> + + let prelimRecValues = + decls |> List.collect (function + | MutRecShape.Tycon (TyconBindingsPhase2A(_,_,prelimRecValues,_,_,_,_)) -> prelimRecValues + | MutRecShape.Lets binds -> [ for bind in binds -> bind.RecBindingInfo.Val ] + | _ -> []) + + let ctorVals = + decls |> MutRecShapes.topTycons |> List.collect (fun (TyconBindingsPhase2A(_, _, _, _, _, _, defnAs)) -> + [ for defnB in defnAs do + match defnB with + | Phase2AIncrClassCtor (incrClassCtorLhs) -> yield incrClassCtorLhs.InstanceCtorVal + | _ -> () ]) + + let tcrefsWithCSharpExtensionMembers = + decls |> MutRecShapes.topTycons |> List.choose (fun (TyconBindingsPhase2A(_, declKind, _, tcref, _, _, _)) -> + if TyconRefHasAttribute g scopem g.attrib_ExtensionAttribute tcref && (declKind <> DeclKind.ExtrinsicExtensionBinding) then Some tcref + else None) + + + let envForDeclsUpdated = + envForDecls + |> AddLocalVals cenv.tcSink scopem prelimRecValues + |> AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers + |> AddLocalVals cenv.tcSink scopem ctorVals + + envForDeclsUpdated) // Phase2B: type check pass, convert from ast to tast and collects type assertions, and generalize let defnsBs, generalizedRecBinds, tpenv = TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs, uncheckedRecBinds, scopem) @@ -12952,7 +12981,7 @@ module MutRecBindingChecking = for extraTypar in allExtraGeneralizableTypars do if Zset.memberOf freeInInitialEnv extraTypar then let ty = mkTyparTy extraTypar - error(Error(FSComp.SR.tcNotSufficientlyGenericBecauseOfScope(NicePrint.prettyStringOfTy envInitial.DisplayEnv ty),extraTypar.Range)) + error(Error(FSComp.SR.tcNotSufficientlyGenericBecauseOfScope(NicePrint.prettyStringOfTy denv ty),extraTypar.Range)) // Solve any type variables in any part of the overall type signature of the class whose // constraints involve generalized type variables. @@ -12993,50 +13022,34 @@ module MutRecBindingChecking = for tp in unsolvedTyparsForRecursiveBlockInvolvingGeneralizedVariables do //printfn "solving unsolvedTyparsInvolvingGeneralizedVariable : %s #%d" tp.DisplayName tp.Stamp if (tp.Rigidity <> TyparRigidity.Rigid) && not tp.IsSolved then - ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css envMutRec.DisplayEnv tp + ConstraintSolver.ChooseTyparSolutionAndSolve cenv.css denv tp // Now that we know what we've generalized we can adjust the recursive references - let defnsCs = TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (envMutRec.DisplayEnv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) + let defnsCs = TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (denv, defnsBs, generalizedTyparsForRecursiveBlock, generalizedRecBinds, scopem) // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let defnsDs = TcMutRecBindings_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (envMutRec.DisplayEnv, generalizedTyparsForRecursiveBlock, defnsCs) + let defnsDs = TcMutRecBindings_Phase2D_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs) - // INITIALIZATION GRAPHS - // let binds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm - + // Phase2E - rewrite values to initialization graphs + // // TODO: Note that this does initialization graphs in each type independently. let defnsEs = defnsDs |> MutRecShapes.map (fun (tyconOpt, fixupValueExprBinds, methodBinds) -> - let fixedBinds = EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm + let fixedBinds = EliminateInitializationGraphs cenv.g true denv fixupValueExprBinds bindsm tyconOpt, fixedBinds @ methodBinds) (fun (fixupValueExprBinds) -> - EliminateInitializationGraphs cenv.g true envInitial.DisplayEnv fixupValueExprBinds bindsm) + EliminateInitializationGraphs cenv.g true denv fixupValueExprBinds bindsm) id - // Post letrec env - // TODO: recompute env differently? - let envFinal = AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers envMutRec - let envFinal = - let ctorVals = - defnsBs |> MutRecShapes.topTycons |> List.collect (fun (TyconBindingsPhase2B(_tyconOpt, _tcref, defnBs)) -> - [ for defnB in defnBs do - match defnB with - | Phase2BIncrClassCtor (incrClassCtorLhs, _) -> yield incrClassCtorLhs.InstanceCtorVal - | _ -> () ]) - AddLocalVals cenv.tcSink scopem ctorVals envFinal + defnsEs,envMutRec - defnsEs,envFinal - -//------------------------------------------------------------------------- -// - -/// Check and establish the interface implementations, members, 'let' definitions in a mutually recursive group of definitions. -let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = +/// Check and generalize the interface implementations, members, 'let' definitions in a mutually recursive group of definitions. +let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = - let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) members |> List.collect (function | SynMemberDefn.Interface(ity,defnOpt,_) -> @@ -13069,7 +13082,7 @@ let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, | _ -> []) let interfaceMembersFromTypeDefn tyconMembersData (ity',defn,_) implTySet = - let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity',implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) defn |> List.choose (fun mem -> match mem with @@ -13082,7 +13095,7 @@ let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, try // Some preliminary checks mutRecDefns |> MutRecShapes.iterTycons (fun tyconData -> - let (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData + let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData let tcaug = tcref.TypeContents if tcaug.tcaug_closed && declKind <> ExtrinsicExtensionBinding then error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type",m)) @@ -13098,7 +13111,7 @@ let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, // The rest should have been removed by splitting, they belong to "core" (they are "shape" of type, not implementation) | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(),mem.Range)))) - let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = + let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) members |> List.choose (fun memb -> @@ -13123,7 +13136,7 @@ let TcMutRecDefns_Phase2 cenv envInitial parent bindsm scopem (envMutRec: TcEnv, let binds : MutRecDefnsPhase2Info = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> - let (MutRecDefnsPhase2DataForTycon(tyconOpt, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData + let (MutRecDefnsPhase2DataForTycon(tyconOpt, _, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData let ibinds = let intfTypes = interfacesFromTypeDefn envForDecls tyconData @@ -13629,8 +13642,8 @@ module TcExceptionDeclarations = let binds1,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) - let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] - let binds2,env = TcMutRecDefns_Phase2 cenv envInitial parent m scopem (envMutRec, defns) + let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] + let binds2,env = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env exnc @@ -14161,16 +14174,16 @@ module EstablishTypeDefinitionCores = // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDecls:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = + let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) // Publish the immediately declared interfaces. let tyconWithImplementsL = - (envMutRec, mutRecDecls) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> + (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore,_), Some (tycon, checkedAttrs) -> - let (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = tyconDefCore + | (typeDefCore,_,_), Some (tycon, checkedAttrs) -> + let (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = typeDefCore let m = tycon.Range let tcref = mkLocalTyconRef tycon let envinner = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envinner @@ -14826,58 +14839,58 @@ module EstablishTypeDefinitionCores = MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), innerParent - let TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = - // Phase 1A - build Entity for type definitions, exception definitions and module definitions. + // Phase1A - build Entity for type definitions, exception definitions and module definitions. // Also for abbreviations of any of these. Augmentations are skipped in this phase. let withEntities = typeDefCores |> MutRecShapes.mapWithParent parent - (fun innerParent modInfo -> TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial innerParent modInfo) - (fun innerParent ((tyconDefCore,_) as c) -> - let (MutRecDefnsPhase1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = tyconDefCore + // Do this for each module definition, building the initial Entity: + (fun innerParent modInfo -> + TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial innerParent modInfo) + + // Do this for each type definition, building the initial Tycon: + (fun innerParent (typeDefCore,tyconMemberInfo) -> + let (MutRecDefnsPhase1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = typeDefCore let tyconOpt = if isAtOriginalTyconDefn then - Some (TcTyconDefnCore_Phase1A_BuildInitialTycon cenv envInitial innerParent tyconDefCore) + Some (TcTyconDefnCore_Phase1A_BuildInitialTycon cenv envInitial innerParent typeDefCore) else None - c, tyconOpt) + (typeDefCore, tyconMemberInfo, innerParent), tyconOpt) + + // Do this for each 'let' definition (just package up the data, no processing) (fun innerParent synBinds -> let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) - // Compute the active environments at each nested module. + // Phase1AB - Publish modules + let envTmp, withEnvs = + (envInitial, withEntities) ||> MutRecShapes.computeEnvs + (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> + PublishModuleDefn cenv envAbove mspec + MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) + (fun envAbove _ -> envAbove) + + // Publish tycons + (envTmp, withEnvs) ||> MutRecShapes.iterTyconsWithEnv + (fun envAbove (_, tyconOpt) -> + tyconOpt |> Option.iter (fun tycon -> + // recheck these in case type is a duplicate in a mutually recursive set + CheckForDuplicateConcreteType envAbove tycon.LogicalName tycon.Range + CheckForDuplicateModule envAbove tycon.LogicalName tycon.Range + PublishTypeDefn cenv envAbove tycon)) + + // Phase1AB - Compute the active environments within each nested module. // // Add them to the environment, though this does not add the fields and // constructors (because we haven't established them yet). // We re-add them to the original environment later on. // We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles - see bug 952) - let envMutRec, withEnvs = - (envInitial, withEntities) ||> MutRecShapes.computeEnvs - (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) - (fun envAbove decls -> - - let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) - let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt) -> tyconOpt | _ -> None) - let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) - - for tycon in tycons do - // recheck these in case type is a duplicate in a mutually recursive set - CheckForDuplicateConcreteType envAbove tycon.LogicalName tycon.Range - CheckForDuplicateModule envAbove tycon.LogicalName tycon.Range - PublishTypeDefn cenv envAbove tycon - - for mspec in mspecs do - PublishModuleDefn cenv envAbove mspec - - // Add the type definitions, modules and "open" declarations - let envForDecls = (envAbove, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) - let envForDecls = AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls - let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) - envForDecls) + let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv snd scopem m // Updates the types of the modules to contain the inferred contents so far withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> @@ -14888,17 +14901,17 @@ module EstablishTypeDefinitionCores = // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. let withAttrs = - (envMutRec, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconOpt) -> + (envMutRecPrelim, withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconOpt) -> let res = match origInfo, tyconOpt with - | (tyconDefCore,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envForDecls tyconDefCore tycon) + | (typeDefCore,_,_), Some tycon -> Some (tycon,TcTyconDefnCore_Phase1B_EstablishBasicKind cenv inSig envForDecls typeDefCore tycon) | _ -> None origInfo, res) // Establish the abbreviations (no constraint checking, because constraints not yet established) - (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> + (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass tyconDefCore tycon attrs + | (typeDefCore, _,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass typeDefCore tycon attrs | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. @@ -14907,7 +14920,7 @@ module EstablishTypeDefinitionCores = CheckForCyclicAbbreviations tycons // Establish the super type and interfaces (no constraint checking, because constraints not yet established) - (envMutRec, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass + (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass // REVIEW: we should separate the checking for cyclic hierarchies and cyclic structs // REVIEW: this is because in some extreme cases the TcTyparConstraints call below could @@ -14921,27 +14934,27 @@ module EstablishTypeDefinitionCores = // Find all the field types in all the structrual types let tyconsWithStructuralTypes = - (envMutRec,withEnvs) + (envMutRecPrelim,withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with - | (typeDefCore,_), Some tycon -> Some (tycon,GetStructuralElementsOfTyconDefn cenv envForDecls tpenv typeDefCore tycon) + | (typeDefCore,_,_), Some tycon -> Some (tycon,GetStructuralElementsOfTyconDefn cenv envForDecls tpenv typeDefCore tycon) | _ -> None) |> MutRecShapes.collectTycons |> List.choose id - let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv envMutRec.DisplayEnv tyconsWithStructuralTypes - let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv envMutRec.DisplayEnv tyconsWithStructuralTypes + let scSet = TyconConstraintInference.InferSetOfTyconsSupportingComparable cenv envMutRecPrelim.DisplayEnv tyconsWithStructuralTypes + let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv envMutRecPrelim.DisplayEnv tyconsWithStructuralTypes - (envMutRec,withEnvs) + (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> tyconOpt |> Option.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv envForDecls scSet seSet)) // Check and publish the explicit constraints. let checkExplicitConstraints checkCxs = - (envMutRec,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> + (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> match origInfo, tyconOpt with - | (tyconDefCore,_), Some tycon -> - let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,_)) = tyconDefCore + | (typeDefCore,_,_), Some tycon -> + let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,_)) = typeDefCore let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls let thisTyconRef = mkLocalTyconRef tycon @@ -14953,27 +14966,27 @@ module EstablishTypeDefinitionCores = checkExplicitConstraints NoCheckCxs // No inferred constraints allowed on declared typars - (envMutRec,withEnvs) + (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m))) // OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) - (envMutRec, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> + (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (tyconDefCore, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass tyconDefCore tycon attrs + | (typeDefCore, _, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass typeDefCore tycon attrs | _ -> ()) - (envMutRec, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass + (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass checkExplicitConstraints CheckCxs // Now all the type parameters, abbreviations, constraints and kind information is established. // Now do the representations. Each baseValOpt is a residue from the representation which is potentially available when // checking the members. let withBaseValsAndSafeInitInfos = - (envMutRec,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> + (envMutRecPrelim,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> let info = match origInfo, tyconAndAttrsOpt with - | (tyconDefnCore,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envForDecls tpenv inSig tyconDefnCore tycon attrs + | (typeDefCore,_,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envForDecls tpenv inSig typeDefCore tycon attrs | _ -> None, NoSafeInitInfo (origInfo, Option.map fst tyconAndAttrsOpt, info)) @@ -14981,25 +14994,8 @@ module EstablishTypeDefinitionCores = // REVIEW: checking for cyclic inheritance is happening too late. See note above. CheckForCyclicStructsAndInheritance cenv tycons - // By now we've established the full contents of type definitions apart from their - // members and any fields determined by implicit construction. We know the kinds and - // representations of types and have established them as valid. - // - // We now reconstruct the active environments all over again - this will add the union cases and fields. - let envMutRec, withNewEnvs = - (envInitial, withBaseValsAndSafeInitInfos) - ||> MutRecShapes.recomputeEnvs - (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) - (fun envAbove decls -> - let tycons = decls |> List.choose (function MutRecShape.Tycon (_, tyconOpt, _) -> tyconOpt | _ -> None) - let mspecs = decls |> List.choose (function MutRecShape.Module ((MutRecDefnsPhase2DataForModule (_, mspec),_),_) -> Some mspec | _ -> None) - let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) - let envForDecls = (envAbove, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) - let envForDecls = AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls - let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) - envForDecls) - - (tycons, envMutRec, withNewEnvs) + + (tycons, envMutRecPrelim, withBaseValsAndSafeInitInfos) module TcDeclarations = begin @@ -15140,7 +15136,7 @@ module TcDeclarations = begin ///------ /// The tinfos arg are the enclosing types when processing nested types... /// The tinfos arg is not currently used... just stacked up. - let rec private SplitTyconDefn (_cenv:cenv) (TypeDefn(synTyconInfo,trepr,extraMembers,_)) = + let rec private SplitTyconDefn (TypeDefn(synTyconInfo,trepr,extraMembers,_)) = let implements1 = List.choose (function SynMemberDefn.Interface (ty,_,_) -> Some(ty,ty.Range) | _ -> None) extraMembers match trepr with | SynTypeDefnRepr.ObjectModel(kind,cspec,m) -> @@ -15251,8 +15247,6 @@ module TcDeclarations = begin preMembers @ postMembers - //let _a,b = SplitTyconDefns cenv (tinfos @ [synTyconInfo]) tycons - let isConcrete = members |> List.exists (function | SynMemberDefn.Member(Binding(_,_,_,_,_,_,SynValData(Some memberFlags,_,_),_,_,_,_,_),_) -> not memberFlags.IsDispatchSlot @@ -15303,40 +15297,54 @@ module TcDeclarations = begin let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) core, extraMembers - let SplitMutRecDefns cenv mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons (SplitTyconDefn cenv) + let SplitMutRecDefns mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn - let private PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = + let private PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv innerParent envMutRecPrelim (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo - let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envMutRec false tyDeclm typars cs longPath + let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envMutRecPrelim false tyDeclm typars cs longPath let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) // NewSlotsOK only on fsobjs if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclm)) - MutRecDefnsPhase2DataForTycon(tyconOpt, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) + MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) //------------------------------------------------------------------------- // Bind type definitions - main //------------------------------------------------------------------------- - let TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = + let TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = let inSig = false - let mutRecDefnsAfterSplit = SplitMutRecDefns cenv mutRecDefns - let tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) + let mutRecDefnsAfterSplit = SplitMutRecDefns mutRecDefns + let tycons, envMutRecPrelim, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) let mutRecDefnsAfterPrep = - mutRecDefnsAfterCore - |> MutRecShapes.mapTycons (fun ((typeDefnCore, members), tyconOpt, (baseValOpt, safeInitInfo)) -> + (envMutRecPrelim,mutRecDefnsAfterCore) + ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((typeDefnCore, members, innerParent), tyconOpt, (baseValOpt, safeInitInfo)) -> let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore - PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv envMutRec (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) + PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) - let withBindings,env = TcMutRecDefns_Phase2 cenv envInitial parent m scopem (envMutRec, mutRecDefnsAfterPrep) + // By now we've established the full contents of type definitions apart from their + // members and any fields determined by implicit construction. We know the kinds and + // representations of types and have established them as valid. + // + // We now reconstruct the active environments all over again - this will add the union cases and fields. + // + // Note: This environment reconstruction doesn't seem necessary. We're about to create Val's for all members, + // which does require type checking, but no more information than is already available. + let envMutRecPrelimWithReprs, withEnvs = + (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _)) -> tyconOpt) scopem m + + // Check the members and decide on representations for types with implicit constructors. + let withBindings,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRecPrelimWithReprs, withEnvs) + // Generate the hash/compare/equality bindings for all tycons. + // // Note: generating these bindings must come after generating the members, since some in the case of structs some fields // may be added by generating the implicit construction syntax let withExtraBindings = - withBindings |> MutRecShapes.expandTycons (fun (tyconOpt, _) -> + (envFinal,withBindings) ||> MutRecShapes.expandTycons (fun envForDecls (tyconOpt, _) -> match tyconOpt with | None -> [],[] | Some tycon -> @@ -15344,13 +15352,13 @@ module TcDeclarations = begin // equality bindings after because tha is the order they've always been generated // in, and there are code generation tests to check that. let binds = AddAugmentationDeclarations.AddGenericHashAndComparisonBindings cenv tycon - let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env tycon + let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv envForDecls tycon binds, binds3) // Check for cyclic structs and inheritance all over again, since we may have added some fields to the struct when generating the implicit construction syntax EstablishTypeDefinitionCores.CheckForCyclicStructsAndInheritance cenv tycons - withExtraBindings,env + withExtraBindings,envFinal //------------------------------------------------------------------------- @@ -15394,7 +15402,7 @@ module TcDeclarations = begin let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,false,None,m) let isAtOriginalTyconDefn = true - let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, repr,implements2@implements1,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,isAtOriginalTyconDefn) + let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isAtOriginalTyconDefn) tyconCore, (synTyconInfo,members@extraMembers) @@ -15407,14 +15415,14 @@ module TcDeclarations = begin | SynTypeDefnSigRepr.Simple(r,_) -> let isAtOriginalTyconDefn = true - let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false,isAtOriginalTyconDefn) + let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) tyconCore, (synTyconInfo,extraMembers) let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature - let private TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefns = + let private TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefns = // TODO - this is only checking the tycons in the signatures, need to do the module and let elements too - (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members)), _, _) -> + (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), _, _) -> let tpenv = emptyUnscopedTyparEnv let (MutRecDefnsPhase1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo @@ -15423,12 +15431,12 @@ module TcDeclarations = begin let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForDecls let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon tcref (declKind = ExtrinsicExtensionBinding) - TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(parent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) + TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(innerParent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) - let TcTyconSignatures cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = + let TcMutRecSignatureDecls cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) - let _ = TcTyconSignatureMemberSpecs cenv parent envMutRec mutRecDefnsAfterCore + let _ = TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefnsAfterCore envMutRec end @@ -15448,7 +15456,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = | SynModuleSigDecl.Types (typeSpecs,m) -> let scopem = unionRanges m endm let mutRecDefns = typeSpecs |> List.map MutRecShape.Tycon - let env = TcDeclarations.TcTyconSignatures cenv env parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) + let env = TcDeclarations.TcMutRecSignatureDecls cenv env parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) return env | SynModuleSigDecl.Open (mp,m) -> @@ -15660,7 +15668,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu | SynModuleDecl.Types (typeDefs,m) -> let scopem = unionRanges m scopem let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon - let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefns cenv env parent tpenv (mutRecDefns, m, scopem) + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent tpenv (mutRecDefns, m, scopem) // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = TcMutRecDefnsEscapeCheck mutRecDefnsChecked env @@ -15862,7 +15870,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu loop (match parent with ParentNone -> true | Parent _ -> false) defs let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions - let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefns cenv envInitial parent tpenv (mutRecDefns,m,scopem) + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns,m,scopem) // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial From 6cc3637f7a0e6f327661d66d34a5ce1231ebc324 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 12 Mar 2016 00:19:26 +0000 Subject: [PATCH 059/334] correct exception constructors in mutrec --- src/fsharp/TypeChecker.fs | 54 +++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index dc1b156f837..9e13b9d0730 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -392,7 +392,7 @@ let AddLocalVal tcSink scopem v env = CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) env -let AddLocalExnDefn tcSink scopem (exnc:Tycon) env = +let AddLocalExnDefnAndReport tcSink scopem (exnc:Tycon) env = let env = ModifyNameResEnv (fun nenv -> AddExceptionDeclsToNameEnv BulkAdd.No nenv (mkLocalEntityRef exnc)) env (* Also make VisualStudio think there is an identifier in scope at the range of the identifier text of its binding location *) CallEnvSink tcSink (exnc.Range,env.NameEnv,env.eAccessRights) @@ -400,10 +400,10 @@ let AddLocalExnDefn tcSink scopem (exnc:Tycon) env = env let AddLocalTyconRefs ownDefinition g amap m tcrefs env = - ModifyNameResEnv (fun nenv -> AddTyconRefsToNameEnv BulkAdd.No ownDefinition g amap m false nenv tcrefs) env + env |> ModifyNameResEnv (fun nenv -> AddTyconRefsToNameEnv BulkAdd.No ownDefinition g amap m false nenv tcrefs) let AddLocalTycons g amap m (tycons: Tycon list) env = - AddLocalTyconRefs false g amap m (List.map mkLocalTyconRef tycons) env + env |> AddLocalTyconRefs false g amap m (List.map mkLocalTyconRef tycons) let AddLocalTyconsAndReport tcSink g amap scopem tycons env = let env = AddLocalTycons g amap scopem tycons env @@ -451,7 +451,7 @@ let AddModuleAbbreviation tcSink scopem id modrefs env = CallNameResolutionSink tcSink (id.idRange,env.NameEnv,item,item,ItemOccurence.Use,env.DisplayEnv,env.eAccessRights) env -let AddLocalSubModule tcSink g amap m scopem env (modul:ModuleOrNamespace) = +let AddLocalSubModuleAndReport tcSink g amap m scopem env (modul:ModuleOrNamespace) = let env = ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights nenv (mkLocalModRef modul)) env let env = {env with eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems} CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) @@ -12356,9 +12356,7 @@ module MutRecBindingChecking = // Re-add the type constructor to make it take precedence for record label field resolutions // This does not apply to extension members: in those cases the relationship between the record labels // and the type is too extruded - let envForTycon = - if isExtrinsic then envForTycon - else AddLocalTyconRefs true cenv.g cenv.amap tcref.Range [tcref] envForTycon + let envForTycon = if isExtrinsic then envForTycon else AddLocalTyconRefs true cenv.g cenv.amap tcref.Range [tcref] envForTycon // Make fresh version of the class type for type checking the members and lets * let _,copyOfTyconTypars,_,objTy,thisTy = FreshenObjectArgType cenv tcref.Range TyparRigidity.WillBeRigid tcref isExtrinsic declaredTyconTypars @@ -12893,7 +12891,7 @@ module MutRecBindingChecking = /// Compute the active environments within each nested module. - let TcMutRecDefns_ComputeEnvs (cenv: cenv) getTyconOpt scopem m envInitial mutRecShape = + let TcMutRecDefns_ComputeEnvs (cenv: cenv) report getTyconOpt scopem m envInitial mutRecShape = (envInitial, mutRecShape) ||> MutRecShapes.computeEnvs (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> @@ -12902,9 +12900,10 @@ module MutRecBindingChecking = let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) - // Add the type definitions, modules and "open" declarations - let envForDecls = AddLocalTycons cenv.g cenv.amap scopem tycons envAbove - let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem) + // Add the type definitions, exceptions, modules and "open" declarations + let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envAbove else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) + let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) envForDecls) @@ -12926,7 +12925,7 @@ module MutRecBindingChecking = // We must open all modules from scratch again because there may be extension methods and/or AutoOpen let envMutRec, defnsAs = (envInitial, MutRecShapes.dropEnvs defnsAs) - ||> TcMutRecDefns_ComputeEnvs cenv (fun (TyconBindingsPhase2A(tyconOpt,_,_,_,_,_,_)) -> tyconOpt) scopem scopem + ||> TcMutRecDefns_ComputeEnvs cenv false (fun (TyconBindingsPhase2A(tyconOpt,_,_,_,_,_,_)) -> tyconOpt) scopem scopem ||> MutRecShapes.extendEnvs (fun envForDecls decls -> let prelimRecValues = @@ -12942,16 +12941,9 @@ module MutRecBindingChecking = | Phase2AIncrClassCtor (incrClassCtorLhs) -> yield incrClassCtorLhs.InstanceCtorVal | _ -> () ]) - let tcrefsWithCSharpExtensionMembers = - decls |> MutRecShapes.topTycons |> List.choose (fun (TyconBindingsPhase2A(_, declKind, _, tcref, _, _, _)) -> - if TyconRefHasAttribute g scopem g.attrib_ExtensionAttribute tcref && (declKind <> DeclKind.ExtrinsicExtensionBinding) then Some tcref - else None) - - let envForDeclsUpdated = envForDecls |> AddLocalVals cenv.tcSink scopem prelimRecValues - |> AddLocalTyconRefs false g cenv.amap scopem tcrefsWithCSharpExtensionMembers |> AddLocalVals cenv.tcSink scopem ctorVals envForDeclsUpdated) @@ -13003,7 +12995,7 @@ module MutRecBindingChecking = () ] //printfn "allTypes.Length = %d" allTypes.Length - let unsolvedTypars = freeInTypesLeftToRight cenv.g true allTypes + let unsolvedTypars = freeInTypesLeftToRight g true allTypes //printfn "unsolvedTypars.Length = %d" unsolvedTypars.Length //for x in unsolvedTypars do // printfn "unsolvedTypar : %s #%d" x.DisplayName x.Stamp @@ -13038,10 +13030,10 @@ module MutRecBindingChecking = let defnsEs = defnsDs |> MutRecShapes.map (fun (tyconOpt, fixupValueExprBinds, methodBinds) -> - let fixedBinds = EliminateInitializationGraphs cenv.g true denv fixupValueExprBinds bindsm + let fixedBinds = EliminateInitializationGraphs g true denv fixupValueExprBinds bindsm tyconOpt, fixedBinds @ methodBinds) (fun (fixupValueExprBinds) -> - EliminateInitializationGraphs cenv.g true denv fixupValueExprBinds bindsm) + EliminateInitializationGraphs g true denv fixupValueExprBinds bindsm) id defnsEs,envMutRec @@ -13640,18 +13632,18 @@ module TcExceptionDeclarations = let TcExnDefn cenv envInitial parent (SynExceptionDefn(core,aug,m),scopem) = let binds1,exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) + let envMutRec = AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] - let binds2,env = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) + let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type - let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv env exnc - binds1 @ binds2flat @ binds3,exnc,env + let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv envFinal exnc + binds1 @ binds2flat @ binds3,exnc,envFinal let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core,aug,_),scopem) = let binds,exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefn cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let ecref = mkLocalEntityRef exnc let vals,_ = TcTyconMemberSpecs cenv envMutRec (ContainerInfo(parent,Some(MemberOrValContainerInfo(ecref,None,None,NoSafeInitInfo,[])))) ModuleOrMemberBinding tpenv aug binds,vals,ecref,envMutRec @@ -14890,7 +14882,7 @@ module EstablishTypeDefinitionCores = // We re-add them to the original environment later on. // We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles - see bug 952) - let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv snd scopem m + let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv false snd scopem m // Updates the types of the modules to contain the inferred contents so far withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> @@ -15334,7 +15326,7 @@ module TcDeclarations = begin // Note: This environment reconstruction doesn't seem necessary. We're about to create Val's for all members, // which does require type checking, but no more information than is already available. let envMutRecPrelimWithReprs, withEnvs = - (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _)) -> tyconOpt) scopem m + (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv true (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _)) -> tyconOpt) scopem m // Check the members and decide on representations for types with implicit constructors. let withBindings,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRecPrelimWithReprs, withEnvs) @@ -15481,7 +15473,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,true,mdefs,xml,attribs,vis,m) let scopem = unionRanges m endm PublishModuleDefn cenv env mspec; - let env = AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem env mspec + let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec return env | SynModuleSigDecl.ModuleAbbrev (id,p,m) -> @@ -15725,7 +15717,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let mspec = mspecPriorToOuterOrExplicitSig let mdef = TMDefRec([],FlatList.empty,[ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)],m) PublishModuleDefn cenv env mspec - let env = AddLocalSubModule cenv.tcSink cenv.g cenv.amap m scopem env mspec + let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec // isContinuingModule is true for all of the following // - the implicit module of a script From 6fc9d8a14767c7dd1000d911f54f7a5075145a8d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 13 Mar 2016 16:03:42 -0700 Subject: [PATCH 060/334] Removed ctofiles --- .../ctofiles/MenusAndCommands.cto | Bin 4456 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto b/vsintegration/src/FSharp.ProjectSystem.FSharp/ctofiles/MenusAndCommands.cto deleted file mode 100644 index 6ae7e514a9ddfa1178a52ec41dfd1bd0cc60d95b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4456 zcmYjVX*|@6_x}3M7_%5N7-4KgA%I%kuo13h^d;kCY;`h8b=RD{0InQ%mofn5@NAnN|0Dxo*0Jy*NKTz)5 zc>E7{O@6CRk_Lcib}ajDF}L_)aZw|e+br48i0Zw|MfGxfYX*cUUUl(Bc5&9-4E7Ul zQAtU4GnZS;F3qTBv*8(RZbn0Ye{*wxA5z%d$Q3mTMLdMC0T6MUg^i*bVRN(OKwnd1 zA0Wv?A#3h7^$G{tP<_J2YHo9hBv07i&+TgyW~Udm_3#ii!9D-K9^lz~83+fMKAzlg zfb)0H_C`@nNnJ`$J;-%-C+>g@R2VCCdDjjaBJn5O=2$l z<_!J56%?M8@Ry12#WsRBWSmTk7sH($P4$HK2+#GfJ3lP@jh7x8PpI}3Y;BbWzS}_j zQd|Z@pB~emX&stEOudXjm~Q9!*!7*(&+FxC<%&rj^JXPqu)GRCGih+l7q&kJDY7Q2 zKt>-BtIG_J@{rad zwoECuSXMB%)j-ny@${o z-Xq^|ygBmL@{P&V+nkh;-%nd1!qfk7eDywg_pcKfflsw$6u<8tit4Z2TixnRH0>_> zQBtidhu~Du9Se2{_gHpFjnsIotzY<(IJ@7h@~QDvyY0y#t99^kZ0b+XI{{hcu3ef5 zdWl*Y6Q}|w)r`%~BVx{jnu#SjKBS#j=UpBc+um7R`E>4l@+QY;?Bj05znUjXZ`7x6 z9Dl3ZJ$=O@X#9)FTw|@w|Lo~d7{b>sCxYZ(>DjT_xzm#- zLn4Ps|7+&13HeX9SfV#Pv`ea+p{=1-{@3ez9XW1`J*($UT?!s&1YYd0dEBpkWHx7j zh$xbKlePbT>g?l>fkPV$KU@Fc-q>!AXT@GBVfbGQ4Sl<3r~j}R%fGW~>#w}511;9e z?zc?eO(?}T)UM=}JZ|G!`e`$z@}v;eUAwH3$7-8eyRThpyn|U!J{mY{s*P@$)sf%K zKHo<|M9Wx@D0~SdKQN-?#u4sGl+A>6o((|-3 z$E%Y5i*j=xZm4Ae3;1ND)j*e~;4(H^=1o$3y2hY2zDkGRyXq~H($@Obwe6DI?jd(} zS4I_6Io0A<^y?bm7Tx;c^2gP+LFSqE=lz44Y`L$%TjNL6Uxuli8Vsw*T@8IX=#vv` zq3oi?b$xeTZKjB_yG(v197pr-?+tsQ;hHe`xqj8q{_8Vo&2lWHfDQD<%j$a#FG1m> z>e2P9Dt6s9GB$H2evqCW8sBZK0&Ke!H6ZK0K$I7CDQVncN*`wS6etV zRIkqZQBN23;?yBCSqUrT={+BJTAz8UHC^}Ax>N1U*7E5h!8YPucFR_bXR=ay529yQnBJ5h-l}<$H~!SU=$T8TnXX;(puX-PZ21N45!%?`!pvrRY%_So(4x@5 zCQ1rQK2NlIi)auNH=JDn?+rA6zXmmb>wISHnt_{v@hUnssFYG_hcEe{UNU{-cGmaj z&9Oprz4^hoKI4_4y(h!QEF19h_tN~W&lF4*=sZk)B%xC%c(`DExu|OL$It#wd#~>f zM(UsU{n_IVwO9I$cCZ6xpg*TPfBkH%xm3i9?x$NtUqZgrUR`_p;kAicT2pnCY%SX2 zL~Vyso>OCZPviu2{MB1#S7OBev$U|oKh`HIJzuQ9);}A2Oo$Hs?cOhY!Hm)|){xoP z(x+3px2LGb2C{Un1S};P$M|hK1u$H@-MyZ9UVN={Sl-$4O9G}y4(_C%GEt$Ti7L30 z_h3u%Ueol^%HN&$sU-?ePi}e|e+cw``)Fla*>$hPe|qvNpBr3F`PFJGKEpTpkA8!J zH$Q%~*w(z&RgjD{6KD|c+Kv$j=2t=+wtWR0QgHbk6;R>$^X(WWYH|XXOCv1?T{jDJnLhu9e_Z6i-)t)@J+dbA+MSnF2Xh`~? zRVhMHW-#^Ox%qY0(RRB&4@T#UN%HNMt@3l#g=P0WU$#nq&sT`N7t-k0pwkf}C6$@r zM$rsAHF0p%^`O@uJoiWKGF_`>K}Dl(LR7^Gzr?C;m1qMud%kOHfsuzlOG0xW`bGky z0)tn=Bb`7er<@>$78(n(B*f4#Tt^C?nbweX*$bePh&WX!3C}=c@E~5?xYC!NG7K={ zq=$pZL@PWzh{VIG;u$2Is>Z*8sH(AazzA8lyd%z9r)p+kIZ9HwShaYj2;u3&NSG_0 zsRI1NX`{S*TD|#2EW3lzH?cNfM}kgfDr~`t z7;!Lpw#_Mt2Pz1VEFJ_Hm-!usG^!G~Q=EIUz-FmkZq%8L<4P6?&giSQp z7Y@%z#Pi?sPI%a)c}cK>{4Ad@_``G|7QxqJ6Z-v+RI#HsCZC5YbI+ z47r~f(8*2YADi|EWN>yTK~TYmg@dXS&~tqd5(VBHug=Ea?lHxJ#~TjZ8>Xm5k-siU zG+)YCwClu+n~NI0Fa)9bsr%!B_Sq9^aSc~cyNQ6 z#Nr#{{aNzVF};$?0_#8QzuCS=rmP{t;e@FSFJPQ(mqJA17Z}j*LC6!^`*0t|!9F5L z6L3-pih}z9gzo#dA{8ZrA|YP}0UrnepLZAYi*!pD(DfG>xxzF^I0{2@1SBg%a6mm4 z%u01*q8!T!ZG7GsW*1d^2CPu)*>v~u84 zGKOEu^-JVqHD*A_MIA9!QdqAXH9P|B)hxU5B$+-LOCzWD=OEvkAi` znW-7+8^sJ6Qp9pOrCf+3wYwcvE^1>*fu}j?7a>>C?vIpNNGjH57Z&N;)z&&KhEYZl zX4qKrSYkOqX1)oeA%3?#E}0Dm@O;TT?OEhU8->f#fIrlL210;j=)o>&>d_A(SB+M3 z&rKax^%mJfW(2T7NtGc3IsNA$V(<;Q9g$EFAiN^h5r$>=f(V!#fjE%$)SX8lMM!{a zpei^!+ev}>gu179=C66$sT+ah#&j{BZ)XzvZKuHD6Bf>wsyX*Z@?Qqtl@wMV8VXTI z>Ry-7m|~#j6&NDyFx_NUA8A$-OBsDPy9SFdwGs)i+;6yDz3}pK-K^_O} z2f1Sm(?ZRQ^Ko9jd>#mb{FfXmkH_QtYx%*XUN3tcr z9qbhiaq{2C*aEh(niMTAPK7YjY&hyWDPj^c9V8qPDoA1wF+a%25P3I>kB*xZWe+;o z1FsZBbc#&zz|2x;G}oKa*I4{3a;i}zT<6|QYD#?y0g~2X!y)YC4nb6HNVp2Uon7sO z2o?m12Jvhv#haQ887>s)*(4Ko9(n-*3^dv~J1D-84l*3>ra(tA$PyMlK}0t=9l~H> z7~%Y3^+jx|Jm+KCjGEp(ih(`fy%^-zXJXU2G&PWxnj?=#TH}ZU3nGSaZkSPq<-mAM zi3@E|C{a?tA}TfbLG|irEiBRSHf5yAP}J@BCaWxQE3e zS}^+f$HV#O#|lr*k|qNyf;qMM)9amCR3VX^4{s4Y33Gx-Vo0@N{gEn a`;u&|FrG4FPehcaQe%Jv|MNWfxBM@zm7vN1 From 62ce9bdd8bbcbd097da11b2340e96597ec38829b Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 13 Mar 2016 19:13:55 -0700 Subject: [PATCH 061/334] Small cleanup for isRefTy --- src/fsharp/TastOps.fs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index df1f4440a52..bb27ca77d8f 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1552,21 +1552,22 @@ let isClassTy g ty = | ILTypeMetadata (_,td) -> (td.tdKind = ILTypeDefKind.Class) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> isFSharpClassTy g ty -let isStructTy g ty = - (isAppTy g ty && (tyconOfAppTy g ty).IsStructOrEnumTycon) || isTupleStructTy g ty +let isStructOrEnumTyconTy g ty = isAppTy g ty && (tyconOfAppTy g ty).IsStructOrEnumTycon + +let isStructTy g ty = isStructOrEnumTyconTy g ty let isRefTy g ty = - not (isStructTy g ty) && - ( - isUnionTy g ty || - isTupleTy g ty || - isRecdTy g ty || - isILReferenceTy g ty || - isFunTy g ty || - isReprHiddenTy g ty || - isFSharpObjModelRefTy g ty || - isUnitTy g ty - ) + not (isStructOrEnumTyconTy g ty) && + ( + isUnionTy g ty || + isTupleTy g ty || + isRecdTy g ty || + isILReferenceTy g ty || + isFunTy g ty || + isReprHiddenTy g ty || + isFSharpObjModelRefTy g ty || + isUnitTy g ty + ) // ECMA C# LANGUAGE SPECIFICATION, 27.2 // An unmanaged-type is any type that isn't a reference-type, a type-parameter, or a generic struct-type and From 8cc233ec78294359f5307fe29441c954010bb361 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 14 Mar 2016 17:50:06 +0000 Subject: [PATCH 062/334] updates to mutrec for exception abbreviations --- src/fsharp/TypeChecker.fs | 86 +++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 9e13b9d0730..701ceda559b 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13632,7 +13632,7 @@ module TcExceptionDeclarations = let TcExnDefn cenv envInitial parent (SynExceptionDefn(core,aug,m),scopem) = let binds1,exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) @@ -13769,6 +13769,10 @@ module EstablishTypeDefinitionCores = for (Field(_,_,_,ty,_,_,_,m)) in fields do let ty',_ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty yield (ty',m) + + //| SynTypeDefnSimpleRepr.Exception (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = + // let structuralTypes = args' |> List.map (fun rf -> (rf.FormalType, rf.Range)) + | _ -> () ] @@ -14831,6 +14835,21 @@ module EstablishTypeDefinitionCores = MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), innerParent + // Interlude between Phase1D and Phase1E - Check and publish the explicit constraints. + let TcMutRecDefns_CheckExplicitConstraints cenv tpenv m checkCxs envMutRecPrelim withEnvs = + (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> + match origInfo, tyconOpt with + | (typeDefCore,_,_), Some (tycon:Tycon) -> + let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,_)) = typeDefCore + let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls + let thisTyconRef = mkLocalTyconRef tycon + let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon thisTyconRef false + try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore + with e -> errorRecovery e m + | _ -> ()) + + let TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = // Phase1A - build Entity for type definitions, exception definitions and module definitions. @@ -14877,11 +14896,9 @@ module EstablishTypeDefinitionCores = // Phase1AB - Compute the active environments within each nested module. // - // Add them to the environment, though this does not add the fields and - // constructors (because we haven't established them yet). - // We re-add them to the original environment later on. - // We don't report them to the Language Service yet as we don't know if - // they are well-formed (e.g. free of abbreviation cycles - see bug 952) + // Add the types to the environment. This does not add the fields and union cases (because we haven't established them yet). + // We re-add them to the original environment later on. We don't report them to the Language Service yet as we don't know if + // they are well-formed (e.g. free of abbreviation cycles) let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv false snd scopem m // Updates the types of the modules to contain the inferred contents so far @@ -14889,7 +14906,7 @@ module EstablishTypeDefinitionCores = mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) - // Establish the kind of each type constructor + // Phase 1B. Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. let withAttrs = @@ -14900,7 +14917,7 @@ module EstablishTypeDefinitionCores = | _ -> None origInfo, res) - // Establish the abbreviations (no constraint checking, because constraints not yet established) + // Phase 1C. Establish the abbreviations (no constraint checking, because constraints not yet established) (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (typeDefCore, _,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass typeDefCore tycon attrs @@ -14911,20 +14928,14 @@ module EstablishTypeDefinitionCores = CheckForCyclicAbbreviations tycons - // Establish the super type and interfaces (no constraint checking, because constraints not yet established) + // Phase 1D. Establish the super type and interfaces (no constraint checking, because constraints not yet established) (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass - // REVIEW: we should separate the checking for cyclic hierarchies and cyclic structs - // REVIEW: this is because in some extreme cases the TcTyparConstraints call below could - // exercise a cyclic hierarchy (and thus not terminate) before the cycle checking has been - // performed. Likewise operations in phases 3-6 could also exercise a cyclic hierarchy - - // Add the interface and member declarations for hash/compare. Because this adds interfaces, this may let constraints + // Interlude between Phase1D and Phase1E - Add the interface and member declarations for + // hash/compare. Because this adds interfaces, this may let constraints // be satisfied, so we have to do this prior to checking any constraints. - - - - // Find all the field types in all the structrual types + // + // First find all the field types in all the structrual types let tyconsWithStructuralTypes = (envMutRecPrelim,withEnvs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> @@ -14941,36 +14952,32 @@ module EstablishTypeDefinitionCores = ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> tyconOpt |> Option.iter (AddAugmentationDeclarations.AddGenericHashAndComparisonDeclarations cenv envForDecls scSet seSet)) - // Check and publish the explicit constraints. - let checkExplicitConstraints checkCxs = - (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo, tyconOpt) -> - match origInfo, tyconOpt with - | (typeDefCore,_,_), Some tycon -> - let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,_)) = typeDefCore - let (ComponentInfo(_,_, synTyconConstraints,_,_,_, _,_)) = synTyconInfo - let envForTycon = AddDeclaredTypars CheckForDuplicateTypars (tycon.Typars(m)) envForDecls - let thisTyconRef = mkLocalTyconRef tycon - let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon thisTyconRef false - try TcTyparConstraints cenv NoNewTypars checkCxs ItemOccurence.UseInType envForTycon tpenv synTyconConstraints |> ignore - with e -> errorRecovery e m - | _ -> ()) - - checkExplicitConstraints NoCheckCxs + TcMutRecDefns_CheckExplicitConstraints cenv tpenv m NoCheckCxs envMutRecPrelim withEnvs // No inferred constraints allowed on declared typars - (envMutRecPrelim,withEnvs) - ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> - tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m))) + (envMutRecPrelim,withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (_, tyconOpt) -> + tyconOpt |> Option.iter (fun tycon -> tycon.Typars(m) |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m))) - // OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) + // Phase1E. OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with | (typeDefCore, _, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass typeDefCore tycon attrs | _ -> ()) + // Phase1F. Establish inheritance hierarchy (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig SecondPass - checkExplicitConstraints CheckCxs + TcMutRecDefns_CheckExplicitConstraints cenv tpenv m CheckCxs envMutRecPrelim withEnvs + + // Add exception definitions to the environments, which are used for checking exception abbreviations in representations + let envMutRecPrelim, withAttrs = + (envMutRecPrelim, withAttrs) + ||> MutRecShapes.extendEnvs (fun envForDecls decls -> + let tycons = decls |> List.choose (function MutRecShape.Tycon (_, Some (tycon,_)) -> Some tycon | _ -> None) + let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) + envForDecls) + + // Phase1G. Establish inheritance hierarchy // Now all the type parameters, abbreviations, constraints and kind information is established. // Now do the representations. Each baseValOpt is a residue from the representation which is potentially available when // checking the members. @@ -15413,6 +15420,7 @@ module TcDeclarations = begin let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let private TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefns = + // TODO - need to collect the mutually recursive signature declarations when "rec" is used // TODO - this is only checking the tycons in the signatures, need to do the module and let elements too (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), _, _) -> let tpenv = emptyUnscopedTyparEnv From 9aef58b0999035c666b26aa8f4551c8480a00050 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Mar 2016 11:18:19 +0000 Subject: [PATCH 063/334] correct initialization order for mutrec modules + let --- src/fsharp/FindUnsolved.fs | 8 +- src/fsharp/IlxGen.fs | 32 ++++---- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 16 ++-- src/fsharp/NicePrint.fs | 14 ++-- src/fsharp/Optimizer.fs | 53 +++++++------ src/fsharp/PostInferenceChecks.fs | 29 +++++--- src/fsharp/TastOps.fs | 91 +++++++++++++++-------- src/fsharp/TastOps.fsi | 2 + src/fsharp/TypeChecker.fs | 26 ++++--- src/fsharp/tast.fs | 9 ++- 10 files changed, 170 insertions(+), 110 deletions(-) diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index f682746abc9..9fcd10d7885 100644 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -231,16 +231,18 @@ and accModuleOrNamespaceDefs cenv env x = List.iter (accModuleOrNamespaceDef cen and accModuleOrNamespaceDef cenv env x = match x with - | TMDefRec(tycons,binds,mbinds,_m) -> + | TMDefRec(tycons,mbinds,_m) -> accTycons cenv env tycons; - accBinds cenv env binds; accModuleOrNamespaceBinds cenv env mbinds | TMDefLet(bind,_m) -> accBind cenv env bind | TMDefDo(e,_m) -> accExpr cenv env e | TMAbstract(def) -> accModuleOrNamespaceExpr cenv env def | TMDefs(defs) -> accModuleOrNamespaceDefs cenv env defs and accModuleOrNamespaceBinds cenv env xs = List.iter (accModuleOrNamespaceBind cenv env) xs -and accModuleOrNamespaceBind cenv env (ModuleOrNamespaceBinding(mspec, rhs)) = accTycon cenv env mspec; accModuleOrNamespaceDef cenv env rhs +and accModuleOrNamespaceBind cenv env x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> accBind cenv env bind + | ModuleOrNamespaceBinding.Module(mspec, rhs) -> accTycon cenv env mspec; accModuleOrNamespaceDef cenv env rhs let UnsolvedTyparsOfModuleDef g amap denv (mdef, extraAttribs) = let cenv = diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index f57d8b7a8bf..9a08eaff465 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -967,11 +967,10 @@ let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = and AddBindingsForModuleDef allocVal cloc eenv x = match x with - | TMDefRec(tycons,vbinds,mbinds,_) -> - let eenv = FlatList.foldBack (allocVal cloc) (valsOfBinds vbinds) eenv + | TMDefRec(tycons,mbinds,_) -> (* Virtual don't have 'let' bindings and must be added to the environment *) let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv - let eenv = List.foldBack (AddBindingsForSubModules allocVal cloc) mbinds eenv + let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv eenv | TMDefLet(bind,_) -> allocVal cloc bind.Var eenv @@ -982,12 +981,16 @@ and AddBindingsForModuleDef allocVal cloc eenv x = | TMDefs(mdefs) -> AddBindingsForModuleDefs allocVal cloc eenv mdefs -and AddBindingsForSubModules allocVal cloc (ModuleOrNamespaceBinding(mspec, mdef)) eenv = - let cloc = - if mspec.IsNamespace then cloc - else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec +and AddBindingsForModule allocVal cloc x eenv = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + allocVal cloc bind.Var eenv + | ModuleOrNamespaceBinding.Module (mspec, mdef) -> + let cloc = + if mspec.IsNamespace then cloc + else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec - AddBindingsForModuleDef allocVal cloc eenv mdef + AddBindingsForModuleDef allocVal cloc eenv mdef and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = FlatList.foldBack allocVal vs eenv @@ -5647,13 +5650,12 @@ and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = match x with - | TMDefRec(tycons,binds,mbinds,m) -> + | TMDefRec(tycons,mbinds,m) -> tycons |> List.iter (fun tc -> if tc.IsExceptionDecl then GenExnDef cenv cgbuf.mgbuf eenv m tc - else GenTypeDef cenv cgbuf.mgbuf lazyInitInfo eenv m tc) ; - GenLetRecBinds cenv cgbuf eenv (binds,m); - mbinds |> List.iter (GenModuleBinding cenv cgbuf qname lazyInitInfo eenv) + else GenTypeDef cenv cgbuf.mgbuf lazyInitInfo eenv m tc) + mbinds |> List.iter (GenModuleBinding cenv cgbuf qname lazyInitInfo eenv m) | TMDefLet(bind,_) -> GenBindings cenv cgbuf eenv (FlatList.one bind) @@ -5669,7 +5671,11 @@ and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = // Generate a module binding -and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazyInitInfo eenv (ModuleOrNamespaceBinding (mspec, mdef)) = +and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazyInitInfo eenv m x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + GenLetRecBinds cenv cgbuf eenv ([bind],m); + | ModuleOrNamespaceBinding.Module (mspec, mdef) -> let hidden = IsHiddenTycon eenv.sigToImplRemapInfo mspec let eenvinner = diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index 7495270e0ea..9e73276f794 100644 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -1286,10 +1286,9 @@ module Pass4_RewriteAssembly = and TransModuleDefs penv z x = List.foldMap (TransModuleDef penv) z x and TransModuleDef penv (z: RewriteState) x = match x with - | TMDefRec(tycons,binds,mbinds,m) -> - let z,binds = TransValBindings penv z binds + | TMDefRec(tycons,mbinds,m) -> let z,mbinds = TransModuleBindings penv z mbinds - z,TMDefRec(tycons,binds,mbinds,m) + z,TMDefRec(tycons,mbinds,m) | TMDefLet(bind,m) -> let z,bind = TransValBinding penv z bind z,TMDefLet(bind,m) @@ -1303,9 +1302,14 @@ module Pass4_RewriteAssembly = let z,mexpr = TransModuleExpr penv z mexpr z,TMAbstract(mexpr) and TransModuleBindings penv z binds = List.foldMap (TransModuleBinding penv) z binds - and TransModuleBinding penv z (ModuleOrNamespaceBinding(nm, rhs)) = - let z,rhs = TransModuleDef penv z rhs - z,ModuleOrNamespaceBinding(nm,rhs) + and TransModuleBinding penv z x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + let z,bind = TransValBinding penv z bind + z,ModuleOrNamespaceBinding.Binding bind + | ModuleOrNamespaceBinding.Module(nm, rhs) -> + let z,rhs = TransModuleDef penv z rhs + z,ModuleOrNamespaceBinding.Module(nm,rhs) let TransImplFile penv z mv = fmapTImplFile (TransModuleExpr penv) z mv diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 0705d0eeae2..96682180598 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -1742,8 +1742,8 @@ module private InferredSigPrinting = let rec isConcreteNamespace x = match x with - | TMDefRec(tycons,binds,mbinds,_) -> - nonNil tycons || not (FlatList.isEmpty binds) || (mbinds |> List.exists (fun (ModuleOrNamespaceBinding(x,_)) -> not x.IsNamespace)) + | TMDefRec(tycons,mbinds,_) -> + nonNil tycons || (mbinds |> List.exists (function ModuleOrNamespaceBinding.Binding _ -> true | ModuleOrNamespaceBinding.Module(x,_) -> not x.IsNamespace)) | TMDefLet _ -> true | TMDefDo _ -> true | TMDefs defs -> defs |> List.exists isConcreteNamespace @@ -1759,16 +1759,16 @@ module private InferredSigPrinting = let filterVal (v:Val) = not v.IsCompilerGenerated && isNone v.MemberInfo let filterExtMem (v:Val) = v.IsExtensionMember match x with - | TMDefRec(tycons,binds,mbinds,_) -> + | TMDefRec(tycons,mbinds,_) -> TastDefinitionPrinting.layoutTyconDefns denv infoReader ad m tycons @@ - (binds |> valsOfBinds |> List.filter filterExtMem |> TastDefinitionPrinting.layoutExtensionMembers denv) @@ - (binds |> valsOfBinds |> List.filter filterVal |> List.map (PrintTastMemberOrVals.layoutValOrMember denv) |> aboveListL) @@ - (mbinds |> List.map (imbindL denv) |> aboveListL) + (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterExtMem |> TastDefinitionPrinting.layoutExtensionMembers denv) @@ + (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterVal |> List.map (PrintTastMemberOrVals.layoutValOrMember denv) |> aboveListL) @@ + (mbinds |> List.choose (function ModuleOrNamespaceBinding.Module (mspec,def) -> Some (mspec,def) | _ -> None) |> List.map (imbindL denv) |> aboveListL) | TMDefLet(bind,_) -> ([bind.Var] |> List.filter filterVal |> List.map (PrintTastMemberOrVals.layoutValOrMember denv) |> aboveListL) | TMDefs defs -> imdefsL denv defs | TMDefDo _ -> emptyL | TMAbstract mexpr -> imexprLP denv mexpr - and imbindL denv (ModuleOrNamespaceBinding(mspec, def)) = + and imbindL denv (mspec, def) = let nm = mspec.DemangledModuleOrNamespaceName let innerPath = (fullCompPathOfModuleOrNamespace mspec).AccessPath let outerPath = mspec.CompilationPath.AccessPath diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 1130f7d1868..bc0e34c2fcb 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3128,19 +3128,23 @@ and OptimizeModuleExpr cenv env x = let rec elimModDef x = match x with - | TMDefRec(tycons,vbinds,mbinds,m) -> - let vbinds = vbinds |> FlatList.filter (fun b -> b.Var |> Zset.memberOf deadSet |> not) - let mbinds = mbinds |> List.map elim_mbind - TMDefRec(tycons,vbinds,mbinds,m) + | TMDefRec(tycons,mbinds,m) -> + let mbinds = mbinds |> List.choose elimModuleBinding + TMDefRec(tycons,mbinds,m) | TMDefLet(bind,m) -> - if Zset.contains bind.Var deadSet then TMDefRec([],FlatList.empty,[],m) else x + if Zset.contains bind.Var deadSet then TMDefRec([],[],m) else x | TMDefDo _ -> x | TMDefs(defs) -> TMDefs(List.map elimModDef defs) | TMAbstract _ -> x - and elim_mbind (ModuleOrNamespaceBinding(mspec, d)) = - // Clean up the ModuleOrNamespaceType by mutation - elimModSpec mspec; - ModuleOrNamespaceBinding(mspec,elimModDef d) + and elimModuleBinding x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + if bind.Var |> Zset.memberOf deadSet then None + else Some x + | ModuleOrNamespaceBinding.Module(mspec, d) -> + // Clean up the ModuleOrNamespaceType by mutation + elimModSpec mspec + Some (ModuleOrNamespaceBinding.Module(mspec,elimModDef d)) elimModDef def @@ -3153,18 +3157,20 @@ and mkValBind (bind:Binding) info = and OptimizeModuleDef cenv (env,bindInfosColl) x = match x with - | TMDefRec(tycons,binds,mbinds,m) -> - let env = BindInternalValsToUnknown cenv (valsOfBinds binds) env - let bindInfos,env = OptimizeBindings cenv true env binds - let binds', binfos = FlatList.unzip bindInfos + | TMDefRec(tycons,mbinds,m) -> + let env = BindInternalValsToUnknown cenv (allValsOfModDef x) env let mbindInfos,(env,bindInfosColl) = OptimizeModuleBindings cenv (env,bindInfosColl) mbinds let mbinds,minfos = List.unzip mbindInfos + let binds = minfos |> List.choose (function Choice1Of2 (x,_) -> Some x | _ -> None) + let binfos = minfos |> List.choose (function Choice1Of2 (_,x) -> Some x | _ -> None) + let minfos = minfos |> List.choose (function Choice2Of2 x -> Some x | _ -> None) + (* REVIEW: Eliminate let bindings on the way back up *) - (TMDefRec(tycons,binds',mbinds,m), + (TMDefRec(tycons,mbinds,m), notlazy { ValInfos= ValInfos(FlatList.map2 (fun bind binfo -> mkValBind bind (mkValInfo binfo bind.Var)) binds binfos); ModuleOrNamespaceInfos = NameMap.ofList minfos}), - (env,(FlatList.toList bindInfos :: bindInfosColl)) + (env,bindInfosColl) | TMAbstract(mexpr) -> let mexpr,info = OptimizeModuleExpr cenv env mexpr let env = BindValsInModuleOrNamespace cenv info env @@ -3187,12 +3193,17 @@ and OptimizeModuleDef cenv (env,bindInfosColl) x = and OptimizeModuleBindings cenv (env,bindInfosColl) xs = List.mapFold (OptimizeModuleBinding cenv) (env,bindInfosColl) xs -and OptimizeModuleBinding cenv (env,bindInfosColl) (ModuleOrNamespaceBinding(mspec, def)) = - let id = mspec.Id - let (def,info),(_,bindInfosColl) = OptimizeModuleDef cenv (env,bindInfosColl) def - let env = BindValsInModuleOrNamespace cenv info env - (ModuleOrNamespaceBinding(mspec,def),(id.idText, info)), - (env,bindInfosColl) +and OptimizeModuleBinding cenv (env,bindInfosColl) x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + let ((bind',binfo) as bindInfo),env = OptimizeBinding cenv true env bind + (ModuleOrNamespaceBinding.Binding bind', Choice1Of2 (bind',binfo)),(env, [ bindInfo ] :: bindInfosColl) + | ModuleOrNamespaceBinding.Module(mspec, def) -> + let id = mspec.Id + let (def,info),(_,bindInfosColl) = OptimizeModuleDef cenv (env,bindInfosColl) def + let env = BindValsInModuleOrNamespace cenv info env + (ModuleOrNamespaceBinding.Module(mspec,def),Choice2Of2 (id.idText, info)), + (env,bindInfosColl) and OptimizeModuleDefs cenv (env,bindInfosColl) defs = if verboseOptimizations then dprintf "OptimizeModuleDefs\n"; diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 8ab4f90b485..2c8a48211a5 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -172,8 +172,10 @@ type cenv = let BindVal cenv (v:Val) = //printfn "binding %s..." v.DisplayName + let alreadyDone = cenv.boundVals.ContainsKey v.Stamp cenv.boundVals.[v.Stamp] <- 1 - if cenv.reportErrors && + if not alreadyDone && + cenv.reportErrors && not v.HasBeenReferenced && not v.IsCompiledAsTopLevel && not (v.DisplayName.StartsWith("_", System.StringComparison.Ordinal)) && @@ -1091,7 +1093,7 @@ and CheckBinding cenv env alwaysCheckNoReraise (TBind(v,e,_) as bind) = and CheckBindings cenv env xs = FlatList.iter (CheckBinding cenv env false) xs // Top binds introduce expression, check they are reraise free. -let CheckTopBinding cenv env (TBind(v,e,_) as bind) = +let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = let isExplicitEntryPoint = HasFSharpAttribute cenv.g cenv.g.attrib_EntryPointAttribute v.Attribs if isExplicitEntryPoint then cenv.entryPointGiven <- true; @@ -1215,7 +1217,7 @@ let CheckTopBinding cenv env (TBind(v,e,_) as bind) = CheckBinding cenv env true bind -let CheckTopBindings cenv env binds = FlatList.iter (CheckTopBinding cenv env) binds +let CheckModuleBindings cenv env binds = FlatList.iter (CheckModuleBinding cenv env) binds //-------------------------------------------------------------------------- // check tycons @@ -1489,15 +1491,14 @@ and CheckNothingAfterEntryPoint cenv m = and CheckDefnInModule cenv env x = match x with - | TMDefRec(tycons,binds,mspecs,m) -> + | TMDefRec(tycons,mspecs,m) -> CheckNothingAfterEntryPoint cenv m - BindVals cenv (valsOfBinds binds) - CheckEntityDefns cenv env tycons; - CheckTopBindings cenv env binds; + BindVals cenv (allValsOfModDef x |> Seq.toList) + CheckEntityDefns cenv env tycons List.iter (CheckModuleSpec cenv env) mspecs | TMDefLet(bind,m) -> CheckNothingAfterEntryPoint cenv m - CheckTopBinding cenv env bind + CheckModuleBinding cenv env bind BindVal cenv bind.Var | TMDefDo(e,m) -> CheckNothingAfterEntryPoint cenv m @@ -1506,10 +1507,14 @@ and CheckDefnInModule cenv env x = | TMAbstract(def) -> CheckModuleExpr cenv env def | TMDefs(defs) -> CheckDefnsInModule cenv env defs -and CheckModuleSpec cenv env (ModuleOrNamespaceBinding(mspec, rhs)) = - CheckEntityDefn cenv env mspec; - let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute mspec.Attribs } - CheckDefnInModule cenv env rhs +and CheckModuleSpec cenv env x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + CheckModuleBinding cenv env bind + | ModuleOrNamespaceBinding.Module (mspec, rhs) -> + CheckEntityDefn cenv env mspec; + let env = { env with reflect = env.reflect || HasFSharpAttribute cenv.g cenv.g.attrib_ReflectedDefinitionAttribute mspec.Attribs } + CheckDefnInModule cenv env rhs let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu,denv ,mexpr,extraAttribs,isLastCompiland) = let cenv = diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 932e1929d5d..8891c2a14ed 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3379,12 +3379,15 @@ module DebugPrint = begin and mdefsL defs = wordL "Module Defs" @@-- aboveListL(List.map mdefL defs) and mdefL x = match x with - | TMDefRec(tycons ,binds,mbinds,_) -> aboveListL ((tycons |> List.map tyconL) @ [letRecL binds emptyL] @ List.map mbindL mbinds) + | TMDefRec(tycons ,mbinds,_) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) | TMDefLet(bind,_) -> letL bind emptyL | TMDefDo(e,_) -> exprL e | TMDefs defs -> mdefsL defs; | TMAbstract mexpr -> mexprL mexpr - and mbindL (ModuleOrNamespaceBinding(mspec, rhs)) = + and mbindL x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> letL bind emptyL + | ModuleOrNamespaceBinding.Module(mspec, rhs) -> (wordL (if mspec.IsNamespace then "namespace" else "module") ^^ (wordL mspec.DemangledModuleOrNamespaceName |> stampL mspec.Stamp)) @@-- mdefL rhs and entityTypeL (mtyp:ModuleOrNamespaceType) = @@ -3452,7 +3455,7 @@ let wrapModuleOrNamespaceTypeInNamespace id cpath (mtyp:ModuleOrNamespaceType) = let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = let mspec = NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (notlazy (NewEmptyModuleOrNamespaceType Namespace)) - TMDefRec ([],FlatList.empty,[ModuleOrNamespaceBinding(mspec, mexpr)],id.idRange) + TMDefRec ([],[ModuleOrNamespaceBinding.Module(mspec, mexpr)],id.idRange) // cleanup: make this a property let SigTypeOfImplFile (TImplFile(_,_,mexpr,_,_)) = mexpr.Type @@ -3610,7 +3613,7 @@ let abstractSlotValsOfTycons (tycons:Tycon list) = let rec accEntityRemapFromModuleOrNamespace msigty x acc = match x with - | TMDefRec(tycons,_,mbinds,_) -> + | TMDefRec(tycons,mbinds,_) -> let acc = (mbinds, acc) ||> List.foldBack (accEntityRemapFromModuleOrNamespaceBind msigty) let acc = (tycons, acc) ||> List.foldBack (accEntityRemap msigty) let acc = (tycons, acc) ||> List.foldBack (fun e acc -> accEntityRemapFromModuleOrNamespaceType e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) @@ -3623,15 +3626,17 @@ let rec accEntityRemapFromModuleOrNamespace msigty x acc = and accEntityRemapFromModuleOrNamespaceDefs msigty mdefs acc = List.foldBack (accEntityRemapFromModuleOrNamespace msigty) mdefs acc -and accEntityRemapFromModuleOrNamespaceBind msigty (ModuleOrNamespaceBinding(mspec, def)) acc = +and accEntityRemapFromModuleOrNamespaceBind msigty x acc = + match x with + | ModuleOrNamespaceBinding.Binding _ -> acc + | ModuleOrNamespaceBinding.Module(mspec, def) -> accSubEntityRemap msigty mspec (accEntityRemapFromModuleOrNamespace (getCorrespondingSigTy mspec.LogicalName msigty) def acc) let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = match x with - | TMDefRec(tycons,binds,mbinds,_) -> + | TMDefRec(tycons,mbinds,_) -> let acc = (mbinds, acc) ||> List.foldBack (accValRemapFromModuleOrNamespaceBind g aenv msigty) - let acc = (binds, acc) ||> FlatList.foldBack (valOfBind >> accValRemap g aenv msigty) // Abstract (virtual) vslots in the tycons at TMDefRec nodes are binders. They also need to be added to the remapping. let vslotvs = abstractSlotValsOfTycons tycons let acc = (vslotvs, acc) ||> List.foldBack (accValRemap g aenv msigty) @@ -3640,7 +3645,10 @@ let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = | TMDefDo _ -> acc | TMDefs defs -> accValRemapFromModuleOrNamespaceDefs g aenv msigty defs acc | TMAbstract mexpr -> accValRemapFromModuleOrNamespaceType g aenv mexpr.Type msigty acc -and accValRemapFromModuleOrNamespaceBind g aenv msigty (ModuleOrNamespaceBinding(mspec, def)) acc = +and accValRemapFromModuleOrNamespaceBind g aenv msigty x acc = + match x with + | ModuleOrNamespaceBinding.Binding bind -> accValRemap g aenv msigty bind.Var acc + | ModuleOrNamespaceBinding.Module(mspec, def) -> accSubEntityRemap msigty mspec (accValRemapFromModuleOrNamespace g aenv (getCorrespondingSigTy mspec.LogicalName msigty) def acc) and accValRemapFromModuleOrNamespaceDefs g aenv msigty mdefs acc = List.foldBack (accValRemapFromModuleOrNamespace g aenv msigty) mdefs acc @@ -4187,12 +4195,15 @@ and freeInExpr opts e = accFreeInExpr opts e emptyFreeVars // Note: these are only an approximation - they are currently used only by the optimizer let rec accFreeInModuleOrNamespace opts x acc = match x with - | TMDefRec(_,binds,mbinds,_) -> FlatList.foldBack (accBindRhs opts) binds (List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc) + | TMDefRec(_,mbinds,_) -> List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc | TMDefLet(bind,_) -> accBindRhs opts bind acc | TMDefDo(e,_) -> accFreeInExpr opts e acc | TMDefs defs -> accFreeInModuleOrNamespaces opts defs acc | TMAbstract(ModuleOrNamespaceExprWithSig(_,mdef,_)) -> accFreeInModuleOrNamespace opts mdef acc // not really right, but sufficient for how this is used in optimization -and accFreeInModuleOrNamespaceBind opts (ModuleOrNamespaceBinding(_, def)) acc = accFreeInModuleOrNamespace opts def acc +and accFreeInModuleOrNamespaceBind opts x acc = + match x with + | ModuleOrNamespaceBinding.Binding bind -> accBindRhs opts bind acc + | ModuleOrNamespaceBinding.Module (_, def) -> accFreeInModuleOrNamespace opts def acc and accFreeInModuleOrNamespaces opts x acc = List.foldBack (accFreeInModuleOrNamespace opts) x acc @@ -4843,29 +4854,33 @@ and allTyconsOfTycon (tycon:Tycon) = for nestedTycon in tycon.ModuleOrNamespaceType.AllEntities do yield! allTyconsOfTycon nestedTycon } -and allTyconsOfModDef mdef = +and allEntitiesOfModDef mdef = seq { match mdef with - | TMDefRec(tycons,_,mbinds,_) -> + | TMDefRec(tycons,mbinds,_) -> for tycon in tycons do yield! allTyconsOfTycon tycon - for (ModuleOrNamespaceBinding(mspec, def)) in mbinds do - yield mspec; - yield! allTyconsOfModDef def + for mbind in mbinds do + match mbind with + | ModuleOrNamespaceBinding.Binding _ -> () + | ModuleOrNamespaceBinding.Module(mspec, def) -> + yield mspec + yield! allEntitiesOfModDef def | TMDefLet _ -> () | TMDefDo _ -> () | TMDefs defs -> for def in defs do - yield! allTyconsOfModDef def + yield! allEntitiesOfModDef def | TMAbstract(ModuleOrNamespaceExprWithSig(mty,_,_)) -> yield! allEntitiesOfModuleOrNamespaceTy mty } and allValsOfModDef mdef = seq { match mdef with - | TMDefRec(tycons,binds,mbinds,_) -> + | TMDefRec(tycons,mbinds,_) -> yield! abstractSlotValsOfTycons tycons - yield! (binds |> valsOfBinds |> FlatList.toList) - for (ModuleOrNamespaceBinding(_, def)) in mbinds do - yield! allValsOfModDef def + for mbind in mbinds do + match mbind with + | ModuleOrNamespaceBinding.Binding bind -> yield bind.Var + | ModuleOrNamespaceBinding.Module(_, def) -> yield! allValsOfModDef def | TMDefLet(bind,_) -> yield bind.Var | TMDefDo _ -> () @@ -4886,7 +4901,7 @@ and remapModExpr g compgen tmenv (ModuleOrNamespaceExprWithSig(mty,mdef,m)) = ModuleOrNamespaceExprWithSig(mty,mdef,m) and copyAndRemapModDef g compgen tmenv mdef = - let tycons = allTyconsOfModDef mdef |> List.ofSeq + let tycons = allEntitiesOfModDef mdef |> List.ofSeq let vs = allValsOfModDef mdef |> List.ofSeq let _,_,tmenvinner = copyAndRemapAndBindTyconsAndVals g compgen tmenv tycons vs remapAndRenameModDef g compgen tmenvinner mdef @@ -4896,12 +4911,11 @@ and remapAndRenameModDefs g compgen tmenv x = and remapAndRenameModDef g compgen tmenv mdef = match mdef with - | TMDefRec(tycons,binds,mbinds,m) -> + | TMDefRec(tycons,mbinds,m) -> // Abstract (virtual) vslots in the tycons at TMDefRec nodes are binders. They also need to be copied and renamed. let tycons = tycons |> List.map (renameTycon tmenv) - let binds = remapAndRenameBinds g compgen tmenv binds (binds |> FlatList.map (valOfBind >> renameVal tmenv)) let mbinds = mbinds |> List.map (remapAndRenameModBind g compgen tmenv) - TMDefRec(tycons,binds,mbinds,m) + TMDefRec(tycons,mbinds,m) | TMDefLet(bind,m) -> let v = bind.Var let bind = remapAndRenameBind g compgen tmenv bind (renameVal tmenv v) @@ -4916,10 +4930,16 @@ and remapAndRenameModDef g compgen tmenv mdef = let mexpr = remapModExpr g compgen tmenv mexpr TMAbstract mexpr -and remapAndRenameModBind g compgen tmenv (ModuleOrNamespaceBinding(mspec, def)) = - let mspec = renameTycon tmenv mspec - let def = remapAndRenameModDef g compgen tmenv def - ModuleOrNamespaceBinding(mspec, def) +and remapAndRenameModBind g compgen tmenv x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + let v2 = bind |> valOfBind |> renameVal tmenv + let bind2 = remapAndRenameBind g compgen tmenv bind v2 + ModuleOrNamespaceBinding.Binding bind2 + | ModuleOrNamespaceBinding.Module(mspec, def) -> + let mspec = renameTycon tmenv mspec + let def = remapAndRenameModDef g compgen tmenv def + ModuleOrNamespaceBinding.Module(mspec, def) and remapImplFile g compgen tmenv mv = mapAccImplFile (remapAndBindModExpr g compgen) tmenv mv @@ -5671,9 +5691,8 @@ let mkFolders (folders : _ ExprFolder) = and mdefF z x = match x with - | TMDefRec(_,binds,mbinds,_) -> + | TMDefRec(_,mbinds,_) -> (* REVIEW: also iterate the abstract slot vspecs hidden in the _vslots field in the tycons *) - let z = valBindsF false z binds let z = List.fold mbindF z mbinds z | TMDefLet(bind,_) -> valBindF false z bind @@ -5681,7 +5700,10 @@ let mkFolders (folders : _ ExprFolder) = | TMDefs defs -> List.fold mdefF z defs | TMAbstract x -> mexprF z x - and mbindF z (ModuleOrNamespaceBinding(_, def)) = mdefF z def + and mbindF z x = + match x with + | ModuleOrNamespaceBinding.Binding b -> valBindF false z b + | ModuleOrNamespaceBinding.Module(_, def) -> mdefF z def and implF z x = foldTImplFile mexprF z x @@ -7370,13 +7392,16 @@ and rewriteModuleOrNamespaceDefs env x = List.map (rewriteModuleOrNamespaceDef e and rewriteModuleOrNamespaceDef env x = match x with - | TMDefRec(tycons,binds,mbinds,m) -> TMDefRec(tycons,rewriteBinds env binds,rewriteModuleOrNamespaceBindings env mbinds,m) + | TMDefRec(tycons,mbinds,m) -> TMDefRec(tycons,rewriteModuleOrNamespaceBindings env mbinds,m) | TMDefLet(bind,m) -> TMDefLet(rewriteBind env bind,m) | TMDefDo(e,m) -> TMDefDo(RewriteExpr env e,m) | TMDefs defs -> TMDefs(rewriteModuleOrNamespaceDefs env defs) | TMAbstract mexpr -> TMAbstract(rewriteModuleOrNamespaceExpr env mexpr) -and rewriteModuleOrNamespaceBinding env (ModuleOrNamespaceBinding(nm, rhs)) = ModuleOrNamespaceBinding(nm,rewriteModuleOrNamespaceDef env rhs) +and rewriteModuleOrNamespaceBinding env x = + match x with + | ModuleOrNamespaceBinding.Binding bind -> ModuleOrNamespaceBinding.Binding (rewriteBind env bind) + | ModuleOrNamespaceBinding.Module(nm, rhs) -> ModuleOrNamespaceBinding.Module(nm,rewriteModuleOrNamespaceDef env rhs) and rewriteModuleOrNamespaceBindings env mbinds = List.map (rewriteModuleOrNamespaceBinding env) mbinds diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index b63625a222e..5e1819b8b17 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1394,3 +1394,5 @@ val rebuildLinearMatchExpr : (SequencePointInfoForBinding * range * DecisionTree val mkCoerceIfNeeded : TcGlobals -> tgtTy: TType -> srcTy: TType -> Expr -> Expr val (|InnerExprPat|) : Expr -> Expr + +val allValsOfModDef : ModuleOrNamespaceExpr -> seq diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 701ceda559b..acbc36d27a2 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15663,7 +15663,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu | SynModuleDecl.Exception (edef,m) -> let binds,decl,env = TcExceptionDeclarations.TcExnDefn cenv env parent (edef,scopem) - return ((fun e -> TMDefRec([decl], FlatList.ofList binds, [],m) :: e),[]), env, env + return ((fun e -> TMDefRec([decl], binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env | SynModuleDecl.Types (typeDefs,m) -> let scopem = unionRanges m scopem @@ -15694,7 +15694,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let scopem = unionRanges m scopem let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind)) let binds,env,_ = TcLetrec WarnOnOverrides cenv env tpenv (binds,m, scopem) - return ((fun e -> TMDefRec([],FlatList.ofList binds,[],m) :: e),[]), env, env + return ((fun e -> TMDefRec([],binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env else let binds,env,_ = TcLetBindings cenv env containerInfo ModuleOrMemberBinding tpenv (binds,m,scopem) return ((fun e -> binds@e),[]), env, env @@ -15719,11 +15719,11 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu CheckForDuplicateModule env id.idText id.idRange let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent - let! (topAttrsNew, _,ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)),_,envAtEnd = + let! (topAttrsNew, _,(mspecPriorToOuterOrExplicitSig,mexpr)),_,envAtEnd = TcModuleOrNamespace cenv env (id,isRec,true,mdefs,xml,modAttrs,vis,m) let mspec = mspecPriorToOuterOrExplicitSig - let mdef = TMDefRec([],FlatList.empty,[ModuleOrNamespaceBinding(mspecPriorToOuterOrExplicitSig,mexpr)],m) + let mdef = TMDefRec([],[ModuleOrNamespaceBinding.Module(mspecPriorToOuterOrExplicitSig,mexpr)],m) PublishModuleDefn cenv env mspec let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec @@ -15883,20 +15883,22 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu and TcMutRecDefsFinish cenv defs m = let tycons = defs |> List.choose (function MutRecShape.Tycon (Some tycon,_) -> Some tycon | _ -> None) - let binds = defs |> List.collect (function MutRecShape.Tycon (_,binds) | MutRecShape.Lets binds -> binds | _ -> []) - let mods = - defs |> List.choose (function - | MutRecShape.Tycon _ | MutRecShape.Open _ | MutRecShape.Lets _ -> None - | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(mtypeAcc, mspec), _),mdefs) -> + let binds = + defs |> List.collect (function + | MutRecShape.Open _ -> [] + | MutRecShape.Tycon (_,binds) + | MutRecShape.Lets binds -> + binds |> List.map ModuleOrNamespaceBinding.Binding + | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(mtypeAcc, mspec), _),mdefs) -> let mexpr = TcMutRecDefsFinish cenv mdefs m // Apply the functions for each declaration to build the overall expression-builder mspec.Data.entity_modul_contents <- notlazy !mtypeAcc //let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) // Collect up the attributes that are global to the file //let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] - Some (ModuleOrNamespaceBinding(mspec,mexpr))) + [ ModuleOrNamespaceBinding.Module(mspec,mexpr) ]) - TMDefRec(tycons,binds,mods,m) + TMDefRec(tycons,binds,m) and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = eventually { @@ -15937,7 +15939,7 @@ and TcModuleOrNamespace cenv env (id,isRec,isModule,defs,xml,modAttrs,vis,m:rang // and mutated as we went. Record it in the mspec. mspec.Data.entity_modul_contents <- notlazy !mtypeAcc - return (topAttrs,mspec,ModuleOrNamespaceBinding(mspec,mexpr)), env, envAtEnd + return (topAttrs,mspec,(mspec,mexpr)), env, envAtEnd } diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index d1d95924c25..62d696dcfd4 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3961,11 +3961,14 @@ and ModuleOrNamespaceExpr = /// Indicates the module fragment is an evaluation of expression for side-effects | TMDefDo of Expr * range /// Indicates the module fragment is a 'rec' definition of types, values and modules - | TMDefRec of Tycon list * Bindings * ModuleOrNamespaceBinding list * range + | TMDefRec of Tycon list * ModuleOrNamespaceBinding list * range /// A named module-or-namespace-fragment definition -and ModuleOrNamespaceBinding = - | ModuleOrNamespaceBinding of +and [] + ModuleOrNamespaceBinding = + //| Do of Expr + | Binding of Binding + | Module of /// This ModuleOrNamespace that represents the compilation of a module as a class. /// The same set of tycons etc. are bound in the ModuleOrNamespace as in the ModuleOrNamespaceExpr ModuleOrNamespace * From c0475dabd9c755ec7aff1638c7fc20a8db71201c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Mar 2016 14:27:24 +0000 Subject: [PATCH 064/334] fix recursive initialization for mutrec groups --- src/fsharp/TypeChecker.fs | 407 ++++++++++++++++++++------------------ 1 file changed, 215 insertions(+), 192 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index acbc36d27a2..3bd5c1ae5c6 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3370,6 +3370,121 @@ let (|SimpleSemicolonSequence|_|) acceptDeprecated c = else None +//------------------------------------------------------------------------- +// Mutually recursive shapes +//------------------------------------------------------------------------- + +/// Represents the shape of a mutually recursive group of declarations including nested modules +[] +type MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> = + | Tycon of 'TypeData + | Lets of 'LetsData + | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> list + | Open of 'OpenData + +module MutRecShapes = + let rec map f1 f2 f3 x = + x |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 a) + | MutRecShape.Lets b -> MutRecShape.Lets (f2 b) + | MutRecShape.Module (c,d) -> MutRecShape.Module (f3 c, map f1 f2 f3 d)) + + + let mapTycons f1 xs = map f1 id id xs + let mapTyconsAndLets f1 f2 xs = map f1 f2 id xs + let mapLets f2 xs = map id f2 id xs + let mapModules f1 xs = map id id f1 xs + + let rec mapWithEnv f1 f2 (env: 'Env) x = + x |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 env a) + | MutRecShape.Lets b -> MutRecShape.Lets (f2 env b) + | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv f1 f2 env2 d)) + + let mapTyconsWithEnv f1 env xs = mapWithEnv f1 (fun _env x -> x) env xs + + let rec mapWithParent parent f1 f2 f3 xs = + xs |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) + | MutRecShape.Lets b -> MutRecShape.Lets (f3 parent b) + | MutRecShape.Module (c,d) -> + let c2, parent2 = f1 parent c + MutRecShape.Module (c2, mapWithParent parent2 f1 f2 f3 d)) + + let rec computeEnvs f1 f2 (env: 'Env) xs = + let env = f2 env xs + env, + xs |> List.map (function + | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.Tycon a -> MutRecShape.Tycon a + | MutRecShape.Lets b -> MutRecShape.Lets b + | MutRecShape.Module (c,ds) -> + let env2 = f1 env c + let env3, ds2 = computeEnvs f1 f2 env2 ds + MutRecShape.Module ((c,env3), ds2)) + + let rec extendEnvs f1 (env: 'Env) xs = + let env = f1 env xs + env, + xs |> List.map (function + | MutRecShape.Module ((c,env),ds) -> + let env2, ds2 = extendEnvs f1 env ds + MutRecShape.Module ((c,env2), ds2) + | x -> x) + + let dropEnvs xs = xs |> mapModules fst + + let rec expandTycons f1 env xs = + let preBinds, postBinds = + xs |> List.map (fun elem -> + match elem with + | MutRecShape.Tycon a -> f1 env a + | _ -> [], []) + |> List.unzip + [MutRecShape.Lets (List.concat preBinds)] @ + (xs |> List.map (fun elem -> + match elem with + | MutRecShape.Module ((c,env2),d) -> MutRecShape.Module ((c,env2), expandTycons f1 env2 d) + | _ -> elem)) @ + [MutRecShape.Lets (List.concat postBinds)] + + let rec mapFoldWithEnv f1 z env xs = + (z,xs) ||> List.mapFold (fun z x -> + match x with + | MutRecShape.Module ((c,env2),ds) -> let ds2,z = mapFoldWithEnv f1 z env2 ds in MutRecShape.Module ((c, env2), ds2),z + | _ -> let x2,z = f1 z env x in x2, z) + + + let rec collectTycons x = + x |> List.collect (function + | MutRecShape.Tycon a -> [a] + | MutRecShape.Module (_,d) -> collectTycons d + | _ -> []) + + let topTycons x = + x |> List.choose (function MutRecShape.Tycon a -> Some a | _ -> None) + + let rec iter f1 f2 f3 f4 x = + x |> List.iter (function + | MutRecShape.Tycon a -> f1 a + | MutRecShape.Lets b -> f2 b + | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 f4 d + | MutRecShape.Open a -> f4 a) + + let iterTycons f1 x = iter f1 ignore ignore ignore x + let iterModules f1 x = iter ignore ignore f1 ignore x + + let rec iterWithEnv f1 f2 f3 env x = + x |> List.iter (function + | MutRecShape.Tycon a -> f1 env a + | MutRecShape.Lets b -> f2 env b + | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 f3 env d + | MutRecShape.Open a -> f3 env a) + + let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) (fun _env _x -> ()) env xs //------------------------------------------------------------------------- // Post-transform initialization graphs using the 'lazy' interpretation. @@ -3388,12 +3503,20 @@ type PreInitializationGraphEliminationBinding = Binding: Tast.Binding } -let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithoutLaziness : PreInitializationGraphEliminationBinding list) bindsm = - // BEGIN INITIALIZATION GRAPHS - // Check for safety and determine if we need to insert lazy thunks - let fixupsl = fixupsAndBindingsWithoutLaziness |> List.map (fun b -> b.FixupPoints) - let bindsWithoutLaziness = fixupsAndBindingsWithoutLaziness |> List.map (fun b -> b.Binding) - let rvs = bindsWithoutLaziness |> List.map (fun (TBind(v,_,_)) -> mkLocalValRef v) +/// Check for safety and determine if we need to insert lazy thunks +let EliminateInitializationGraphs + (getTyconBinds: 'TyconDataIn -> PreInitializationGraphEliminationBinding list) + (morphTyconBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'TyconDataIn -> 'TyconDataOut) + (getLetBinds: 'LetDataIn list -> PreInitializationGraphEliminationBinding list) + (morphLetBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'LetDataIn list -> Binding list) + g mustHaveArity denv + (fixupsAndBindingsWithoutLaziness : MutRecShape<_,_,_,_> list) bindsm = + + let recursiveVals = + let hash = ValHash.Create() + let add (pgrbind: PreInitializationGraphEliminationBinding) = let c = pgrbind.Binding.Var in hash.Add(c,c) + fixupsAndBindingsWithoutLaziness |> MutRecShapes.iter (getTyconBinds >> List.iter add) (getLetBinds >> List.iter add) ignore ignore + hash // The output of the analysis let outOfOrder = ref false @@ -3407,7 +3530,8 @@ let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithout | Expr.TyChoose(_,b,_) -> stripChooseAndExpr b | e -> e - let check availIfInOrder boundv expr = + let availIfInOrder = ValHash<_>.Create() + let check boundv expr = let strict = function | MaybeLazy -> MaybeLazy | DefinitelyLazy -> DefinitelyLazy @@ -3447,7 +3571,7 @@ let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithout List.iter (snd >> List.iter (fun (TObjExprMethod(_,_,_,_,e,_)) -> CheckExpr (lzy (strict st)) e)) extraImpls // Expressions where fixups may be needed - | Expr.Val (v,_,m) -> CheckValSpec st v m + | Expr.Val (v,_,m) -> CheckValRef st v m // Expressions where subparts may be fixable | Expr.Op((TOp.Tuple | TOp.UnionCase _ | TOp.Recd _),_,args,_) -> @@ -3487,28 +3611,28 @@ let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithout and CheckExprOp st op m = match op with - | TOp.LValueOp (_,lvr) -> CheckValSpec (strict st) lvr m + | TOp.LValueOp (_,lvr) -> CheckValRef (strict st) lvr m | _ -> () - and CheckValSpec st v m = + and CheckValRef st (v: ValRef) m = match st with | MaybeLazy -> - if ListSet.contains g.valRefEq v rvs then + if recursiveVals.TryFind v.Deref |> Option.isSome then warning (RecursiveUseCheckedAtRuntime (denv,v,m)) if not !reportedEager then (warning (LetRecCheckedAtRuntime m); reportedEager := true) runtimeChecks := true | Top | DefinitelyStrict -> - if ListSet.contains g.valRefEq v rvs then - if not (ListSet.contains g.valRefEq v availIfInOrder) then + if recursiveVals.TryFind v.Deref |> Option.isSome then + if availIfInOrder.TryFind v.Deref |> Option.isNone then warning (LetRecEvaluatedOutOfOrder (denv,boundv,v,m)) outOfOrder := true if not !reportedEager then (warning (LetRecCheckedAtRuntime m); reportedEager := true) definiteDependencies := (boundv,v) :: !definiteDependencies | InnerTop -> - if ListSet.contains g.valRefEq v rvs then + if recursiveVals.TryFind v.Deref |> Option.isSome then directRecursiveData := true | DefinitelyLazy -> () and checkDelayed st b = @@ -3521,13 +3645,16 @@ let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithout // Check the bindings one by one, each w.r.t. the previously available set of binding - ([], bindsWithoutLaziness) ||> List.fold (fun availIfInOrder (TBind(v,e,_)) -> - check availIfInOrder (mkLocalValRef v) e - (mkLocalValRef v::availIfInOrder)) - |> ignore + begin + let checkBind (pgrbind: PreInitializationGraphEliminationBinding) = + let (TBind(v,e,_)) = pgrbind.Binding + check (mkLocalValRef v) e + availIfInOrder.Add(v, 1) + fixupsAndBindingsWithoutLaziness |> MutRecShapes.iter (getTyconBinds >> List.iter checkBind) (getLetBinds >> List.iter checkBind) ignore ignore + end // ddg = definiteDependencyGraph - let ddgNodes = bindsWithoutLaziness |> List.map (fun (TBind(v,_,_)) -> mkLocalValRef v) + let ddgNodes = recursiveVals.Values |> Seq.toList |> List.map mkLocalValRef let ddg = Graph((fun v -> v.Stamp), ddgNodes, !definiteDependencies ) ddg.IterateCycles (fun path -> error (LetRecUnsound (denv,path,path.Head.Range))) @@ -3535,38 +3662,41 @@ let EliminateInitializationGraphs g mustHaveArity denv (fixupsAndBindingsWithout if !directRecursiveData && requiresLazyBindings then error(Error(FSComp.SR.tcInvalidMixtureOfRecursiveForms(),bindsm)) - let bindsBefore, bindsAfter = - if requiresLazyBindings then - let bindsBeforeL, bindsAfterL = - - (fixupsl, bindsWithoutLaziness) - ||> List.map2 (fun (RecursiveUseFixupPoints(fixupPoints)) (TBind(v,e,seqPtOpt)) -> - match stripChooseAndExpr e with - | Expr.Lambda _ | Expr.TyLambda _ -> - [mkInvisibleBind v e],[] - | _ -> - let ty = v.Type - let m = v.Range - let vty = (mkLazyTy g ty) + if requiresLazyBindings then + let morphBinding (pgrbind: PreInitializationGraphEliminationBinding) = + let (RecursiveUseFixupPoints(fixupPoints)) = pgrbind.FixupPoints + let (TBind(v,e,seqPtOpt)) = pgrbind.Binding + match stripChooseAndExpr e with + | Expr.Lambda _ | Expr.TyLambda _ -> + [],[mkInvisibleBind v e] + | _ -> + let ty = v.Type + let m = v.Range + let vty = (mkLazyTy g ty) - let fty = (g.unit_ty --> ty) - let flazy,felazy = Tastops.mkCompGenLocal m v.LogicalName fty - let frhs = mkUnitDelayLambda g m e - if mustHaveArity then flazy.SetValReprInfo (Some(InferArityOfExpr g fty [] [] frhs)) + let fty = (g.unit_ty --> ty) + let flazy,felazy = Tastops.mkCompGenLocal m v.LogicalName fty + let frhs = mkUnitDelayLambda g m e + if mustHaveArity then flazy.SetValReprInfo (Some(InferArityOfExpr g fty [] [] frhs)) - let vlazy,velazy = Tastops.mkCompGenLocal m v.LogicalName vty - let vrhs = (mkLazyDelayed g m ty felazy) + let vlazy,velazy = Tastops.mkCompGenLocal m v.LogicalName vty + let vrhs = (mkLazyDelayed g m ty felazy) - if mustHaveArity then vlazy.SetValReprInfo (Some(InferArityOfExpr g vty [] [] vrhs)) - fixupPoints |> List.iter (fun (fp,_) -> fp := mkLazyForce g (!fp).Range ty velazy) + if mustHaveArity then vlazy.SetValReprInfo (Some(InferArityOfExpr g vty [] [] vrhs)) + fixupPoints |> List.iter (fun (fp,_) -> fp := mkLazyForce g (!fp).Range ty velazy) - [mkInvisibleBind flazy frhs; mkInvisibleBind vlazy vrhs], - [mkBind seqPtOpt v (mkLazyForce g m ty velazy)]) - |> List.unzip - List.concat bindsBeforeL, List.concat bindsAfterL - else - bindsWithoutLaziness,[] - bindsBefore @ bindsAfter + [mkInvisibleBind flazy frhs; mkInvisibleBind vlazy vrhs], + [mkBind seqPtOpt v (mkLazyForce g m ty velazy)] + + let newTopBinds = ResizeArray<_>() + let morphBindings pgrbinds = pgrbinds |> List.map morphBinding |> List.unzip |> (fun (a,b) -> newTopBinds.Add (List.concat a); List.concat b) + + let res = fixupsAndBindingsWithoutLaziness |> MutRecShapes.map (morphTyconBinds morphBindings) (morphLetBinds morphBindings) id + if newTopBinds.Count = 0 then res + else MutRecShape.Lets (List.concat newTopBinds) :: res + else + let noMorph (pgrbinds : PreInitializationGraphEliminationBinding list) = pgrbinds |> List.map (fun pgrbind -> pgrbind.Binding) + fixupsAndBindingsWithoutLaziness |> MutRecShapes.map (morphTyconBinds noMorph) (morphLetBinds noMorph) id //------------------------------------------------------------------------- // Check the shape of an object constructor and rewrite calls @@ -3779,116 +3909,6 @@ type ValSpecResult = ValSpecResult of ParentRef * ValMemberInfoTransient option // Additional data structures used by checking recursive bindings //------------------------------------------------------------------------- -[] -type MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> = - | Tycon of 'TypeData - | Lets of 'LetsData - | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> list - | Open of 'OpenData - -module MutRecShapes = - let rec map f1 f2 f3 x = - x |> List.map (function - | MutRecShape.Open a -> MutRecShape.Open a - | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 a) - | MutRecShape.Lets b -> MutRecShape.Lets (f2 b) - | MutRecShape.Module (c,d) -> MutRecShape.Module (f3 c, map f1 f2 f3 d)) - - - let mapTycons f1 xs = map f1 id id xs - let mapTyconsAndLets f1 f2 xs = map f1 f2 id xs - let mapLets f2 xs = map id f2 id xs - let mapModules f1 xs = map id id f1 xs - - let rec mapWithEnv f1 f2 (env: 'Env) x = - x |> List.map (function - | MutRecShape.Open a -> MutRecShape.Open a - | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 env a) - | MutRecShape.Lets b -> MutRecShape.Lets (f2 env b) - | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv f1 f2 env2 d)) - - let mapTyconsWithEnv f1 env xs = mapWithEnv f1 (fun _env x -> x) env xs - - let rec mapWithParent parent f1 f2 f3 xs = - xs |> List.map (function - | MutRecShape.Open a -> MutRecShape.Open a - | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) - | MutRecShape.Lets b -> MutRecShape.Lets (f3 parent b) - | MutRecShape.Module (c,d) -> - let c2, parent2 = f1 parent c - MutRecShape.Module (c2, mapWithParent parent2 f1 f2 f3 d)) - - let rec computeEnvs f1 f2 (env: 'Env) xs = - let env = f2 env xs - env, - xs |> List.map (function - | MutRecShape.Open a -> MutRecShape.Open a - | MutRecShape.Tycon a -> MutRecShape.Tycon a - | MutRecShape.Lets b -> MutRecShape.Lets b - | MutRecShape.Module (c,ds) -> - let env2 = f1 env c - let env3, ds2 = computeEnvs f1 f2 env2 ds - MutRecShape.Module ((c,env3), ds2)) - - let rec extendEnvs f1 (env: 'Env) xs = - let env = f1 env xs - env, - xs |> List.map (function - | MutRecShape.Module ((c,env),ds) -> - let env2, ds2 = extendEnvs f1 env ds - MutRecShape.Module ((c,env2), ds2) - | x -> x) - - let dropEnvs xs = xs |> mapModules fst - - let rec expandTycons f1 env xs = - let preBinds, postBinds = - xs |> List.map (fun elem -> - match elem with - | MutRecShape.Tycon a -> f1 env a - | _ -> [], []) - |> List.unzip - [MutRecShape.Lets (List.concat preBinds)] @ - (xs |> List.map (fun elem -> - match elem with - | MutRecShape.Module ((c,env2),d) -> MutRecShape.Module ((c,env2), expandTycons f1 env2 d) - | _ -> elem)) @ - [MutRecShape.Lets (List.concat postBinds)] - - let rec mapFoldWithEnv f1 z env xs = - (z,xs) ||> List.mapFold (fun z x -> - match x with - | MutRecShape.Module ((c,env2),ds) -> let ds2,z = mapFoldWithEnv f1 z env2 ds in MutRecShape.Module ((c, env2), ds2),z - | _ -> let x2,z = f1 z env x in x2, z) - - - let rec collectTycons x = - x |> List.collect (function - | MutRecShape.Tycon a -> [a] - | MutRecShape.Module (_,d) -> collectTycons d - | _ -> []) - - let topTycons x = - x |> List.choose (function MutRecShape.Tycon a -> Some a | _ -> None) - - let rec iter f1 f2 f3 f4 x = - x |> List.iter (function - | MutRecShape.Tycon a -> f1 a - | MutRecShape.Lets b -> f2 b - | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 f4 d - | MutRecShape.Open a -> f4 a) - - let iterTycons f1 x = iter f1 ignore ignore ignore x - let iterModules f1 x = iter ignore ignore f1 ignore x - - let rec iterWithEnv f1 f2 f3 env x = - x |> List.iter (function - | MutRecShape.Tycon a -> f1 env a - | MutRecShape.Lets b -> f2 env b - | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 f3 env d - | MutRecShape.Open a -> f3 env a) - - let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) (fun _env _x -> ()) env xs type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * DeclKind * SynBinding @@ -10523,12 +10543,15 @@ and AnalyzeRecursiveDecl (cenv,envinner,tpenv,declKind,synTyparDecls,declaredTyp error(Error(FSComp.SR.tcAttributesInvalidInPatterns(),m)) //analyzeRecursiveDeclPat pat' - // This is for the construct - // 'let rec x = ... and do ... and y = ...' - // DEPRECATED IN pars.mly - | SynPat.Const (SynConst.Unit, m) -> - let id = ident ("doval",m) - analyzeRecursiveDeclPat tpenv (SynPat.Named (SynPat.Wild m, id,false,None,m)) + // This is for the construct 'let rec x = ... and do ... and y = ...' (DEPRECATED IN pars.mly ) + // + // Also for + // module rec M = + // printfn "hello" // side effects in recursive modules + // let x = 1 + | SynPat.Const (SynConst.Unit, m) | SynPat.Wild m -> + let id = ident (cenv.niceNameGen.FreshCompilerGeneratedName("doval",m),m) + analyzeRecursiveDeclPat tpenv (SynPat.Named (SynPat.Wild m, id, false, None, m)) | SynPat.Named (SynPat.Wild _, id,_,vis2,_) -> AnalyzeRecursiveStaticMemberOrValDecl (cenv,envinner,tpenv,declKind,newslotsOK,overridesOK,tcrefContainerInfo,vis1,id,vis2,declaredTypars,memberFlagsOpt,thisIdOpt,bindingAttribs,valSynInfo,ty,bindingRhs,mBinding,flex) @@ -11129,7 +11152,17 @@ and TcLetrec overridesOK cenv env tpenv (binds,bindsm,scopem) = | [] -> false | (rbind :: _) -> DeclKind.MustHaveArity rbind.RecBindingInfo.DeclKind - EliminateInitializationGraphs cenv.g mustHaveArity env.DisplayEnv bindsWithoutLaziness bindsm + let results = + EliminateInitializationGraphs + (fun _ -> failwith "unreachable 2 - no type definitions in recursivve group") + (fun _ -> failwith "unreachable 3 - no type definitions in recursivve group") + id + (fun morpher oldBinds -> morpher oldBinds) + cenv.g mustHaveArity env.DisplayEnv [MutRecShape.Lets bindsWithoutLaziness] bindsm + match results with + | [MutRecShape.Lets newBinds; MutRecShape.Lets newBinds2] -> newBinds @ newBinds2 + | [MutRecShape.Lets newBinds] -> newBinds + | _ -> failwith "unreachable 4 - gave a Lets shape, expected at most one pre-lets shape back" // Post letrec env let envbody = AddLocalVals cenv.tcSink scopem prelimRecValues env @@ -13025,16 +13058,13 @@ module MutRecBindingChecking = let defnsDs = TcMutRecBindings_Phase2D_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs) // Phase2E - rewrite values to initialization graphs - // - // TODO: Note that this does initialization graphs in each type independently. let defnsEs = - defnsDs |> MutRecShapes.map - (fun (tyconOpt, fixupValueExprBinds, methodBinds) -> - let fixedBinds = EliminateInitializationGraphs g true denv fixupValueExprBinds bindsm - tyconOpt, fixedBinds @ methodBinds) - (fun (fixupValueExprBinds) -> - EliminateInitializationGraphs g true denv fixupValueExprBinds bindsm) - id + EliminateInitializationGraphs + p23 + (fun morpher (tyconOpt,fixupValueExprBinds,methodBinds) -> (tyconOpt, morpher fixupValueExprBinds @ methodBinds)) + id + (fun morpher oldBinds -> morpher oldBinds) + g true denv defnsDs bindsm defnsEs,envMutRec @@ -15754,7 +15784,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs + let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml (if isModule then false else isRec) defs let env = if isNil enclosingNamespacePath then @@ -15783,32 +15813,21 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu return ((fun e -> e), []), env, env } -and (|MutRecDirective|_|) d = - match d with - | ParsedHashDirective(("allow_forward_references_in_this_scope" | "rec" | "mutrec" | "fwdrec" | "allow_forward_references"),[],_) -> Some () - | _ -> None - -and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) isRec (moreDefs: SynModuleDecl list) = +and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) = eventually { match moreDefs with - // rec indicates a mutrec section - | defs when isRec -> - return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs - // #rec indicates a mutrec section - | SynModuleDecl.HashDirective(MutRecDirective,_) :: defs -> - return! TcModuleOrNamespaceElementsMutRec cenv parent endm env defs - | (h1 :: t) -> + | (firstDef :: otherDefs) -> // Lookahead one to find out the scope of the next declaration. let scopem = - if isNil t then unionRanges h1.Range endm - else unionRanges (List.head t).Range endm + if isNil otherDefs then unionRanges firstDef.Range endm + else unionRanges (List.head otherDefs).Range endm // Possibly better: //let scopem = unionRanges h1.Range.EndRange endm - let! h1',env', envAtEnd' = TcModuleOrNamespaceElement cenv parent scopem env h1 + let! firstDef',env', envAtEnd' = TcModuleOrNamespaceElement cenv parent scopem env firstDef // tail recursive - return! TcModuleOrNamespaceElementsAux cenv parent endm ( (h1' :: defsSoFar), env', envAtEnd') isRec t + return! TcModuleOrNamespaceElementsAux cenv parent endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs | [] -> return List.rev defsSoFar,env, envAtEnd } @@ -15906,7 +15925,11 @@ and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - let! compiledDefs, env, envAtEnd = TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) isRec defs + let! compiledDefs, env, envAtEnd = + if isRec then + TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + else + TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) From dc957914adc0a3dcbe66d70527ef906f5ab17c27 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 15 Mar 2016 15:25:18 +0000 Subject: [PATCH 065/334] first part of mutrec signatures --- src/fsharp/TypeChecker.fs | 126 ++++++++++++++++++++++++++++++++++---- src/fsharp/ast.fs | 2 + 2 files changed, 115 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 3bd5c1ae5c6..591ec7da680 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3914,7 +3914,7 @@ type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * Dec type MutRecDataForOpenDecl = MutRecDataForOpenDecl of LongIdent * range -type MutRecSignatureInitialData = MutRecShape list +type MutRecSigsInitialData = MutRecShape list type MutRecDefnsInitialData = MutRecShape list type MutRecDefnsPhase1DataForTycon = MutRecDefnsPhase1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool @@ -13649,7 +13649,6 @@ module TcExceptionDeclarations = let seSet = TyconConstraintInference.InferSetOfTyconsSupportingEquatable cenv env.DisplayEnv [(exnc,structuralTypes)] // Augment the exception constructor with comparison and hash methods if needed - // TODO: Check exception abbreviations in mutually recursive groups, they may get augmentation bindings (?) incorrectly let binds = match exnc.ExceptionInfo with | TExnAbbrevRepr _ | TExnNone | TExnAsmRepr _ -> [] @@ -15442,6 +15441,11 @@ module TcDeclarations = begin let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) tyconCore, (synTyconInfo,extraMembers) + | SynTypeDefnSigRepr.Exception(r) -> + let isAtOriginalTyconDefn = true + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) + core, (synTyconInfo,extraMembers) + | SynTypeDefnSigRepr.Simple(r,_) -> let isAtOriginalTyconDefn = true let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) @@ -15463,7 +15467,7 @@ module TcDeclarations = begin TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(innerParent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) - let TcMutRecSignatureDecls cenv env parent tpenv (tspecs:MutRecSignatureInitialData,m,scopem) = + let TcMutRecSignatureDecls cenv env parent tpenv (tspecs:MutRecSigsInitialData,m,scopem) = let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) let _ = TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefnsAfterCore @@ -15505,10 +15509,10 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs env return env - | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),_isRec,mdefs,m) -> + | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),isRec,mdefs,m) -> let id = ComputeModuleName longPath let vis,_ = ComputeAccessAndCompPath env None im vis parent - let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,true,mdefs,xml,attribs,vis,m) + let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,isRec,true,mdefs,xml,attribs,vis,m) let scopem = unionRanges m endm PublishModuleDefn cenv env mspec; let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec @@ -15549,7 +15553,7 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml defs + let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml (if isModule then false else isRec) defs let env = if isNil enclosingNamespacePath then envAtEnd @@ -15575,16 +15579,112 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = return env } -and TcSignatureElements cenv parent endm env xml defs = +and TcSignatureElements cenv parent endm env xml isRec defs = eventually { // Ensure the deref_nlpath call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - return! Eventually.fold (TcSignatureElement cenv parent endm) env defs + if isRec then + return! TcSignatureElementsMutRec cenv parent endm env defs + else + + return! Eventually.fold (TcSignatureElement cenv parent endm) env defs } -and TcModuleOrNamespaceSignature cenv env (id:Ident,isModule,defs,xml,attribs,vis,m) = +and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDecl list) = + eventually { + let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges + let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) + + let mutRecDefns = + let rec loop defs : MutRecSigsInitialData = + (true,defs) ||> List.collectFold (fun openOk def -> + match def with + | SynModuleSigDecl.Types (typeSpecs,_) -> + let decls = typeSpecs |> List.map MutRecShape.Tycon + decls, false + + | SynModuleSigDecl.Open (lid,m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let decls = [ MutRecShape.Open (MutRecDataForOpenDecl(lid, m)) ] + decls, openOk + + | SynModuleSigDecl.Exception (SynExceptionSig(exnRepr,members,_),m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let ( SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_,doc,vis,m)) = exnRepr + let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) + let decls = [ MutRecShape.Tycon(SynTypeDefnSig.TypeDefnSig(compInfo, SynTypeDefnSigRepr.Exception exnRepr, members, m)) ] + decls, openOk + + | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range))) + |> fst + loop defs + return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) + } + +(* // TODO: Note yet doing 'val' bindnigs or nested modules in recursive signatures + + | SynModuleSigDecl.Val (vspec,m) -> + let parentModule = + match parent with + | ParentNone -> error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),vspec.RangeOfId)) + | Parent p -> p + let containerInfo = ModuleOrNamespaceContainerInfo(parentModule) + let idvs,_ = TcAndPublishValSpec (cenv,env,containerInfo,ModuleOrMemberBinding,None,emptyUnscopedTyparEnv,vspec) + let scopem = unionRanges m endm + let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs env + return env + + | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),isRec,mdefs,m) -> + let id = ComputeModuleName longPath + let vis,_ = ComputeAccessAndCompPath env None im vis parent + let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,isRec,true,mdefs,xml,attribs,vis,m) + let scopem = unionRanges m endm + PublishModuleDefn cenv env mspec; + let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec + return env + + | SynModuleSigDecl.ModuleAbbrev (id,p,m) -> + let ad = env.eAccessRights + let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) + let scopem = unionRanges m endm + let modrefs = mvvs |> List.map p23 + if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then + errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) + let modrefs = modrefs |> List.filter (fun modref -> not modref.IsNamespace) + modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) + + let env = + if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env + else env + return env + + | SynModuleSigDecl.HashDirective _ -> + return env + +*) + +(* + | SynModuleDecl.Let (letrec, binds, m) -> + if isNamespace then + CheckLetInNamespace binds m; [], false + else + if letrec then [MutRecShape.Lets binds], false + else List.map (List.singleton >> MutRecShape.Lets) binds, false + + | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,m) -> + if isRec then warning(Error(FSComp.SR.tcRecImplied(),m)) + let mutRecDefs = loop false synDefs + let decls = [MutRecShape.Module (compInfo, mutRecDefs)] + decls, false + + | SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> + +*) + + +and TcModuleOrNamespaceSignature cenv env (id:Ident,isRec,isModule,defs,xml,attribs,vis,m) = eventually { let attribs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs CheckNamespaceModuleOrTypeName cenv.g id @@ -15600,14 +15700,14 @@ and TcModuleOrNamespaceSignature cenv env (id:Ident,isModule,defs,xml,attribs,vi let innerParent = mkLocalModRef mspec - let! (mtyp,envAtEnd) = TcModuleOrNamespaceSignatureElements cenv (Parent innerParent) env (id,modKind,defs,m,xml) + let! (mtyp,envAtEnd) = TcModuleOrNamespaceSignatureElements cenv (Parent innerParent) env (id,isRec,modKind,defs,m,xml) mspec.Data.entity_modul_contents <- notlazy mtyp return (mspec, envAtEnd) } -and TcModuleOrNamespaceSignatureElements cenv parent env (id,modKind,defs,m:range,xml) = +and TcModuleOrNamespaceSignatureElements cenv parent env (id,isRec,modKind,defs,m:range,xml) = eventually { let endm = m.EndRange // use end of range for errors @@ -15616,7 +15716,7 @@ and TcModuleOrNamespaceSignatureElements cenv parent env (id,modKind,defs,m:rang let envForModule,mtypeAcc = MakeInnerEnv env id modKind // Now typecheck the signature, using mutation to fill in the submodule description. - let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml defs + let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml isRec defs // mtypeAcc has now accumulated the module type return !mtypeAcc, envAtEnd @@ -16227,7 +16327,7 @@ let TypeCheckOneSigFile let envinner,mtypeAcc = MakeInitialEnv tcEnv let specs = [ for x in sigFileFrags -> SynModuleSigDecl.NamespaceFragment(x) ] - let! tcEnv = TcSignatureElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty specs + let! tcEnv = TcSignatureElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false specs let sigFileType = !mtypeAcc diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 695c6ce661b..03f228cb064 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1164,10 +1164,12 @@ and | ObjectModel of SynTypeDefnKind * SynMemberSigs * range /// Indicates the right right-hand-side is a record, union or other simple type. | Simple of SynTypeDefnSimpleRepr * range + | Exception of SynExceptionDefnRepr member this.Range = match this with | ObjectModel(_,_,m) -> m | Simple(_,m) -> m + | Exception e -> e.Range and [] From 1e41aae82bc1f1d1da3749119ed53e8f15c3ab96 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Wed, 16 Mar 2016 14:49:17 +1100 Subject: [PATCH 066/334] Tests for OperatorIntrinsics.Range* Various tests for both signed and unsigned integer values or various bit sizings --- .../FSharp.Core/PrimTypes.fs | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs index 8f23db3a41e..dfc605519b1 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs @@ -683,3 +683,115 @@ type UnboxAndOptionStuff() = Assert.IsTrue( not (isNull [| |])) Assert.IsTrue( not (isNull "")) Assert.IsTrue( not (isNull "1")) + + +module internal RangeTestsHelpers = + // strictly speaking, this is just undefined behaviour, but at some point the F# library decided that + // it was an exception, so we are ensuring that such behaviour is retained + let inline regressionExceptionBeforeStart n = + let sequence = seq { n .. n } + let enumerator = sequence.GetEnumerator() + enumerator.Current |> ignore + + // strictly speaking, this is just undefined behaviour, but at some point the F# library decided that + // it was an exception, so we are ensuring that such behaviour is retained + let inline regressionExceptionAfterEnd n = + let sequence = seq { n .. n } + let enumerator = sequence.GetEnumerator() + while enumerator.MoveNext () do ignore () + enumerator.Current |> ignore + + let inline exceptions zero one two = + Assert.Throws (typeof, (fun () -> [one .. zero .. two] |> List.length |> ignore)) |> ignore + + Assert.Throws (typeof, (fun () -> regressionExceptionBeforeStart zero)) |> ignore + Assert.Throws (typeof, (fun () -> regressionExceptionAfterEnd zero)) |> ignore + + let inline common (min0, min1, min2, min3) (max0, max1, max2, max3) (zero, one, two, three) = + Assert.AreEqual ([min0 .. min3], [min0; min1; min2; min3]) + Assert.AreEqual ([min0 .. one .. min3], [min0; min1; min2; min3]) + Assert.AreEqual ([min0 .. two .. min3], [min0; min2]) + Assert.AreEqual ([min0 .. three .. min3], [min0; min3]) + + Assert.AreEqual ([max3 .. max0], [max3; max2; max1; max0]) + Assert.AreEqual ([max3 .. one .. max0], [max3; max2; max1; max0]) + Assert.AreEqual ([max3 .. two .. max0], [max3; max1]) + Assert.AreEqual ([max3 .. three .. max0], [max3; max0]) + + Assert.AreEqual ([max0 .. min0], []) + Assert.AreEqual ([max0 .. one .. min0], []) + Assert.AreEqual ([max0 .. two .. min0], []) + Assert.AreEqual ([max0 .. three .. min0], []) + + exceptions zero one two + + let inline signed min0 max0 = + let zero = LanguagePrimitives.GenericZero + let one = LanguagePrimitives.GenericOne + let two = one + one + let three = two + one + + let min1 = min0 + one + let min2 = min1 + one + let min3 = min2 + one + + let max1 = max0 - one + let max2 = max1 - one + let max3 = max2 - one + + common (min0, min1, min2, min3) (max0, max1, max2, max3) (zero, one, two, three) + + Assert.AreEqual ([min0 .. max0 .. max0], [ min0; min0 + max0; min0 + max0 + max0 ]) + Assert.AreEqual ([min0 .. max1 .. max0], [ min0; min0 + max1; min0 + max1 + max1 ]) + Assert.AreEqual ([min0 .. max2 .. max0], [ min0; min0 + max2; min0 + max2 + max2 ]) + Assert.AreEqual ([min0 .. max3 .. max0], [ min0; min0 + max3; min0 + max3 + max3 ]) + + Assert.AreEqual ([min3 .. -one .. min0], [min3; min2; min1; min0]) + Assert.AreEqual ([min3 .. -two .. min0], [min3; min1]) + Assert.AreEqual ([min3 .. -three .. min0], [min3; min0]) + + Assert.AreEqual ([max0 .. -one .. max3], [max0; max1; max2; max3]) + Assert.AreEqual ([max0 .. -two .. max3], [max0; max2]) + Assert.AreEqual ([max0 .. -three .. max3], [max0; max3]) + + Assert.AreEqual ([min0 .. -one .. max0], []) + Assert.AreEqual ([min0 .. -two .. max0], []) + Assert.AreEqual ([min0 .. -three .. max0], []) + + Assert.AreEqual ([max0 .. min0 .. min0], [max0; max0 + min0]) + Assert.AreEqual ([max0 .. min1 .. min0], [max0; max0 + min1; max0 + min1 + min1 ]) + Assert.AreEqual ([max0 .. min2 .. min0], [max0; max0 + min2; max0 + min2 + min2 ]) + Assert.AreEqual ([max0 .. min3 .. min0], [max0; max0 + min3; max0 + min3 + min3 ]) + + let inline unsigned min0 max0 = + let zero = LanguagePrimitives.GenericZero + let one = LanguagePrimitives.GenericOne + let two = one + one + let three = two + one + + let min1 = min0 + one + let min2 = min1 + one + let min3 = min2 + one + + let max1 = max0 - one + let max2 = max1 - one + let max3 = max2 - one + + common (min0, min1, min2, min3) (max0, max1, max2, max3) (zero, one, two, three) + + Assert.AreEqual ([min0 .. max0 .. max0], [min0; min0 + max0]) + Assert.AreEqual ([min0 .. max1 .. max0], [min0; min0 + max1]) + Assert.AreEqual ([min0 .. max2 .. max0], [min0; min0 + max2]) + Assert.AreEqual ([min0 .. max3 .. max0], [min0; min0 + max3]) + +[] +type RangeTests() = + [] member this.SByte () = RangeTestsHelpers.signed System.SByte.MinValue System.SByte.MaxValue + [] member this.Byte () = RangeTestsHelpers.unsigned System.Byte.MinValue System.Byte.MaxValue + [] member this.Int16 () = RangeTestsHelpers.signed System.Int16.MinValue System.Int16.MaxValue + [] member this.UInt16 () = RangeTestsHelpers.unsigned System.UInt16.MinValue System.UInt16.MaxValue + [] member this.Int32 () = RangeTestsHelpers.signed System.Int32.MinValue System.Int32.MaxValue + [] member this.UInt32 () = RangeTestsHelpers.unsigned System.UInt32.MinValue System.UInt32.MaxValue + [] member this.Int64 () = RangeTestsHelpers.signed System.Int64.MinValue System.Int64.MaxValue + [] member this.UInt64 () = RangeTestsHelpers.unsigned System.UInt64.MinValue System.UInt64.MaxValue + From 288ea4ce1d87f47b3e5a0def620661824e745881 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Wed, 16 Mar 2016 19:56:24 +1100 Subject: [PATCH 067/334] Fix throwing of exception After MoveNext has been returning false, we should have been throwing an exception. This has now been rectified. --- src/fsharp/FSharp.Core/prim-types.fs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 753c8bdb409..d6e261d8075 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -6594,6 +6594,9 @@ namespace Microsoft.FSharp.Core if !value < m then value := !value + LanguagePrimitives.GenericOne true + elif !value = m then + value := m + LanguagePrimitives.GenericOne + false else false } { new IEnumerable<'T> with From b293d596aaa10c33540910d16db9022f2a8a7afa Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Mar 2016 13:35:13 +0000 Subject: [PATCH 068/334] add module abbreviations and attribute declarations --- src/fsharp/FSComp.txt | 3 +- src/fsharp/TypeChecker.fs | 426 +++++++++++++++++++------------------- 2 files changed, 214 insertions(+), 215 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 8da52035e93..a9c04c907b8 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1274,4 +1274,5 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3197,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3198,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" 3199,tcRecImplied,"The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored" -3200,tcOpenFirstInMutRec,"'open' declarations must come first in a module in a recursive declaration group" +3200,tcOpenFirstInMutRec,"In a recursive declaration group, 'open' declarations must come first in each module" +3201,tcModuleAbbrevFirstInMutRec,"In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 591ec7da680..7564782d94d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3376,16 +3376,20 @@ let (|SimpleSemicolonSequence|_|) acceptDeprecated c = /// Represents the shape of a mutually recursive group of declarations including nested modules [] -type MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> = +type MutRecShape<'TypeData, 'LetsData, 'ModuleData, 'ModuleAbbrevData, 'OpenData> = | Tycon of 'TypeData | Lets of 'LetsData - | Module of 'ModuleData * MutRecShape<'TypeData, 'LetsData, 'ModuleData,'OpenData> list + | Module of 'ModuleData * MutRecShapes<'TypeData, 'LetsData, 'ModuleData, 'ModuleAbbrevData, 'OpenData> + | ModuleAbbrev of 'ModuleAbbrevData | Open of 'OpenData +and MutRecShapes<'TypeData, 'LetsData, 'ModuleData, 'ModuleAbbrevData, 'OpenData> = MutRecShape<'TypeData, 'LetsData, 'ModuleData, 'ModuleAbbrevData, 'OpenData> list + module MutRecShapes = let rec map f1 f2 f3 x = x |> List.map (function | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.ModuleAbbrev b -> MutRecShape.ModuleAbbrev b | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 a) | MutRecShape.Lets b -> MutRecShape.Lets (f2 b) | MutRecShape.Module (c,d) -> MutRecShape.Module (f3 c, map f1 f2 f3 d)) @@ -3396,18 +3400,20 @@ module MutRecShapes = let mapLets f2 xs = map id f2 id xs let mapModules f1 xs = map id id f1 xs - let rec mapWithEnv f1 f2 (env: 'Env) x = + let rec mapWithEnv fTycon fLets (env: 'Env) x = x |> List.map (function | MutRecShape.Open a -> MutRecShape.Open a - | MutRecShape.Tycon a -> MutRecShape.Tycon (f1 env a) - | MutRecShape.Lets b -> MutRecShape.Lets (f2 env b) - | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv f1 f2 env2 d)) + | MutRecShape.ModuleAbbrev a -> MutRecShape.ModuleAbbrev a + | MutRecShape.Tycon a -> MutRecShape.Tycon (fTycon env a) + | MutRecShape.Lets b -> MutRecShape.Lets (fLets env b) + | MutRecShape.Module ((c, env2),d) -> MutRecShape.Module ((c,env2), mapWithEnv fTycon fLets env2 d)) let mapTyconsWithEnv f1 env xs = mapWithEnv f1 (fun _env x -> x) env xs let rec mapWithParent parent f1 f2 f3 xs = xs |> List.map (function | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.ModuleAbbrev a -> MutRecShape.ModuleAbbrev a | MutRecShape.Tycon a -> MutRecShape.Tycon (f2 parent a) | MutRecShape.Lets b -> MutRecShape.Lets (f3 parent b) | MutRecShape.Module (c,d) -> @@ -3419,6 +3425,7 @@ module MutRecShapes = env, xs |> List.map (function | MutRecShape.Open a -> MutRecShape.Open a + | MutRecShape.ModuleAbbrev a -> MutRecShape.ModuleAbbrev a | MutRecShape.Tycon a -> MutRecShape.Tycon a | MutRecShape.Lets b -> MutRecShape.Lets b | MutRecShape.Module (c,ds) -> @@ -3467,24 +3474,27 @@ module MutRecShapes = let topTycons x = x |> List.choose (function MutRecShape.Tycon a -> Some a | _ -> None) - let rec iter f1 f2 f3 f4 x = + let rec iter f1 f2 f3 f4 f5 x = x |> List.iter (function | MutRecShape.Tycon a -> f1 a | MutRecShape.Lets b -> f2 b - | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 f4 d - | MutRecShape.Open a -> f4 a) + | MutRecShape.Module (c,d) -> f3 c; iter f1 f2 f3 f4 f5 d + | MutRecShape.Open a -> f4 a + | MutRecShape.ModuleAbbrev a -> f5 a) - let iterTycons f1 x = iter f1 ignore ignore ignore x - let iterModules f1 x = iter ignore ignore f1 ignore x + let iterTycons f1 x = iter f1 ignore ignore ignore ignore x + let iterTyconsAndLets f1 f2 x = iter f1 f2 ignore ignore ignore x + let iterModules f1 x = iter ignore ignore f1 ignore ignore x - let rec iterWithEnv f1 f2 f3 env x = + let rec iterWithEnv f1 f2 f3 f4 env x = x |> List.iter (function | MutRecShape.Tycon a -> f1 env a | MutRecShape.Lets b -> f2 env b - | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 f3 env d - | MutRecShape.Open a -> f3 env a) + | MutRecShape.Module ((_,env),d) -> iterWithEnv f1 f2 f3 f4 env d + | MutRecShape.Open a -> f3 env a + | MutRecShape.ModuleAbbrev a -> f4 env a) - let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) (fun _env _x -> ()) env xs + let iterTyconsWithEnv f1 env xs = iterWithEnv f1 (fun _env _x -> ()) (fun _env _x -> ()) (fun _env _x -> ()) env xs //------------------------------------------------------------------------- // Post-transform initialization graphs using the 'lazy' interpretation. @@ -3510,12 +3520,12 @@ let EliminateInitializationGraphs (getLetBinds: 'LetDataIn list -> PreInitializationGraphEliminationBinding list) (morphLetBinds: (PreInitializationGraphEliminationBinding list -> Binding list) -> 'LetDataIn list -> Binding list) g mustHaveArity denv - (fixupsAndBindingsWithoutLaziness : MutRecShape<_,_,_,_> list) bindsm = + (fixupsAndBindingsWithoutLaziness : MutRecShape<_,_,_,_,_> list) bindsm = let recursiveVals = let hash = ValHash.Create() let add (pgrbind: PreInitializationGraphEliminationBinding) = let c = pgrbind.Binding.Var in hash.Add(c,c) - fixupsAndBindingsWithoutLaziness |> MutRecShapes.iter (getTyconBinds >> List.iter add) (getLetBinds >> List.iter add) ignore ignore + fixupsAndBindingsWithoutLaziness |> MutRecShapes.iterTyconsAndLets (getTyconBinds >> List.iter add) (getLetBinds >> List.iter add) hash // The output of the analysis @@ -3650,7 +3660,7 @@ let EliminateInitializationGraphs let (TBind(v,e,_)) = pgrbind.Binding check (mkLocalValRef v) e availIfInOrder.Add(v, 1) - fixupsAndBindingsWithoutLaziness |> MutRecShapes.iter (getTyconBinds >> List.iter checkBind) (getLetBinds >> List.iter checkBind) ignore ignore + fixupsAndBindingsWithoutLaziness |> MutRecShapes.iterTyconsAndLets (getTyconBinds >> List.iter checkBind) (getLetBinds >> List.iter checkBind) end // ddg = definiteDependencyGraph @@ -3912,20 +3922,21 @@ type ValSpecResult = ValSpecResult of ParentRef * ValMemberInfoTransient option type RecDefnBindingInfo = RecDefnBindingInfo of ContainerInfo * NewSlotsOK * DeclKind * SynBinding -type MutRecDataForOpenDecl = MutRecDataForOpenDecl of LongIdent * range +type MutRecDataForOpen = MutRecDataForOpen of LongIdent * range +type MutRecDataForModuleAbbrev = MutRecDataForModuleAbbrev of Ident * LongIdent * range -type MutRecSigsInitialData = MutRecShape list -type MutRecDefnsInitialData = MutRecShape list +type MutRecSigsInitialData = MutRecShape list +type MutRecDefnsInitialData = MutRecShape list type MutRecDefnsPhase1DataForTycon = MutRecDefnsPhase1DataForTycon of SynComponentInfo * SynTypeDefnSimpleRepr * (SynType * range) list * preEstablishedHasDefaultCtor: bool * hasSelfReferentialCtor: bool * isAtOriginalTyconDefn: bool -type MutRecDefnsPhase1Data = MutRecShape list +type MutRecDefnsPhase1Data = MutRecShape list type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * ParentRef * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK type MutRecDefnsPhase2DataForModule = MutRecDefnsPhase2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace -type MutRecDefnsPhase2Data = MutRecShape list +type MutRecDefnsPhase2Data = MutRecShape list type MutRecDefnsPhase2InfoForTycon = MutRecDefnsPhase2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list -type MutRecDefnsPhase2Info = MutRecShape list +type MutRecDefnsPhase2Info = MutRecShape list /// RecursiveBindingInfo - flows through initial steps of TcLetrec @@ -12308,10 +12319,8 @@ module MutRecBindingChecking = type TyconBindingsPhase2A = | TyconBindingsPhase2A of Tycon option * DeclKind * Val list * TyconRef * Typar list * TType * TyconBindingPhase2A list - type MutRecBindingPhase2A = MutRecShape - /// The collected syntactic input definitions for a recursive group of type or type-extension definitions - type MutRecBindingsPhase2A = MutRecBindingPhase2A list + type MutRecDefnsPhase2AData = MutRecShape list /// Represents one element in a type definition, after the second phase type TyconBindingPhase2B = @@ -12330,9 +12339,7 @@ module MutRecBindingChecking = type TyconBindingsPhase2B = TyconBindingsPhase2B of Tycon option * TyconRef * TyconBindingPhase2B list - type MutRecBindingPhase2B = MutRecShape - - type MutRecBindingsPhase2B = MutRecBindingPhase2B list + type MutRecDefnsPhase2BData = MutRecShape list /// Represents one element in a type definition, after the third phase type TyconBindingPhase2C = @@ -12346,9 +12353,7 @@ module MutRecBindingChecking = type TyconBindingsPhase2C = TyconBindingsPhase2C of Tycon option * TyconRef * TyconBindingPhase2C list - type MutRecBindingPhase2C = MutRecShape - - type MutRecBindingsPhase2C = MutRecBindingPhase2C list + type MutRecDefnsPhase2CData = MutRecShape list @@ -12362,13 +12367,14 @@ module MutRecBindingChecking = // recBindIdx: index of the recursive binding // prelimRecValuesRev: accumulation of prelim value entries // uncheckedBindsRev: accumulation of unchecked bindings - let (defnsAs: MutRecBindingsPhase2A), (tpenv,_,uncheckedBindsRev) = + let (defnsAs: MutRecDefnsPhase2AData), (tpenv,_,uncheckedBindsRev) = let initialOuterState = (tpenv, 0, ([]: PreCheckingRecursiveBinding list)) - (initialOuterState, envMutRec, mutRecDefns) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defns -> + (initialOuterState, envMutRec, mutRecDefns) |||> MutRecShapes.mapFoldWithEnv (fun outerState envForDecls defn -> let (tpenv,recBindIdx,uncheckedBindsRev) = outerState - match defns with + match defn with | MutRecShape.Module _ -> failwith "unreachable" | MutRecShape.Open x -> MutRecShape.Open x, outerState + | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState | MutRecShape.Lets recBinds -> let normRecDefns = [ for (RecDefnBindingInfo(a,b,c,bind)) in recBinds do @@ -12526,9 +12532,9 @@ module MutRecBindingChecking = /// Phase2B: check each of the bindings, convert from ast to tast and collects type assertions. /// Also generalize incrementally. - let TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecBindingsPhase2A, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecBindingsPhase2B * _ * _ = + let TcMutRecBindings_Phase2B_TypeCheckAndIncrementalGeneralization cenv tpenv envInitial (envMutRec, defnsAs:MutRecDefnsPhase2AData, uncheckedRecBinds: PreCheckingRecursiveBinding list, scopem) : MutRecDefnsPhase2BData * _ * _ = - let (defnsBs: MutRecBindingsPhase2B), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = + let (defnsBs: MutRecDefnsPhase2BData), (tpenv, generalizedRecBinds, preGeneralizationRecBinds, _, _) = let uncheckedRecBindsTable = uncheckedRecBinds |> List.map (fun rbind -> rbind.RecBindingInfo.Val.Stamp, rbind) |> Map.ofList @@ -12558,6 +12564,7 @@ module MutRecBindingChecking = match defnsA with | MutRecShape.Module _ -> failwith "unreachable" | MutRecShape.Open x -> MutRecShape.Open x, outerState + | MutRecShape.ModuleAbbrev x -> MutRecShape.ModuleAbbrev x, outerState | MutRecShape.Lets binds -> let defnBs,(tpenv,_,envNonRec,generalizedRecBinds,preGeneralizationRecBinds,uncheckedRecBindsTable) = @@ -12734,7 +12741,7 @@ module MutRecBindingChecking = // Choose type scheme implicit constructors and adjust their recursive types. // Fixup recursive references to members. - let TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (denv, defnsBs: MutRecBindingsPhase2B, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = + let TcMutRecBindings_Phase2C_FixupRecursiveReferences cenv (denv, defnsBs: MutRecDefnsPhase2BData, generalizedTyparsForRecursiveBlock: Typar list, generalizedRecBinds: PostGeneralizationRecursiveBinding list, scopem) = // Build an index ---> binding map let generalizedBindingsMap = generalizedRecBinds |> List.map (fun pgrbind -> (pgrbind.RecBindingInfo.Index, pgrbind)) |> Map.ofList @@ -12785,7 +12792,7 @@ module MutRecBindingChecking = // --- Extract field bindings from let-bindings // --- Extract method bindings from let-bindings // --- Extract bindings for implicit constructors - let TcMutRecBindings_Phase2D_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecBindingsPhase2C) = + let TcMutRecBindings_Phase2D_ExtractImplicitFieldAndMethodBindings cenv envMutRec tpenv (denv, generalizedTyparsForRecursiveBlock, defnsCs: MutRecDefnsPhase2CData) = // let (fixupValueExprBinds, methodBinds) = (envMutRec, defnsCs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (TyconBindingsPhase2C(tyconOpt, tcref,defnCs)) -> @@ -12922,6 +12929,18 @@ module MutRecBindingChecking = let memberBindsWithFixups = defnCs |> List.choose (function Phase2CMember pgrbind -> Some pgrbind | _ -> None) tyconOpt, memberBindsWithFixups,[]) + /// Check a "module X = A.B.C" module abbreviation declaration + let TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) = + let ad = env.eAccessRights + let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) + let modrefs = mvvs |> List.map p23 + if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then + errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) + let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace) + modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) + let env = (if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env else env) + env + /// Compute the active environments within each nested module. let TcMutRecDefns_ComputeEnvs (cenv: cenv) report getTyconOpt scopem m envInitial mutRecShape = @@ -12929,15 +12948,17 @@ module MutRecBindingChecking = (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> - let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpenDecl (mp,m)) -> Some (mp,m) | _ -> None) let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) + let moduleAbbrevs = decls |> List.choose (function MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev (id,mp,m)) -> Some (id,mp,m) | _ -> None) + let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpen (mp,m)) -> Some (mp,m) | _ -> None) // Add the type definitions, exceptions, modules and "open" declarations let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envAbove else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) + let envForDecls = (envForDecls, moduleAbbrevs) ||> List.fold (TcModuleAbbrevDecl cenv scopem) envForDecls) /// Check the members and 'let' definitions in a mutually recursive group of definitions. @@ -14199,7 +14220,7 @@ module EstablishTypeDefinitionCores = // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_> list) = + let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14879,7 +14900,7 @@ module EstablishTypeDefinitionCores = | _ -> ()) - let TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (typeDefCores:MutRecShape list, m, scopem) = + let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent inSig tpenv (typeDefCores:MutRecShapes, m, scopem) = // Phase1A - build Entity for type definitions, exception definitions and module definitions. // Also for abbreviations of any of these. Augmentations are skipped in this phase. @@ -14904,7 +14925,7 @@ module EstablishTypeDefinitionCores = // Do this for each 'let' definition (just package up the data, no processing) (fun innerParent synBinds -> let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") - [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) + mkLetInfo containerInfo synBinds) // Phase1AB - Publish modules let envTmp, withEnvs = @@ -15345,7 +15366,10 @@ module TcDeclarations = begin let TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = let inSig = false let mutRecDefnsAfterSplit = SplitMutRecDefns mutRecDefns - let tycons, envMutRecPrelim, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) + let tycons, envMutRecPrelim, mutRecDefnsAfterCore = + EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 + (fun containerInfo synBinds -> [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) + cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) let mutRecDefnsAfterPrep = (envMutRecPrelim,mutRecDefnsAfterCore) @@ -15453,24 +15477,37 @@ module TcDeclarations = begin let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature - let private TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefns = - // TODO - need to collect the mutually recursive signature declarations when "rec" is used - // TODO - this is only checking the tycons in the signatures, need to do the module and let elements too - (envMutRec,mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), _, _) -> - let tpenv = emptyUnscopedTyparEnv - let (MutRecDefnsPhase1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore - let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo - let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath + let private TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefns = + (envMutRec,mutRecDefns) ||> MutRecShapes.mapWithEnv + // Do this for the members in each 'type' declaration + (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), _, _) -> + let tpenv = emptyUnscopedTyparEnv + let (MutRecDefnsPhase1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore + let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo + let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath - let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForDecls - let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon tcref (declKind = ExtrinsicExtensionBinding) + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForDecls + let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon tcref (declKind = ExtrinsicExtensionBinding) + + TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(innerParent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) + + // Do this for each 'val' declaration in a module + (fun envForDecls (containerInfo, valSpec) -> + let tpenv = emptyUnscopedTyparEnv + let idvs,_ = TcAndPublishValSpec (cenv,envForDecls,containerInfo,ModuleOrMemberBinding,None,tpenv,valSpec) + let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs envForDecls + env) - TcTyconMemberSpecs cenv envForTycon (TyconContainerInfo(innerParent, tcref, declaredTyconTypars, NoSafeInitInfo)) declKind tpenv members) let TcMutRecSignatureDecls cenv env parent tpenv (tspecs:MutRecSigsInitialData,m,scopem) = let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs - let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) - let _ = TcTyconSignatureMemberSpecs cenv envMutRec mutRecDefnsAfterCore + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) + + // Updates the types of the modules to contain the inferred contents to far, which includes values and members + mutRecDefnsAfterCore |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + + let _ = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefnsAfterCore envMutRec end @@ -15478,7 +15515,7 @@ end // Bind module types //------------------------------------------------------------------------- -let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = +let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) e : Eventually = eventually { try match e with @@ -15579,109 +15616,77 @@ let rec TcSignatureElement cenv parent endm (env: TcEnv) e : Eventually = return env } + and TcSignatureElements cenv parent endm env xml isRec defs = eventually { - // Ensure the deref_nlpath call in UpdateAccModuleOrNamespaceType succeeds + // Ensure the .Deref call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) if isRec then return! TcSignatureElementsMutRec cenv parent endm env defs else + return! TcSignatureElementsNonMutRec cenv parent endm env defs + } - return! Eventually.fold (TcSignatureElement cenv parent endm) env defs +and TcSignatureElementsNonMutRec cenv parent endm env defs = + eventually { + return! Eventually.fold (TcSignatureElementNonMutRec cenv parent endm) env defs } and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDecl list) = - eventually { - let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges - let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) - - let mutRecDefns = - let rec loop defs : MutRecSigsInitialData = - (true,defs) ||> List.collectFold (fun openOk def -> - match def with - | SynModuleSigDecl.Types (typeSpecs,_) -> - let decls = typeSpecs |> List.map MutRecShape.Tycon - decls, false - - | SynModuleSigDecl.Open (lid,m) -> - if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) - let decls = [ MutRecShape.Open (MutRecDataForOpenDecl(lid, m)) ] - decls, openOk - - | SynModuleSigDecl.Exception (SynExceptionSig(exnRepr,members,_),m) -> - if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) - let ( SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_,doc,vis,m)) = exnRepr - let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) - let decls = [ MutRecShape.Tycon(SynTypeDefnSig.TypeDefnSig(compInfo, SynTypeDefnSigRepr.Exception exnRepr, members, m)) ] - decls, openOk - - | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range))) - |> fst - loop defs - return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) - } - -(* // TODO: Note yet doing 'val' bindnigs or nested modules in recursive signatures - - | SynModuleSigDecl.Val (vspec,m) -> - let parentModule = + eventually { + let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges + let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) + + let mutRecDefns = + let rec loop defs : MutRecSigsInitialData = + ((true, true), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk) def -> + match def with + | SynModuleSigDecl.Types (typeSpecs,_) -> + let decls = typeSpecs |> List.map MutRecShape.Tycon + decls, (false, false) + + | SynModuleSigDecl.Open (lid,m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let decls = [ MutRecShape.Open (MutRecDataForOpen(lid, m)) ] + decls, (openOk, moduleAbbrevOk) + + | SynModuleSigDecl.Exception (SynExceptionSig(exnRepr,members,_),m) -> + if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + let ( SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_,doc,vis,m)) = exnRepr + let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) + let decls = [ MutRecShape.Tycon(SynTypeDefnSig.TypeDefnSig(compInfo, SynTypeDefnSigRepr.Exception exnRepr, members, m)) ] + decls, (false, false) + + | SynModuleSigDecl.Val (vspec,_) -> match parent with | ParentNone -> error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),vspec.RangeOfId)) - | Parent p -> p - let containerInfo = ModuleOrNamespaceContainerInfo(parentModule) - let idvs,_ = TcAndPublishValSpec (cenv,env,containerInfo,ModuleOrMemberBinding,None,emptyUnscopedTyparEnv,vspec) - let scopem = unionRanges m endm - let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs env - return env - - | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),isRec,mdefs,m) -> - let id = ComputeModuleName longPath - let vis,_ = ComputeAccessAndCompPath env None im vis parent - let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,isRec,true,mdefs,xml,attribs,vis,m) - let scopem = unionRanges m endm - PublishModuleDefn cenv env mspec; - let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec - return env - - | SynModuleSigDecl.ModuleAbbrev (id,p,m) -> - let ad = env.eAccessRights - let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) - let scopem = unionRanges m endm - let modrefs = mvvs |> List.map p23 - if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then - errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) - let modrefs = modrefs |> List.filter (fun modref -> not modref.IsNamespace) - modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) - - let env = - if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env - else env - return env - - | SynModuleSigDecl.HashDirective _ -> - return env - -*) - -(* - | SynModuleDecl.Let (letrec, binds, m) -> - if isNamespace then - CheckLetInNamespace binds m; [], false - else - if letrec then [MutRecShape.Lets binds], false - else List.map (List.singleton >> MutRecShape.Lets) binds, false - - | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,m) -> - if isRec then warning(Error(FSComp.SR.tcRecImplied(),m)) - let mutRecDefs = loop false synDefs - let decls = [MutRecShape.Module (compInfo, mutRecDefs)] - decls, false - - | SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> - -*) + | Parent _ -> () + let decls = [ MutRecShape.Lets(vspec) ] + decls, (false, false) + + | SynModuleSigDecl.NestedModule(compInfo,isRec,synDefs,_) -> + if isRec then warning(Error(FSComp.SR.tcRecImplied(),compInfo.Range)) + let mutRecDefs = loop synDefs + let decls = [MutRecShape.Module (compInfo, mutRecDefs)] + decls, (false, false) + + | SynModuleSigDecl.HashDirective _ -> + [], (openOk, moduleAbbrevOk) + + | SynModuleSigDecl.ModuleAbbrev (id, p, m) -> + if not moduleAbbrevOk then errorR(Error(FSComp.SR.tcModuleAbbrevFirstInMutRec(),m)) + let decls = [ MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev(id, p, m)) ] + decls, (false, moduleAbbrevOk) + + | SynModuleSigDecl.NamespaceFragment _ -> + error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),def.Range))) + + |> fst + loop defs + return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) + } and TcModuleOrNamespaceSignature cenv env (id:Ident,isRec,isModule,defs,xml,attribs,vis,m) = @@ -15726,17 +15731,6 @@ and TcModuleOrNamespaceSignatureElements cenv parent env (id,isRec,modKind,defs, // Bind definitions within modules //------------------------------------------------------------------------- -let TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) = - let ad = env.eAccessRights - let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.amap m OpenQualified env.eNameResEnv ad p) - let modrefs = mvvs |> List.map p23 - if modrefs.Length > 0 && modrefs |> List.forall (fun modref -> modref.IsNamespace) then - errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) - let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace) - modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) - let env = (if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env else env) - env - let ElimModuleDoBinding bind = match bind with @@ -15745,7 +15739,7 @@ let ElimModuleDoBinding bind = SynModuleDecl.Let(false,[bind2],m) | _ -> bind -let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_,_> list) env = +let TcMutRecDefnsEscapeCheck (binds: MutRecShapes<_,_,_,_,_>) env = let freeInEnv = GeneralizationHelpers.ComputeUnabstractableTycons env let checkTycon (tycon: Tycon) = if not tycon.IsTypeAbbrev && Zset.contains tycon freeInEnv then @@ -15761,16 +15755,16 @@ let TcMutRecDefnsEscapeCheck (binds: MutRecShape<_,_,_,_> list) env = let nm = bind.Var.DisplayName errorR(Error(FSComp.SR.tcMemberUsedInInvalidWay(nm, nm, nm), bind.Var.Range)) - binds |> MutRecShapes.iter (snd >> checkBinds) checkBinds ignore ignore + binds |> MutRecShapes.iterTyconsAndLets (snd >> checkBinds) checkBinds -let CheckLetInNamespace binds m = - match binds with - // ignore solitary '()' expressions and 'do ()' bindings, since these are allowed in namespaces - // for the purposes of attaching attributes to an assembly, e.g. - // namespace A.B.C - // [] - // do() +// ignore solitary '()' expressions and 'do ()' bindings, since these are allowed in namespaces +// for the purposes of attaching attributes to an assembly, e.g. +// namespace A.B.C +// [] +// do() +let CheckLetOrDoInNamespace binds m = + match binds with | [ Binding (None,(StandaloneExpression | DoBinding),false,false,[],_,_,_,None,(SynExpr.Do (SynExpr.Const (SynConst.Unit,_),_) | SynExpr.Const (SynConst.Unit,_)),_,_) ] -> () | [] -> @@ -15778,7 +15772,8 @@ let CheckLetInNamespace binds m = | _ -> error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),binds.Head.RangeOfHeadPat)) -let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((ModuleOrNamespaceExpr list -> ModuleOrNamespaceExpr list) * _) * tcEnv = +/// The non-mutually recursive case for a declaration +let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = eventually { cenv.synArgNameGenerator.Reset() let tpenv = emptyUnscopedTyparEnv @@ -15788,7 +15783,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu match ElimModuleDoBinding e with | SynModuleDecl.ModuleAbbrev (id,p,m) -> - let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) + let env = MutRecBindingChecking.TcModuleAbbrevDecl cenv scopem env (id,p,m) return ((fun e -> e), []), env, env | SynModuleDecl.Exception (edef,m) -> @@ -15802,7 +15797,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = TcMutRecDefnsEscapeCheck mutRecDefnsChecked env - TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e //(tycons,FlatList.ofList binds,[],m) :: e + TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e return (exprfWithEscapeCheck, []), envAfter, envAfter @@ -15815,7 +15810,7 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu match parent with | ParentNone -> - CheckLetInNamespace binds m + CheckLetOrDoInNamespace binds m return (id,[]), env, env | Parent parentModule -> @@ -15913,7 +15908,8 @@ let rec TcModuleOrNamespaceElement (cenv:cenv) parent scopem env e = // : ((Modu return ((fun e -> e), []), env, env } -and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) = +/// The non-mutually recursive case for a sequence of declarations +and TcModuleOrNamespaceElementsNonMutRec cenv parent endm (defsSoFar, env, envAtEnd) (moreDefs: SynModuleDecl list) = eventually { match moreDefs with | (firstDef :: otherDefs) -> @@ -15925,78 +15921,86 @@ and TcModuleOrNamespaceElementsAux cenv parent endm (defsSoFar, env, envAtEnd) ( // Possibly better: //let scopem = unionRanges h1.Range.EndRange endm - let! firstDef',env', envAtEnd' = TcModuleOrNamespaceElement cenv parent scopem env firstDef + let! firstDef',env', envAtEnd' = TcModuleOrNamespaceElementNonMutRec cenv parent scopem env firstDef // tail recursive - return! TcModuleOrNamespaceElementsAux cenv parent endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs + return! TcModuleOrNamespaceElementsNonMutRec cenv parent endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs | [] -> return List.rev defsSoFar,env, envAtEnd } +/// The mutually recursive case for a sequence of declarations (and nested modules) and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModuleDecl list) = eventually { let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) - let mutRecDefns = - let rec loop isNamespace defs : MutRecDefnsInitialData = - (true,defs) ||> List.collectFold (fun openOk def -> + let (mutRecDefns, (_, _, synAttrs)) = + let rec loop isNamespace attrs defs : (MutRecDefnsInitialData * _) = + ((true, true, attrs),defs) ||> List.collectFold (fun (openOk,moduleAbbrevOk,attrs) def -> match ElimModuleDoBinding def with | SynModuleDecl.Types (typeDefs,_) -> let decls = typeDefs |> List.map MutRecShape.Tycon - decls, false + decls, (false, false, attrs) | SynModuleDecl.Let (letrec, binds, m) -> - if isNamespace then - CheckLetInNamespace binds m; [], false - else - if letrec then [MutRecShape.Lets binds], false - else List.map (List.singleton >> MutRecShape.Lets) binds, false - - | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,m) -> - if isRec then warning(Error(FSComp.SR.tcRecImplied(),m)) - let mutRecDefs = loop false synDefs + let binds = + if isNamespace then + CheckLetOrDoInNamespace binds m; [] + else + if letrec then [MutRecShape.Lets binds] + else List.map (List.singleton >> MutRecShape.Lets) binds + binds, (false, false, attrs) + + | SynModuleDecl.NestedModule(compInfo, isRec, synDefs,_isContinuingModule,_) -> + if isRec then warning(Error(FSComp.SR.tcRecImplied(),compInfo.Range)) + let mutRecDefs, (_, _, attrs) = loop false attrs synDefs let decls = [MutRecShape.Module (compInfo, mutRecDefs)] - decls, false + decls, (false, false, attrs) | SynModuleDecl.Open (LongIdentWithDots(lid,_), m) -> if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) - let decls = [ MutRecShape.Open (MutRecDataForOpenDecl(lid, m)) ] - decls, openOk + let decls = [ MutRecShape.Open (MutRecDataForOpen(lid, m)) ] + decls, (openOk, moduleAbbrevOk, attrs) | SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) let decls = [ MutRecShape.Tycon(SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) ] - decls, openOk + decls, (false, false, attrs) + + | SynModuleDecl.HashDirective _ -> + [ ], (openOk, moduleAbbrevOk, attrs) - | d -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range))) - |> fst - //| SynModuleDecl.Attributes _ -> failwith "assembly attributes not allowed in mutrec sections yet" - //let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs - //return ((fun e -> e), attrs), env, env + | SynModuleDecl.Attributes (synAttrs,_) -> + [ ], (false, false, synAttrs) - //| SynModuleDecl.ModuleAbbrev _ -> failwith "module abbreviations not allowed in mutrec sections yet" - //let env = TcModuleAbbrevDecl (cenv:cenv) scopem env (id,p,m) - //return ((fun e -> e), []), env, env + | SynModuleDecl.ModuleAbbrev (id, p, m) -> + if not moduleAbbrevOk then errorR(Error(FSComp.SR.tcModuleAbbrevFirstInMutRec(),m)) + let decls = [ MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev(id, p, m)) ] + decls, (false, moduleAbbrevOk, attrs) + | SynModuleDecl.DoExpr _ -> failwith "unreachable: SynModuleDecl.DoExpr - ElimModuleDoBinding" - //| SynModuleDecl.HashDirective _ -> failwith "assembly attributes not allowed in mutrec sections yet" - //| SynModuleDecl.NamespaceFragment _ -> failwith "namespace fragments not allowed in mutrec sections yet" - //| SynModuleDecl.DoExpr _ -> failwith "unreachable" - loop (match parent with ParentNone -> true | Parent _ -> false) defs + | (SynModuleDecl.NamespaceFragment _ as d) -> error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),d.Range))) + + loop (match parent with ParentNone -> true | Parent _ -> false) [] defs let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns,m,scopem) + + // Check the assembly attributes + let attrs = TcAttributesWithPossibleTargets cenv envAfter AttributeTargets.Top synAttrs + // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e //return List.rev defsSoFar,env, envAtEnd - return [(exprfWithEscapeCheck,[])],envAfter, envAfter + return [(exprfWithEscapeCheck,attrs)],envAfter, envAfter } @@ -16005,16 +16009,13 @@ and TcMutRecDefsFinish cenv defs m = let binds = defs |> List.collect (function | MutRecShape.Open _ -> [] + | MutRecShape.ModuleAbbrev _ -> [] | MutRecShape.Tycon (_,binds) | MutRecShape.Lets binds -> binds |> List.map ModuleOrNamespaceBinding.Binding | MutRecShape.Module ((MutRecDefnsPhase2DataForModule(mtypeAcc, mspec), _),mdefs) -> let mexpr = TcMutRecDefsFinish cenv mdefs m - // Apply the functions for each declaration to build the overall expression-builder mspec.Data.entity_modul_contents <- notlazy !mtypeAcc - //let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) - // Collect up the attributes that are global to the file - //let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] [ ModuleOrNamespaceBinding.Module(mspec,mexpr) ]) TMDefRec(tycons,binds,m) @@ -16029,7 +16030,7 @@ and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = if isRec then TcModuleOrNamespaceElementsMutRec cenv parent endm env defs else - TcModuleOrNamespaceElementsAux cenv parent endm ([], env, env) defs + TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) @@ -16318,10 +16319,7 @@ let TypeCheckOneImplFile /// Check an entire signature file -let TypeCheckOneSigFile - (g,niceNameGen,amap,topCcu,checkForErrors,conditionalDefines,tcSink) - tcEnv - (ParsedSigFileInput(_,qualNameOfFile,_, _,sigFileFrags)) = +let TypeCheckOneSigFile (g,niceNameGen,amap,topCcu,checkForErrors,conditionalDefines,tcSink) tcEnv (ParsedSigFileInput(_,qualNameOfFile,_, _,sigFileFrags)) = eventually { let cenv = cenv.Create (g,false,niceNameGen,amap,topCcu,true,false,conditionalDefines,tcSink, (LightweightTcValForUsingInBuildMethodCall g)) let envinner,mtypeAcc = MakeInitialEnv tcEnv From 350d771d7daa4b468e30b0ceb3a1b3aacb05504f Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Mar 2016 13:52:08 +0000 Subject: [PATCH 069/334] update module abbreviations and attribute declarations --- src/fsharp/TypeChecker.fs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 7564782d94d..c70913e0800 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15640,7 +15640,7 @@ and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDec let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) let mutRecDefns = - let rec loop defs : MutRecSigsInitialData = + let rec loop isNamespace defs : MutRecSigsInitialData = ((true, true), defs) ||> List.collectFold (fun (openOk, moduleAbbrevOk) def -> match def with | SynModuleSigDecl.Types (typeSpecs,_) -> @@ -15652,23 +15652,20 @@ and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDec let decls = [ MutRecShape.Open (MutRecDataForOpen(lid, m)) ] decls, (openOk, moduleAbbrevOk) - | SynModuleSigDecl.Exception (SynExceptionSig(exnRepr,members,_),m) -> - if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) + | SynModuleSigDecl.Exception (SynExceptionSig(exnRepr,members,_),_) -> let ( SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_,doc,vis,m)) = exnRepr let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) let decls = [ MutRecShape.Tycon(SynTypeDefnSig.TypeDefnSig(compInfo, SynTypeDefnSigRepr.Exception exnRepr, members, m)) ] decls, (false, false) | SynModuleSigDecl.Val (vspec,_) -> - match parent with - | ParentNone -> error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),vspec.RangeOfId)) - | Parent _ -> () + if isNamespace then error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),vspec.RangeOfId)) let decls = [ MutRecShape.Lets(vspec) ] decls, (false, false) | SynModuleSigDecl.NestedModule(compInfo,isRec,synDefs,_) -> if isRec then warning(Error(FSComp.SR.tcRecImplied(),compInfo.Range)) - let mutRecDefs = loop synDefs + let mutRecDefs = loop false synDefs let decls = [MutRecShape.Module (compInfo, mutRecDefs)] decls, (false, false) @@ -15684,7 +15681,7 @@ and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDec error(Error(FSComp.SR.tcUnsupportedMutRecDecl(),def.Range))) |> fst - loop defs + loop (match parent with ParentNone -> true | Parent _ -> false) defs return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) } @@ -15965,7 +15962,6 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu decls, (openOk, moduleAbbrevOk, attrs) | SynModuleDecl.Exception (SynExceptionDefn(repr,members,_),_m) -> - if not openOk then errorR(Error(FSComp.SR.tcOpenFirstInMutRec(),m)) let (SynExceptionDefnRepr(synAttrs,UnionCase(_,id,_args,_,_,_),_repr,doc,vis,m)) = repr let compInfo = ComponentInfo(synAttrs,[],[],[id],doc,false,vis,id.idRange) let decls = [ MutRecShape.Tycon(SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) ] From 2b761308955221aa4af8e00caf87e82cf78d7858 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Mar 2016 14:21:50 +0000 Subject: [PATCH 070/334] fix for types in nested modules --- src/fsharp/TypeChecker.fs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c70913e0800..71c2d65236d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -3444,7 +3444,7 @@ module MutRecShapes = let dropEnvs xs = xs |> mapModules fst - let rec expandTycons f1 env xs = + let rec expandTyconsWithEnv f1 env xs = let preBinds, postBinds = xs |> List.map (fun elem -> match elem with @@ -3454,7 +3454,7 @@ module MutRecShapes = [MutRecShape.Lets (List.concat preBinds)] @ (xs |> List.map (fun elem -> match elem with - | MutRecShape.Module ((c,env2),d) -> MutRecShape.Module ((c,env2), expandTycons f1 env2 d) + | MutRecShape.Module ((c,env2),d) -> MutRecShape.Module ((c,env2), expandTyconsWithEnv f1 env2 d) | _ -> elem)) @ [MutRecShape.Lets (List.concat postBinds)] @@ -13684,7 +13684,7 @@ module TcExceptionDeclarations = let binds1,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) - let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, (mkLocalEntityRef exnc), None, NoSafeInitInfo, [], aug, m, NoNewSlots))] + let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots))] let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type @@ -13831,7 +13831,7 @@ module EstablishTypeDefinitionCores = /// but /// - we don't yet 'properly' establish constraints on type parameters let private TcTyconDefnCore_Phase1A_BuildInitialTycon cenv env parent (MutRecDefnsPhase1DataForTycon(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor, _)) = - let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo + let (ComponentInfo(_, synTypars, _, id, doc, preferPostfix, synVis, _)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) match synTyconRepr with @@ -13843,13 +13843,13 @@ module EstablishTypeDefinitionCores = // Augmentations of type definitions are allowed within the same file as long as no new type representation or abbreviation is given CheckForDuplicateConcreteType env id.idText id.idRange CheckForDuplicateModule env id.idText id.idRange - let vis,cpath = ComputeAccessAndCompPath env None id.idRange vis parent + let vis,cpath = ComputeAccessAndCompPath env None id.idRange synVis parent // Establish the visibility of the representation, e.g. // type R = // private { f:int } // member x.P = x.f + x.f - let visOfRepr = + let synVisOfRepr = match synTyconRepr with | SynTypeDefnSimpleRepr.None _ -> None | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None @@ -13860,7 +13860,7 @@ module EstablishTypeDefinitionCores = | SynTypeDefnSimpleRepr.Enum _ -> None | SynTypeDefnSimpleRepr.Exception _ -> None - let visOfRepr,_ = ComputeAccessAndCompPath env None id.idRange visOfRepr parent + let visOfRepr,_ = ComputeAccessAndCompPath env None id.idRange synVisOfRepr parent let visOfRepr = combineAccess vis visOfRepr // If we supported nested types and modules then additions would be needed here let lmtyp = notlazy (NewEmptyModuleOrNamespaceType ModuleOrType) @@ -14879,10 +14879,10 @@ module EstablishTypeDefinitionCores = CheckForDuplicateConcreteType envInitial id.idText im CheckNamespaceModuleOrTypeName cenv.g id - let _envinner, mtypeAcc = MakeInnerEnv envInitial id modKind + let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) let innerParent = Parent (mkLocalModRef mspec) - MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), innerParent + MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, envForDecls) // Interlude between Phase1D and Phase1E - Check and publish the explicit constraints. @@ -14907,23 +14907,23 @@ module EstablishTypeDefinitionCores = let withEntities = typeDefCores |> MutRecShapes.mapWithParent - parent + (parent, envInitial) // Do this for each module definition, building the initial Entity: - (fun innerParent modInfo -> - TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial innerParent modInfo) + (fun (innerParent, envForDecls) modInfo -> + TcTyconDefnCore_Phase1A_BuildInitialModule cenv envForDecls innerParent modInfo) // Do this for each type definition, building the initial Tycon: - (fun innerParent (typeDefCore,tyconMemberInfo) -> + (fun (innerParent, envForDecls) (typeDefCore,tyconMemberInfo) -> let (MutRecDefnsPhase1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = typeDefCore let tyconOpt = if isAtOriginalTyconDefn then - Some (TcTyconDefnCore_Phase1A_BuildInitialTycon cenv envInitial innerParent typeDefCore) + Some (TcTyconDefnCore_Phase1A_BuildInitialTycon cenv envForDecls innerParent typeDefCore) else None (typeDefCore, tyconMemberInfo, innerParent), tyconOpt) // Do this for each 'let' definition (just package up the data, no processing) - (fun innerParent synBinds -> + (fun (innerParent,_) synBinds -> let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") mkLetInfo containerInfo synBinds) @@ -15396,7 +15396,7 @@ module TcDeclarations = begin // Note: generating these bindings must come after generating the members, since some in the case of structs some fields // may be added by generating the implicit construction syntax let withExtraBindings = - (envFinal,withBindings) ||> MutRecShapes.expandTycons (fun envForDecls (tyconOpt, _) -> + (envFinal,withBindings) ||> MutRecShapes.expandTyconsWithEnv (fun envForDecls (tyconOpt, _) -> match tyconOpt with | None -> [],[] | Some tycon -> From 56d0707792fd38336474da8a0c36739370e834fb Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Mar 2016 15:29:03 +0000 Subject: [PATCH 071/334] fix bootstrap --- src/fsharp/TypeChecker.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 71c2d65236d..27620a4e4bc 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -11165,8 +11165,8 @@ and TcLetrec overridesOK cenv env tpenv (binds,bindsm,scopem) = let results = EliminateInitializationGraphs - (fun _ -> failwith "unreachable 2 - no type definitions in recursivve group") - (fun _ -> failwith "unreachable 3 - no type definitions in recursivve group") + (fun _ _ -> failwith "unreachable 2 - no type definitions in recursivve group") + (fun _ _ -> failwith "unreachable 3 - no type definitions in recursivve group") id (fun morpher oldBinds -> morpher oldBinds) cenv.g mustHaveArity env.DisplayEnv [MutRecShape.Lets bindsWithoutLaziness] bindsm From 6803ec03646654c89422d9cb174e5a012bff0f32 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Mar 2016 15:38:15 +0000 Subject: [PATCH 072/334] fix bootstrap (2) --- src/fsharp/TypeChecker.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 27620a4e4bc..e5c970e651e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -11165,7 +11165,7 @@ and TcLetrec overridesOK cenv env tpenv (binds,bindsm,scopem) = let results = EliminateInitializationGraphs - (fun _ _ -> failwith "unreachable 2 - no type definitions in recursivve group") + (fun _ -> failwith "unreachable 2 - no type definitions in recursivve group") (fun _ _ -> failwith "unreachable 3 - no type definitions in recursivve group") id (fun morpher oldBinds -> morpher oldBinds) From e00d1e52cad218fa6f23a1024dbb7c32a4467508 Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Sat, 19 Mar 2016 13:43:29 +1100 Subject: [PATCH 073/334] Additional tests covering remaining cases - singleStepRangeEnumerator cases - exceptions for variableStepRangeEnumerator - IntPtr & UIntPtr --- .../FSharp.Core/PrimTypes.fs | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs index dfc605519b1..e8b23e1de4d 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs @@ -688,15 +688,26 @@ type UnboxAndOptionStuff() = module internal RangeTestsHelpers = // strictly speaking, this is just undefined behaviour, but at some point the F# library decided that // it was an exception, so we are ensuring that such behaviour is retained - let inline regressionExceptionBeforeStart n = - let sequence = seq { n .. n } + let inline regressionExceptionBeforeStartSingleStepRangeEnumerator zero one = + let sequence = seq { zero .. one .. one } + let enumerator = sequence.GetEnumerator() + enumerator.Current |> ignore + + let inline regressionExceptionBeforeStartVariableStepIntegralRange zero two = + let sequence = seq { zero .. two .. two } let enumerator = sequence.GetEnumerator() enumerator.Current |> ignore // strictly speaking, this is just undefined behaviour, but at some point the F# library decided that // it was an exception, so we are ensuring that such behaviour is retained - let inline regressionExceptionAfterEnd n = - let sequence = seq { n .. n } + let inline regressionExceptionAfterEndSingleStepRangeEnumerator zero one = + let sequence = seq { zero .. one .. one } + let enumerator = sequence.GetEnumerator() + while enumerator.MoveNext () do ignore () + enumerator.Current |> ignore + + let inline regressionExceptionAfterEndVariableStepIntegralRange zero two = + let sequence = seq { zero .. two .. two } let enumerator = sequence.GetEnumerator() while enumerator.MoveNext () do ignore () enumerator.Current |> ignore @@ -704,8 +715,10 @@ module internal RangeTestsHelpers = let inline exceptions zero one two = Assert.Throws (typeof, (fun () -> [one .. zero .. two] |> List.length |> ignore)) |> ignore - Assert.Throws (typeof, (fun () -> regressionExceptionBeforeStart zero)) |> ignore - Assert.Throws (typeof, (fun () -> regressionExceptionAfterEnd zero)) |> ignore + Assert.Throws (typeof, (fun () -> regressionExceptionBeforeStartSingleStepRangeEnumerator zero one)) |> ignore + Assert.Throws (typeof, (fun () -> regressionExceptionBeforeStartVariableStepIntegralRange zero two)) |> ignore + Assert.Throws (typeof, (fun () -> regressionExceptionAfterEndSingleStepRangeEnumerator zero one)) |> ignore + Assert.Throws (typeof, (fun () -> regressionExceptionAfterEndVariableStepIntegralRange zero two)) |> ignore let inline common (min0, min1, min2, min3) (max0, max1, max2, max3) (zero, one, two, three) = Assert.AreEqual ([min0 .. min3], [min0; min1; min2; min3]) @@ -725,6 +738,11 @@ module internal RangeTestsHelpers = exceptions zero one two + // tests for singleStepRangeEnumerator, as it only is used if start and/or end are not the + // minimum or maximum of the number range and it is counting by 1s + Assert.AreEqual ([min1 .. min3], [min1; min2; min3]) + Assert.AreEqual ([max3 .. max1], [max3; max2; max1]) + let inline signed min0 max0 = let zero = LanguagePrimitives.GenericZero let one = LanguagePrimitives.GenericOne @@ -795,3 +813,14 @@ type RangeTests() = [] member this.Int64 () = RangeTestsHelpers.signed System.Int64.MinValue System.Int64.MaxValue [] member this.UInt64 () = RangeTestsHelpers.unsigned System.UInt64.MinValue System.UInt64.MaxValue + [] + member this.IntPtr () = + if System.IntPtr.Size >= 4 then RangeTestsHelpers.signed (System.IntPtr System.Int32.MinValue) (System.IntPtr System.Int32.MaxValue) + if System.IntPtr.Size >= 8 then RangeTestsHelpers.signed (System.IntPtr System.Int64.MinValue) (System.IntPtr System.Int64.MaxValue) + + [] + member this.UIntPtr () = + if System.UIntPtr.Size >= 4 then RangeTestsHelpers.unsigned (System.UIntPtr System.UInt32.MinValue) (System.UIntPtr System.UInt32.MaxValue) + if System.UIntPtr.Size >= 8 then RangeTestsHelpers.unsigned (System.UIntPtr System.UInt64.MinValue) (System.UIntPtr System.UInt64.MaxValue) + + From a698a979b5b3b9d86dab0cc3a7fa616cc230c14b Mon Sep 17 00:00:00 2001 From: Paul Westcott Date: Sat, 19 Mar 2016 13:55:59 +1100 Subject: [PATCH 074/334] Nicer naming for Visual Studio's "Test Explorer" Well maybe it can be configured, but just shows the method name, not the class, so prepended Range to the names, which appears to be a mostly followed naming convention for tests. --- .../FSharp.Core/PrimTypes.fs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs index e8b23e1de4d..5e792e8d723 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/PrimTypes.fs @@ -804,22 +804,22 @@ module internal RangeTestsHelpers = [] type RangeTests() = - [] member this.SByte () = RangeTestsHelpers.signed System.SByte.MinValue System.SByte.MaxValue - [] member this.Byte () = RangeTestsHelpers.unsigned System.Byte.MinValue System.Byte.MaxValue - [] member this.Int16 () = RangeTestsHelpers.signed System.Int16.MinValue System.Int16.MaxValue - [] member this.UInt16 () = RangeTestsHelpers.unsigned System.UInt16.MinValue System.UInt16.MaxValue - [] member this.Int32 () = RangeTestsHelpers.signed System.Int32.MinValue System.Int32.MaxValue - [] member this.UInt32 () = RangeTestsHelpers.unsigned System.UInt32.MinValue System.UInt32.MaxValue - [] member this.Int64 () = RangeTestsHelpers.signed System.Int64.MinValue System.Int64.MaxValue - [] member this.UInt64 () = RangeTestsHelpers.unsigned System.UInt64.MinValue System.UInt64.MaxValue + [] member __.``Range.SByte`` () = RangeTestsHelpers.signed System.SByte.MinValue System.SByte.MaxValue + [] member __.``Range.Byte`` () = RangeTestsHelpers.unsigned System.Byte.MinValue System.Byte.MaxValue + [] member __.``Range.Int16`` () = RangeTestsHelpers.signed System.Int16.MinValue System.Int16.MaxValue + [] member __.``Range.UInt16`` () = RangeTestsHelpers.unsigned System.UInt16.MinValue System.UInt16.MaxValue + [] member __.``Range.Int32`` () = RangeTestsHelpers.signed System.Int32.MinValue System.Int32.MaxValue + [] member __.``Range.UInt32`` () = RangeTestsHelpers.unsigned System.UInt32.MinValue System.UInt32.MaxValue + [] member __.``Range.Int64`` () = RangeTestsHelpers.signed System.Int64.MinValue System.Int64.MaxValue + [] member __.``Range.UInt64`` () = RangeTestsHelpers.unsigned System.UInt64.MinValue System.UInt64.MaxValue [] - member this.IntPtr () = + member __.``Range.IntPtr`` () = if System.IntPtr.Size >= 4 then RangeTestsHelpers.signed (System.IntPtr System.Int32.MinValue) (System.IntPtr System.Int32.MaxValue) if System.IntPtr.Size >= 8 then RangeTestsHelpers.signed (System.IntPtr System.Int64.MinValue) (System.IntPtr System.Int64.MaxValue) [] - member this.UIntPtr () = + member __.``Range.UIntPtr`` () = if System.UIntPtr.Size >= 4 then RangeTestsHelpers.unsigned (System.UIntPtr System.UInt32.MinValue) (System.UIntPtr System.UInt32.MaxValue) if System.UIntPtr.Size >= 8 then RangeTestsHelpers.unsigned (System.UIntPtr System.UInt64.MinValue) (System.UIntPtr System.UInt64.MaxValue) From e88de601f3fead9d7185781a9c7b05d53086cbf4 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Thu, 7 Apr 2016 00:31:47 -0700 Subject: [PATCH 075/334] Implement CallerLineInfo for F#-style optional args --- src/fsharp/ConstraintSolver.fs | 4 ++-- src/fsharp/NicePrint.fs | 2 +- src/fsharp/PostInferenceChecks.fs | 14 ++++++++++++-- src/fsharp/TcGlobals.fs | 5 ++++- src/fsharp/TypeChecker.fs | 16 ++++++++++------ src/fsharp/TypeRelations.fs | 7 +++++-- src/fsharp/infos.fs | 29 ++++++++++++++++++++--------- 7 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index eeb87a4b7b1..04e5a825e26 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -1849,7 +1849,7 @@ and CanMemberSigsMatchUpToCheck if isArray1DTy g calledArg.CalledArgumentType then let paramArrayElemTy = destArrayTy g calledArg.CalledArgumentType let reflArgInfo = calledArg.ReflArgInfo // propgate the reflected-arg info to each param array argument - calledMeth.ParamArrayCallerArgs |> OptionD (IterateD (fun callerArg -> subsumeArg (CalledArg((0,0),false,NotOptional,false,None,reflArgInfo,paramArrayElemTy)) callerArg)) + calledMeth.ParamArrayCallerArgs |> OptionD (IterateD (fun callerArg -> subsumeArg (CalledArg((0,0),false,NotOptional,NoCallerInfo,false,None,reflArgInfo,paramArrayElemTy)) callerArg)) else CompleteD) @@ -1872,7 +1872,7 @@ and CanMemberSigsMatchUpToCheck let calledArgTy = rfinfo.FieldType rfinfo.Name, calledArgTy - subsumeArg (CalledArg((-1, 0), false, NotOptional, false, Some (mkSynId m name), ReflectedArgInfo.None, calledArgTy)) caller) )) ++ (fun () -> + subsumeArg (CalledArg((-1, 0), false, NotOptional, NoCallerInfo, false, Some (mkSynId m name), ReflectedArgInfo.None, calledArgTy)) caller) )) ++ (fun () -> // - Always take the return type into account for // -- op_Explicit, op_Implicit diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 0705d0eeae2..a9b829834c6 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -1194,7 +1194,7 @@ module InfoMemberPrinting = /// Format the arguments of a method to a buffer. /// /// This uses somewhat "old fashioned" printf-style buffer printing. - let formatParamDataToBuffer denv os (ParamData(isParamArray, _isOutArg, optArgInfo, nmOpt, _reflArgInfo, pty)) = + let formatParamDataToBuffer denv os (ParamData(isParamArray, _isOutArg, optArgInfo, _callerInfoInfo, nmOpt, _reflArgInfo, pty)) = let isOptArg = optArgInfo.IsOptional match isParamArray, nmOpt, isOptArg, tryDestOptionTy denv.g pty with // Layout an optional argument diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 8ab4f90b485..1de489a19ba 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1315,10 +1315,20 @@ let CheckEntityDefn cenv env (tycon:Entity) = if minfo.NumArgs.Length > 1 && (minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) - |> List.existsSquared (fun (ParamData(isParamArrayArg, isOutArg, optArgInfo, _, reflArgInfo, ty)) -> - isParamArrayArg || isOutArg || reflArgInfo.AutoQuote || optArgInfo.IsOptional || isByrefTy cenv.g ty)) then + |> List.existsSquared (fun (ParamData(isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, _, reflArgInfo, ty)) -> + isParamArrayArg || isOutArg || reflArgInfo.AutoQuote || optArgInfo.IsOptional || callerInfoInfo <> NoCallerInfo || isByrefTy cenv.g ty)) then errorR(Error(FSComp.SR.chkCurriedMethodsCantHaveOutParams(), m)) + if minfo.NumArgs.Length = 1 then + minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) + |> List.iterSquared (fun (ParamData(_, _, optArgInfo, callerInfoInfo, _, _, ty)) -> + match (optArgInfo, callerInfoInfo) with + | _, NoCallerInfo + | CallerSide(_), CallerLineNumber when (typeEquiv cenv.g cenv.g.int32_ty ty) -> () + | CalleeSide, CallerLineNumber when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.int32_ty (destOptionTy cenv.g ty)) -> () + | _ -> errorR(Error((1234, "Bogus caller info definition"), m)) + ) + for pinfo in immediateProps do let nm = pinfo.PropertyName let m = (match pinfo.ArbitraryValRef with None -> m | Some vref -> vref.DefinitionRange) diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index b9174acb89b..c99f8c27f12 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -300,6 +300,8 @@ type public TcGlobals = attrib_PreserveSigAttribute : BuiltinAttribInfo option attrib_MethodImplAttribute : BuiltinAttribInfo attrib_ExtensionAttribute : BuiltinAttribInfo + attrib_CallerLineNumberAttribute : BuiltinAttribInfo + tcref_System_Collections_Generic_IList : TyconRef tcref_System_Collections_Generic_IReadOnlyList : TyconRef tcref_System_Collections_Generic_ICollection : TyconRef @@ -1202,7 +1204,8 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa attrib_PreserveSigAttribute = mkSystemRuntimeInteropServicesAttribute "System.Runtime.InteropServices.PreserveSigAttribute" attrib_MethodImplAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.MethodImplAttribute" attrib_ExtensionAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.ExtensionAttribute" - + attrib_CallerLineNumberAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerLineNumberAttribute" + attrib_ProjectionParameterAttribute = mk_MFCore_attrib "ProjectionParameterAttribute" attrib_CustomOperationAttribute = mk_MFCore_attrib "CustomOperationAttribute" attrib_NonSerializedAttribute = if ilg.traits.NonSerializedAttributeScopeRef.IsSome then Some(mkSystemRuntimeAttrib "System.NonSerializedAttribute") else None diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 96022bb7da0..574094ac821 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -8680,7 +8680,7 @@ and TcMethodApplication let denv = env.DisplayEnv - let isSimpleFormalArg (isParamArrayArg, isOutArg, optArgInfo: OptionalArgInfo, _reflArgInfo: ReflectedArgInfo) = + let isSimpleFormalArg (isParamArrayArg, isOutArg, optArgInfo: OptionalArgInfo, _callerInfoInfo: CallerInfoInfo, _reflArgInfo: ReflectedArgInfo) = not isParamArrayArg && not isOutArg && not optArgInfo.IsOptional let callerObjArgTys = objArgs |> List.map (tyOfExpr cenv.g) @@ -9040,7 +9040,7 @@ and TcMethodApplication if HasHeadType cenv.g cenv.g.tcref_System_Collections_Generic_Dictionary finalCalledMethInfo.EnclosingType && finalCalledMethInfo.IsConstructor && not (finalCalledMethInfo.GetParamDatas(cenv.amap, mItem, finalCalledMeth.CallerTyArgs) - |> List.existsSquared (fun (ParamData(_,_,_,_,_,ty)) -> + |> List.existsSquared (fun (ParamData(_,_,_,_,_,_,ty)) -> HasHeadType cenv.g cenv.g.tcref_System_Collections_Generic_IEqualityComparer ty)) then match argsOfAppTy cenv.g finalCalledMethInfo.EnclosingType with @@ -9191,13 +9191,18 @@ and TcMethodApplication let wrapper2,rhs = build currCalledArgTy dfltVal2 (wrapper2 >> mkCompGenLet mMethExpr v rhs), mkValAddr mMethExpr (mkLocalValRef v) build calledArgTy dfltVal - | CalleeSide -> + | CalleeSide -> let calledNonOptTy = if isOptionTy cenv.g calledArgTy then destOptionTy cenv.g calledArgTy else calledArgTy // should be unreachable - emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) + + match calledArg.CallerInfoInfo with + | CallerLineNumber when typeEquiv cenv.g calledNonOptTy cenv.g.int_ty -> + let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[lineExpr],mMethExpr) + | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) // Combine the variable allocators (if any) let wrapper = (wrapper >> wrapper2) @@ -9207,12 +9212,11 @@ and TcMethodApplication // Handle optional arguments let wrapOptionalArg (assignedArg: AssignedCalledArg<_>) = - let (CallerArg(callerArgTy,m,isOptCallerArg,expr)) = assignedArg.CallerArg + let (CallerArg(callerArgTy,m,isOptCallerArg,expr)) = assignedArg.CallerArg match assignedArg.CalledArg.OptArgInfo with | NotOptional -> if isOptCallerArg then errorR(Error(FSComp.SR.tcFormalArgumentIsNotOptional(),m)) assignedArg - | _ -> let expr = match assignedArg.CalledArg.OptArgInfo with diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs index 443ae5812c6..46a7090f15b 100755 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -1517,15 +1517,17 @@ type CalledArg = { Position: (int * int) IsParamArray : bool OptArgInfo : OptionalArgInfo + CallerInfoInfo : CallerInfoInfo IsOutArg: bool ReflArgInfo: ReflectedArgInfo NameOpt: Ident option CalledArgumentType : TType } -let CalledArg(pos,isParamArray,optArgInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = +let CalledArg(pos,isParamArray,optArgInfo,callerInfoInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = { Position=pos IsParamArray=isParamArray OptArgInfo =optArgInfo + CallerInfoInfo = callerInfoInfo IsOutArg=isOutArg ReflArgInfo=reflArgInfo NameOpt=nameOpt @@ -1653,10 +1655,11 @@ type CalledMethArgSet<'T> = let MakeCalledArgs amap m (minfo:MethInfo) minst = // Mark up the arguments with their position, so we can sort them back into order later let paramDatas = minfo.GetParamDatas(amap, m, minst) - paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,nmOpt,reflArgInfo,typeOfCalledArg)) -> + paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,callerInfoFlags,nmOpt,reflArgInfo,typeOfCalledArg)) -> { Position=(i,j) IsParamArray=isParamArrayArg OptArgInfo=optArgInfo + CallerInfoInfo=callerInfoFlags IsOutArg=isOutArg ReflArgInfo=reflArgInfo NameOpt=nmOpt diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 3d685ecab50..f8b9ba411ea 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -513,6 +513,12 @@ type OptionalArgInfo = else NotOptional +type CallerInfoInfo = + | NoCallerInfo + | CallerLineNumber + | CallerMemberName + | CallerFilePath + [] type ReflectedArgInfo = | None @@ -535,8 +541,8 @@ type ParamNameAndType = [] /// Full information about a parameter returned for use by the type checker and language service. type ParamData = - /// ParamData(isParamArray, isOut, optArgInfo, nameOpt, reflArgInfo, ttype) - ParamData of bool * bool * OptionalArgInfo * Ident option * ReflectedArgInfo * TType + /// ParamData(isParamArray, isOut, optArgInfo, callerInfoInfo, nameOpt, reflArgInfo, ttype) + ParamData of bool * bool * OptionalArgInfo * CallerInfoInfo * Ident option * ReflectedArgInfo * TType //------------------------------------------------------------------------- @@ -1271,8 +1277,11 @@ type MethInfo = | _ -> ReflectedArgInfo.None let isOutArg = (p.IsOut && not p.IsIn) // Note: we get default argument values from VB and other .NET language metadata - let optArgInfo = OptionalArgInfo.FromILParameter g amap m ilMethInfo.MetadataScope ilMethInfo.DeclaringTypeInst p - yield (isParamArrayArg, isOutArg, optArgInfo, reflArgInfo) ] ] + let optArgInfo = OptionalArgInfo.FromILParameter g amap m ilMethInfo.MetadataScope ilMethInfo.DeclaringTypeInst p + let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute p.CustomAttrs + let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber else NoCallerInfo + + yield (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo) ] ] | FSMeth(g,_,vref,_) -> GetArgInfosOfMember x.IsCSharpStyleExtensionMember g vref @@ -1286,7 +1295,9 @@ type MethInfo = let isOptArg = HasFSharpAttribute g g.attrib_OptionalArgumentAttribute argInfo.Attribs // Note: can't specify caller-side default arguments in F#, by design (default is specified on the callee-side) let optArgInfo = if isOptArg then CalleeSide else NotOptional - (isParamArrayArg, isOutArg, optArgInfo, reflArgInfo)) + let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs + let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber else NoCallerInfo + (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo)) | DefaultStructCtor _ -> [[]] @@ -1302,7 +1313,7 @@ type MethInfo = | Some ([ Some (:? bool as b) ], _) -> ReflectedArgInfo.Quote b | Some _ -> ReflectedArgInfo.Quote false | None -> ReflectedArgInfo.None - yield (isParamArrayArg, p.PUntaint((fun p -> p.IsOut), m), optArgInfo, reflArgInfo)] ] + yield (isParamArrayArg, p.PUntaint((fun p -> p.IsOut), m), optArgInfo, NoCallerInfo, reflArgInfo)] ] #endif @@ -1401,8 +1412,8 @@ type MethInfo = #endif let paramAttribs = x.GetParamAttribs(amap, m) - (paramAttribs,paramNamesAndTypes) ||> List.map2 (List.map2 (fun (isParamArrayArg,isOutArg,optArgInfo,reflArgInfo) (ParamNameAndType(nmOpt,pty)) -> - ParamData(isParamArrayArg,isOutArg,optArgInfo,nmOpt,reflArgInfo,pty))) + (paramAttribs,paramNamesAndTypes) ||> List.map2 (List.map2 (fun (isParamArrayArg,isOutArg,optArgInfo,callerInfoInfo,reflArgInfo) (ParamNameAndType(nmOpt,pty)) -> + ParamData(isParamArrayArg,isOutArg,optArgInfo,callerInfoInfo,nmOpt,reflArgInfo,pty))) /// Select all the type parameters of the declaring type of a method. @@ -1927,7 +1938,7 @@ type PropInfo = /// Get the details of the indexer parameters associated with the property member x.GetParamDatas(amap,m) = x.GetParamNamesAndTypes(amap,m) - |> List.map (fun (ParamNameAndType(nmOpt,pty)) -> ParamData(false, false, NotOptional, nmOpt, ReflectedArgInfo.None, pty)) + |> List.map (fun (ParamNameAndType(nmOpt,pty)) -> ParamData(false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, pty)) /// Get the types of the indexer parameters associated with the property member x.GetParamTypes(amap,m) = From f4f6bf926a5260ed730167c5381270e49494abd0 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Thu, 7 Apr 2016 10:06:52 -0700 Subject: [PATCH 076/334] Fix incorrect when guard in bogus args check --- src/fsharp/PostInferenceChecks.fs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 1de489a19ba..6cc8298b27e 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1310,24 +1310,25 @@ let CheckEntityDefn cenv env (tycon:Entity) = else errorR(Error(FSComp.SR.chkDuplicateMethodWithSuffix(nm),m)) - if minfo.NumArgs.Length > 1 && others |> List.exists (fun minfo2 -> not (IsAbstractDefaultPair2 minfo minfo2)) then + let numCurriedArgSets = minfo.NumArgs.Length + + if numCurriedArgSets > 1 && others |> List.exists (fun minfo2 -> not (IsAbstractDefaultPair2 minfo minfo2)) then errorR(Error(FSComp.SR.chkDuplicateMethodCurried nm,m)) - if minfo.NumArgs.Length > 1 && + if numCurriedArgSets > 1 && (minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) |> List.existsSquared (fun (ParamData(isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, _, reflArgInfo, ty)) -> isParamArrayArg || isOutArg || reflArgInfo.AutoQuote || optArgInfo.IsOptional || callerInfoInfo <> NoCallerInfo || isByrefTy cenv.g ty)) then errorR(Error(FSComp.SR.chkCurriedMethodsCantHaveOutParams(), m)) - if minfo.NumArgs.Length = 1 then + if numCurriedArgSets = 1 then minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) |> List.iterSquared (fun (ParamData(_, _, optArgInfo, callerInfoInfo, _, _, ty)) -> match (optArgInfo, callerInfoInfo) with - | _, NoCallerInfo + | _, NoCallerInfo -> () | CallerSide(_), CallerLineNumber when (typeEquiv cenv.g cenv.g.int32_ty ty) -> () | CalleeSide, CallerLineNumber when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.int32_ty (destOptionTy cenv.g ty)) -> () - | _ -> errorR(Error((1234, "Bogus caller info definition"), m)) - ) + | _ -> errorR(Error((1234, "Bogus caller info definition"), m))) for pinfo in immediateProps do let nm = pinfo.PropertyName From 445887af8dd89897af315554d0d654f732a633d5 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Thu, 7 Apr 2016 14:03:34 -0700 Subject: [PATCH 077/334] Support CallerLineInfo for C#-style caller-side optional args --- src/fsharp/TypeChecker.fs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 574094ac821..db22e4cbf24 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9169,7 +9169,12 @@ and TcMethodApplication | ByrefTy cenv.g inst -> build inst (PassByRef(inst, currDfltVal)) | _ -> - emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) + match calledArg.CallerInfoInfo with + | CallerLineNumber when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> + emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) + | _ -> + emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) + | WrapperForIDispatch -> match cenv.g.ilg.traits.SystemRuntimeInteropServicesScopeRef.Value with | None -> error(Error(FSComp.SR.fscSystemRuntimeInteropServicesIsRequired(), mMethExpr)) From fb16599c302187e332a859c98d5729a7e994ce78 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 8 Apr 2016 01:23:59 +0300 Subject: [PATCH 078/334] implement CallerFilePath --- src/fsharp/PostInferenceChecks.fs | 2 ++ src/fsharp/TcGlobals.fs | 2 ++ src/fsharp/TypeChecker.fs | 5 +++++ src/fsharp/infos.fs | 3 ++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 6cc8298b27e..1e9bc81204e 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1328,6 +1328,8 @@ let CheckEntityDefn cenv env (tycon:Entity) = | _, NoCallerInfo -> () | CallerSide(_), CallerLineNumber when (typeEquiv cenv.g cenv.g.int32_ty ty) -> () | CalleeSide, CallerLineNumber when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.int32_ty (destOptionTy cenv.g ty)) -> () + | CallerSide(_), CallerFilePath when (typeEquiv cenv.g cenv.g.string_ty ty) -> () + | CalleeSide, CallerFilePath when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.string_ty (destOptionTy cenv.g ty)) -> () | _ -> errorR(Error((1234, "Bogus caller info definition"), m))) for pinfo in immediateProps do diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index c99f8c27f12..2a9b7a496f0 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -301,6 +301,7 @@ type public TcGlobals = attrib_MethodImplAttribute : BuiltinAttribInfo attrib_ExtensionAttribute : BuiltinAttribInfo attrib_CallerLineNumberAttribute : BuiltinAttribInfo + attrib_CallerFilePathAttribute : BuiltinAttribInfo tcref_System_Collections_Generic_IList : TyconRef tcref_System_Collections_Generic_IReadOnlyList : TyconRef @@ -1205,6 +1206,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa attrib_MethodImplAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.MethodImplAttribute" attrib_ExtensionAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.ExtensionAttribute" attrib_CallerLineNumberAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerLineNumberAttribute" + attrib_CallerFilePathAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerFilePathAttribute" attrib_ProjectionParameterAttribute = mk_MFCore_attrib "ProjectionParameterAttribute" attrib_CustomOperationAttribute = mk_MFCore_attrib "CustomOperationAttribute" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index db22e4cbf24..835dd2fdb8d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9172,6 +9172,8 @@ and TcMethodApplication match calledArg.CallerInfoInfo with | CallerLineNumber when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) + | CallerFilePath when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> + emptyPreBinder,Expr.Const(Const.String(mMethExpr.FileName), mMethExpr, currCalledArgTy) | _ -> emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) @@ -9207,6 +9209,9 @@ and TcMethodApplication | CallerLineNumber when typeEquiv cenv.g calledNonOptTy cenv.g.int_ty -> let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[lineExpr],mMethExpr) + | CallerFilePath when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> + let filePathExpr = Expr.Const(Const.String(mMethExpr.FileName), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) // Combine the variable allocators (if any) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index f8b9ba411ea..9a0fc58f855 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1296,7 +1296,8 @@ type MethInfo = // Note: can't specify caller-side default arguments in F#, by design (default is specified on the callee-side) let optArgInfo = if isOptArg then CalleeSide else NotOptional let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs - let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber else NoCallerInfo + let isCallerFilePathArg = HasFSharpAttribute g g.attrib_CallerFilePathAttribute argInfo.Attribs + let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber elif isCallerFilePathArg then CallerFilePath else NoCallerInfo (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo)) | DefaultStructCtor _ -> From 4999c7e9f81d1825bb66d44b0bf7d17ad32a3ac2 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Thu, 14 Apr 2016 09:53:35 -0700 Subject: [PATCH 079/334] Add simple test for CallerLineNumber --- .../Imported/CallerInfo/CallerLineNumber.fs | 14 ++++++++++++++ .../Imported/CallerInfo/env.lst | 2 ++ tests/fsharpqa/Source/test.lst | 1 + 3 files changed, 17 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs new file mode 100644 index 00000000000..259f8d12bb6 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -0,0 +1,14 @@ +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerLineNumber([] ?line : int) = + line + +module Program = + [] + let main (_:string[]) = + match MyTy.GetCallerLineNumber() with + | Some(12) -> 0 + | _ -> 1 diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst new file mode 100644 index 00000000000..241d1ee66a5 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -0,0 +1,2 @@ + SOURCE=CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # CallerLineNumber.fs + diff --git a/tests/fsharpqa/Source/test.lst b/tests/fsharpqa/Source/test.lst index 624a477c9d2..d8afce454b2 100644 --- a/tests/fsharpqa/Source/test.lst +++ b/tests/fsharpqa/Source/test.lst @@ -224,6 +224,7 @@ Conformance08 Conformance\PatternMatching\Wildcard Conformance08 Conformance\Signatures\SignatureConformance Conformance08 Conformance\Signatures\SignatureTypes Conformance08 Conformance\SpecialAttributesAndTypes\Imported\System.ThreadStatic +Conformance08 Conformance\SpecialAttributesAndTypes\Imported\CallerInfo Conformance08 Conformance\TypesAndTypeConstraints\CheckingSyntacticTypes Conformance08 Conformance\TypesAndTypeConstraints\LogicalPropertiesOfTypes Conformance08 Conformance\TypesAndTypeConstraints\TypeConstraints From c9c54a13d3159827eef57f95ca58542a1f61e385 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 15 Apr 2016 01:14:27 +0300 Subject: [PATCH 080/334] Add simple test for CallerFilePath --- .../Imported/CallerInfo/CallerFilePath.fs | 14 ++++++++++++++ .../Imported/CallerInfo/env.lst | 1 + 2 files changed, 15 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs new file mode 100644 index 00000000000..80b093039e7 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -0,0 +1,14 @@ +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerFilePath([] ?path : string) = + path + +module Program = + [] + let main (_:string[]) = + match MyTy.GetCallerFilePath() with + | Some(path) when path.EndsWith("Conformance\SpecialAttributesAndTypes\Imported\CallerInfo\CallerFilePath.fs") -> 0 + | _ -> 1 diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 241d1ee66a5..8ef55b903c9 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -1,2 +1,3 @@ SOURCE=CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # CallerLineNumber.fs + SOURCE=CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # CallerFilePath.fs From 08224bcd6db32e46c4655564e2d9c82cc8b5282b Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Sat, 16 Apr 2016 23:07:12 +0300 Subject: [PATCH 081/334] add test for ignore the compiler value and add negativ tests --- .../Imported/CallerInfo/CallerFilePath.fs | 4 ++-- .../Imported/CallerInfo/CallerLineNumber.fs | 4 ++-- .../Imported/CallerInfo/E_CallerFilePath.fs | 12 ++++++++++++ .../Imported/CallerInfo/E_CallerLineNumber.fs | 12 ++++++++++++ .../Imported/CallerInfo/env.lst | 2 ++ 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index 80b093039e7..f28edf8a674 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -9,6 +9,6 @@ type MyTy() = module Program = [] let main (_:string[]) = - match MyTy.GetCallerFilePath() with - | Some(path) when path.EndsWith("Conformance\SpecialAttributesAndTypes\Imported\CallerInfo\CallerFilePath.fs") -> 0 + match MyTy.GetCallerFilePath(), MyTy.GetCallerFilePath("42") with + | Some(path), Some("42") when path.EndsWith("Conformance\SpecialAttributesAndTypes\Imported\CallerInfo\CallerFilePath.fs") -> 0 | _ -> 1 diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index 259f8d12bb6..24a3ca209a0 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -9,6 +9,6 @@ type MyTy() = module Program = [] let main (_:string[]) = - match MyTy.GetCallerLineNumber() with - | Some(12) -> 0 + match MyTy.GetCallerLineNumber(), MyTy.GetCallerLineNumber(42) with + | Some(12), Some(42) -> 0 | _ -> 1 diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs new file mode 100644 index 00000000000..cdb317997b3 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs @@ -0,0 +1,12 @@ +//Bogus caller info definition +//Bogus caller info definition +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerFilePathNotString([] ?path : int) = + path + + static member GetCallerFilePathNotOptional([] path : string) = + path \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs new file mode 100644 index 00000000000..13ac4118ea8 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs @@ -0,0 +1,12 @@ +//Bogus caller info definition +//Bogus caller info definition +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerLineNumberNotInt([] ?line : string) = + line + + static member GetCallerLineNumberNotOptional([] line : string) = + line \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 8ef55b903c9..5815e90e52e 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -1,3 +1,5 @@ SOURCE=CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # CallerLineNumber.fs SOURCE=CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # CallerFilePath.fs + SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs + SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs From d8662a3d93c5bf52d2bd8fc8d7330e8491922b5b Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Mon, 18 Apr 2016 15:37:36 -0700 Subject: [PATCH 082/334] Escape backslashes --- .../Imported/CallerInfo/CallerFilePath.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index f28edf8a674..d7d5732ffc5 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -10,5 +10,5 @@ module Program = [] let main (_:string[]) = match MyTy.GetCallerFilePath(), MyTy.GetCallerFilePath("42") with - | Some(path), Some("42") when path.EndsWith("Conformance\SpecialAttributesAndTypes\Imported\CallerInfo\CallerFilePath.fs") -> 0 + | Some(path), Some("42") when path.EndsWith("Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs") -> 0 | _ -> 1 From 1ec094ffd6fd2697865c0935ba87a2750283da96 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Mon, 18 Apr 2016 16:17:00 -0700 Subject: [PATCH 083/334] Add tests covering C#-style optional parameters --- .../Imported/CallerInfo/CSharpLib.cs | 23 +++++++++++++ .../Imported/CallerInfo/CallerFilePath.fs | 33 +++++++++++++++++-- .../Imported/CallerInfo/CallerLineNumber.fs | 21 ++++++++++-- .../Imported/CallerInfo/env.lst | 4 +-- 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs new file mode 100644 index 00000000000..ee1c7d4f834 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs @@ -0,0 +1,23 @@ +using System; +using System.Runtime.CompilerServices; + +namespace CSharpLib +{ + public class CallerInfoTest + { + public static int LineNumber([CallerLineNumber] int line = 777) + { + return line; + } + + public static string FilePath([CallerFilePath] string filePath = "dummy1") + { + return filePath; + } + + public static Tuple AllInfo(int normalArg, [CallerFilePath] string filePath = "dummy2", [CallerLineNumber] int line = 778) + { + return new Tuple(filePath, line); + } + } +} \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index d7d5732ffc5..f305304fff0 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -1,14 +1,41 @@ namespace Test open System.Runtime.CompilerServices +open CSharpLib type MyTy() = static member GetCallerFilePath([] ?path : string) = path module Program = + let matchesPath path (s : string) = + s.EndsWith(path) + && not (s.Contains("\\\\")) + && not (path.Contains("\\.\\")) + && not (path.Contains("\\..\\")) + + [] let main (_:string[]) = - match MyTy.GetCallerFilePath(), MyTy.GetCallerFilePath("42") with - | Some(path), Some("42") when path.EndsWith("Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs") -> 0 - | _ -> 1 + + match MyTy.GetCallerFilePath() with + | Some(path) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | x -> failwithf "Unexpected: %A" x + + match MyTy.GetCallerFilePath("42") with + | Some("42") -> () + | x -> failwithf "Unexpected: %A" x + + match CallerInfoTest.FilePath() with + | path when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | x -> failwithf "Unexpected: %A" x + + match CallerInfoTest.FilePath("xyz") with + | "xyz" -> () + | x -> failwithf "Unexpected: %A" x + + match CallerInfoTest.AllInfo(21) with + | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index 24a3ca209a0..f30d42dfba1 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -1,6 +1,7 @@ namespace Test open System.Runtime.CompilerServices +open CSharpLib type MyTy() = static member GetCallerLineNumber([] ?line : int) = @@ -9,6 +10,20 @@ type MyTy() = module Program = [] let main (_:string[]) = - match MyTy.GetCallerLineNumber(), MyTy.GetCallerLineNumber(42) with - | Some(12), Some(42) -> 0 - | _ -> 1 + if MyTy.GetCallerLineNumber() <> Some(13) then + failwith "Unexpected F# CallerLineNumber" + + if MyTy.GetCallerLineNumber(42) <> Some(42) then + failwith "Unexpected F# CallerLineNumber" + + if CallerInfoTest.LineNumber() <> 19 then + failwith "Unexpected C# CallerLineNumber" + + if CallerInfoTest.LineNumber(88) <> 88 then + failwith "Unexpected C# CallerLineNumber" + + match CallerInfoTest.AllInfo(21) with + | (_, 25) -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 5815e90e52e..bb430c0b586 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -1,5 +1,5 @@ - SOURCE=CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # CallerLineNumber.fs - SOURCE=CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # CallerFilePath.fs + SOURCE=CallerLineNumber.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerLineNumber.fs + SOURCE=CallerFilePath.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerFilePath.fs SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs From e5ddc394f82ee3036207a916215a70d7a17ea586 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Mon, 18 Apr 2016 17:25:31 -0700 Subject: [PATCH 084/334] Update error reporting for caller info attributes --- src/fsharp/FSComp.txt | 4 +++- src/fsharp/PostInferenceChecks.fs | 19 ++++++++++++++----- src/fsharp/infos.fs | 7 +++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index ab16418c8b9..e65b744a439 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -256,7 +256,7 @@ chkUnionCaseDefaultAugmentation,"default augmentation of the union case" 438,chkDuplicateMethod,"Duplicate method. The method '%s' has the same name and signature as another method in this type." 438,chkDuplicateMethodWithSuffix,"Duplicate method. The method '%s' has the same name and signature as another method in this type once tuples, functions, units of measure and/or provided types are erased." 439,chkDuplicateMethodCurried,"The method '%s' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments." -440,chkCurriedMethodsCantHaveOutParams,"Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments" +440,chkCurriedMethodsCantHaveOutParams,"Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments" 441,chkDuplicateProperty,"Duplicate property. The property '%s' has the same name and signature as another property in this type." 441,chkDuplicatePropertyWithSuffix,"Duplicate property. The property '%s' has the same name and signature as another property in this type once tuples, functions, units of measure and/or provided types are erased." 442,chkDuplicateMethodInheritedType,"Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type." @@ -1063,6 +1063,8 @@ lexIndentOffForML,"Consider using a file with extension '.ml' or '.mli' instead" 1243,parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString,"Unexpected quotation operator '<@' in type definition. If you intend to pass a verbatim string as a static argument to a type provider, put a space between the '<' and '@' characters." 1244,parsErrorParsingAsOperatorName,"Attempted to parse this as an operator name, but failed" 1245,lexInvalidUnicodeLiteral,"\U%s is not a valid Unicode character escape sequence" +1246,tcCallerInfoWrongType,"'%s' must be applied to an argument of type '%s', but has been applied to an argument of type '%s'" +1247,tcCallerInfoNotOptional,"'%s' can only be applied to optional arguments" # Fsc.exe resource strings fscTooManyErrors,"Exiting - too many errors" 2001,docfileNoXmlSuffix,"The documentation file has no .xml suffix" diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 1e9bc81204e..872749a9dd0 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1326,11 +1326,20 @@ let CheckEntityDefn cenv env (tycon:Entity) = |> List.iterSquared (fun (ParamData(_, _, optArgInfo, callerInfoInfo, _, _, ty)) -> match (optArgInfo, callerInfoInfo) with | _, NoCallerInfo -> () - | CallerSide(_), CallerLineNumber when (typeEquiv cenv.g cenv.g.int32_ty ty) -> () - | CalleeSide, CallerLineNumber when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.int32_ty (destOptionTy cenv.g ty)) -> () - | CallerSide(_), CallerFilePath when (typeEquiv cenv.g cenv.g.string_ty ty) -> () - | CalleeSide, CallerFilePath when (isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.string_ty (destOptionTy cenv.g ty)) -> () - | _ -> errorR(Error((1234, "Bogus caller info definition"), m))) + | NotOptional, _ -> errorR(Error(FSComp.SR.tcCallerInfoNotOptional(callerInfoInfo.ToString()),m)) + | CallerSide(_), CallerLineNumber -> + if not (typeEquiv cenv.g cenv.g.int32_ty ty) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv ty),m)) + | CalleeSide, CallerLineNumber -> + if not ((isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.int32_ty (destOptionTy cenv.g ty))) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "int", NicePrint.minimalStringOfType cenv.denv (destOptionTy cenv.g ty)),m)) + | CallerSide(_), CallerFilePath -> + if not (typeEquiv cenv.g cenv.g.string_ty ty) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty),m)) + | CalleeSide, CallerFilePath -> + if not ((isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.string_ty (destOptionTy cenv.g ty))) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy cenv.g ty)),m)) + | _ -> failwith "impossible") for pinfo in immediateProps do let nm = pinfo.PropertyName diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 9a0fc58f855..d36edbdba5f 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -519,6 +519,13 @@ type CallerInfoInfo = | CallerMemberName | CallerFilePath + override x.ToString() = + match x with + | NoCallerInfo -> "NoCallerInfo" + | CallerLineNumber -> "CallerLineNumber" + | CallerMemberName -> "CallerMemberName" + | CallerFilePath -> "CallerFilePath" + [] type ReflectedArgInfo = | None From 5b607d4d323e3d58b367c1c3f4501380adfcaa24 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 07:45:58 +0300 Subject: [PATCH 085/334] fix ILMeth read CallerFilePathAttribute --- src/fsharp/infos.fs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index d36edbdba5f..10854c75fcd 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1286,7 +1286,8 @@ type MethInfo = // Note: we get default argument values from VB and other .NET language metadata let optArgInfo = OptionalArgInfo.FromILParameter g amap m ilMethInfo.MetadataScope ilMethInfo.DeclaringTypeInst p let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute p.CustomAttrs - let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber else NoCallerInfo + let isCallerFilePathArg = TryFindILAttribute g.attrib_CallerFilePathAttribute p.CustomAttrs + let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber elif isCallerFilePathArg then CallerFilePath else NoCallerInfo yield (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo) ] ] From 29a8271c762bf1cbb2a18a19c24ca4e45e363b03 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 07:52:07 +0300 Subject: [PATCH 086/334] fix expected test error message --- .../Imported/CallerInfo/E_CallerFilePath.fs | 4 ++-- .../Imported/CallerInfo/E_CallerLineNumber.fs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs index cdb317997b3..8eccc449b8d 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs @@ -1,5 +1,5 @@ -//Bogus caller info definition -//Bogus caller info definition +//'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerFilePath' can only be applied to optional arguments namespace Test open System.Runtime.CompilerServices diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs index 13ac4118ea8..b89004e0214 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs @@ -1,5 +1,5 @@ -//Bogus caller info definition -//Bogus caller info definition +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'string' +//'CallerLineNumber' can only be applied to optional arguments namespace Test open System.Runtime.CompilerServices From b7235bbb64d631bcd5fb6989ec7f25c07b9eeb11 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 08:15:34 +0300 Subject: [PATCH 087/334] fix error message --- .../MemberDeclarations/E_byref_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_optional_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_out_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_paramarray_two_arguments_curried.fsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx index 2f99a7564d3..68bd6ad5b0b 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // Out arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments$ +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments type Misc2() = static member M (foo : int byref) (bar : int byref) = foo <- 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx index 20786eb74ec..f788556262b 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // optional arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments$ +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments type Misc0() = static member M (?foo : int) (?bar : int) = 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx index 4f167735666..b7754e95dde 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // Out arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments$ +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments type Misc2() = static member M ([] foo : int byref) ([] bar : int byref) = foo <- 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx index fea11eebf66..5840eee3a07 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // ParamArray arguments - non curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments$ +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments type Misc0() = static member M ([] args : string[]) ([] argc : int) = args.Length + argc From 6bf9dc5dd19d7ad5de9745852e47742f780da1d0 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 08:39:50 +0300 Subject: [PATCH 088/334] add caller file path tests for contructor --- .../Imported/CallerInfo/CallerFilePath.fs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index f305304fff0..2806aadf5b0 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -3,7 +3,11 @@ namespace Test open System.Runtime.CompilerServices open CSharpLib -type MyTy() = +type MyTy([] ?p0 : string) = + let mutable p = p0 + + member x.Path with get() = p + static member GetCallerFilePath([] ?path : string) = path @@ -17,7 +21,17 @@ module Program = [] let main (_:string[]) = - + let o = MyTy() + let o1 = MyTy("42") + + match o.Path with + | Some(path) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | x -> failwithf "Unexpected: %A" x + + match o1.Path with + | Some(path) when matchesPath "42" path -> () + | x -> failwithf "Unexpected: %A" x + match MyTy.GetCallerFilePath() with | Some(path) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () | x -> failwithf "Unexpected: %A" x From 19a5762f7d51fc05e3524827139027d1711dfa6d Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 19:48:17 +0300 Subject: [PATCH 089/334] fix test error message --- tests/fsharp/typecheck/sigs/neg23.bsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg23.bsl b/tests/fsharp/typecheck/sigs/neg23.bsl index 1d21a9a9a41..f817caa2ef0 100644 --- a/tests/fsharp/typecheck/sigs/neg23.bsl +++ b/tests/fsharp/typecheck/sigs/neg23.bsl @@ -27,9 +27,9 @@ neg23.fs(82,18,82,20): typecheck error FS0439: The method 'X0' has curried argum neg23.fs(85,18,85,21): typecheck error FS0439: The method 'X01' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. -neg23.fs(88,18,88,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments +neg23.fs(88,18,88,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments -neg23.fs(90,18,90,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition' or 'byref' arguments +neg23.fs(90,18,90,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments neg23.fs(93,18,93,21): typecheck error FS0439: The method 'X04' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. From d2869bebfcb6a6e6f33325a77dc0934adbcd6b8f Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 19 Apr 2016 19:54:44 +0300 Subject: [PATCH 090/334] change caller file path to return full path --- src/fsharp/TypeChecker.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 835dd2fdb8d..58bae7943a5 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9173,7 +9173,7 @@ and TcMethodApplication | CallerLineNumber when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> - emptyPreBinder,Expr.Const(Const.String(mMethExpr.FileName), mMethExpr, currCalledArgTy) + emptyPreBinder,Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) | _ -> emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) @@ -9210,7 +9210,7 @@ and TcMethodApplication let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[lineExpr],mMethExpr) | CallerFilePath when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> - let filePathExpr = Expr.Const(Const.String(mMethExpr.FileName), mMethExpr, calledNonOptTy) + let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) From 367ebc5036167502c484b83d32dde5045ce4d205 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 15 Apr 2016 12:00:35 -0700 Subject: [PATCH 091/334] Combined all vsix into one. --- build-everything.proj | 2 +- .../EnableOpenSource.pkgdef | 0 .../Desktop/Source.extension.vsixmanifest} | 16 +- .../Local/Source.extension.vsixmanifest} | 9 +- .../Pro/Source.extension.vsixmanifest} | 16 +- .../Web/Source.extension.vsixmanifest} | 16 +- .../VisualFSharpVsix.csproj} | 144 ++++++------ .../Properties/AssemblyInfo.cs | 21 -- .../VWDExpressDeployTemplates.csproj | 210 ------------------ .../extension.vsixlangpack | 8 - .../VsProDeployTemplates.csproj | 209 ----------------- .../extension.vsixlangpack | 8 - .../WDExpressDeployTemplates.csproj | 210 ------------------ .../extension.vsixlangpack | 9 - ...fsharp-vsintegration-deployment-build.proj | 16 -- .../fsharp-vsintegration-vsix-build.proj | 32 +++ 16 files changed, 146 insertions(+), 780 deletions(-) rename vsintegration/{deployment/EnableOpenSource => VisualFSharpVsix}/EnableOpenSource.pkgdef (100%) rename vsintegration/{deployment/VWDExpressDeployTemplates/source.extension.vsixmanifest => VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest} (59%) rename vsintegration/{deployment/EnableOpenSource/source.extension.vsixmanifest => VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest} (96%) rename vsintegration/{deployment/VsProDeployTemplates/source.extension.vsixmanifest => VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest} (64%) rename vsintegration/{deployment/WDExpressDeployTemplates/source.extension.vsixmanifest => VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest} (58%) rename vsintegration/{deployment/EnableOpenSource/EnableOpenSource.csproj => VisualFSharpVsix/VisualFSharpVsix.csproj} (77%) delete mode 100644 vsintegration/deployment/EnableOpenSource/Properties/AssemblyInfo.cs delete mode 100644 vsintegration/deployment/VWDExpressDeployTemplates/VWDExpressDeployTemplates.csproj delete mode 100644 vsintegration/deployment/VWDExpressDeployTemplates/extension.vsixlangpack delete mode 100644 vsintegration/deployment/VsProDeployTemplates/VsProDeployTemplates.csproj delete mode 100644 vsintegration/deployment/VsProDeployTemplates/extension.vsixlangpack delete mode 100644 vsintegration/deployment/WDExpressDeployTemplates/WDExpressDeployTemplates.csproj delete mode 100644 vsintegration/deployment/WDExpressDeployTemplates/extension.vsixlangpack delete mode 100644 vsintegration/fsharp-vsintegration-deployment-build.proj create mode 100644 vsintegration/fsharp-vsintegration-vsix-build.proj diff --git a/build-everything.proj b/build-everything.proj index 9a44b8ee9de..c79e243066f 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -25,7 +25,7 @@ - + diff --git a/vsintegration/deployment/EnableOpenSource/EnableOpenSource.pkgdef b/vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef similarity index 100% rename from vsintegration/deployment/EnableOpenSource/EnableOpenSource.pkgdef rename to vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef diff --git a/vsintegration/deployment/VWDExpressDeployTemplates/source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest similarity index 59% rename from vsintegration/deployment/VWDExpressDeployTemplates/source.extension.vsixmanifest rename to vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest index 50d0ef52f69..b9ccf201f07 100644 --- a/vsintegration/deployment/VWDExpressDeployTemplates/source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio Express for Web @@ -13,6 +13,20 @@ + + + + + + + + + + + + + + diff --git a/vsintegration/deployment/EnableOpenSource/source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest similarity index 96% rename from vsintegration/deployment/EnableOpenSource/source.extension.vsixmanifest rename to vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest index fc8315e890e..319de5f21a1 100644 --- a/vsintegration/deployment/EnableOpenSource/source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest @@ -2,13 +2,12 @@ - - Microsoft.VisualFSharpTools.EnableOpenSource - Enable FSharp.VS.FSI. - License.txt + + Visual F# Tools Templates + Deploy Visual F# Tools templates to Visual Studio - + diff --git a/vsintegration/deployment/VsProDeployTemplates/source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest similarity index 64% rename from vsintegration/deployment/VsProDeployTemplates/source.extension.vsixmanifest rename to vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest index e08e9d6dd8d..43153e93e1f 100644 --- a/vsintegration/deployment/VsProDeployTemplates/source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio @@ -13,6 +13,20 @@ + + + + + + + + + + + + + + diff --git a/vsintegration/deployment/WDExpressDeployTemplates/source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest similarity index 58% rename from vsintegration/deployment/WDExpressDeployTemplates/source.extension.vsixmanifest rename to vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest index f42d726ca2a..8f2470d3812 100644 --- a/vsintegration/deployment/WDExpressDeployTemplates/source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio Express for Windows Desktop @@ -13,6 +13,20 @@ + + + + + + + + + + + + + + diff --git a/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj similarity index 77% rename from vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj rename to vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 17902cd9247..533adf9f60c 100644 --- a/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -1,14 +1,18 @@  - + - ..\..\..\src + ..\..\src + ..\src 15.0 + net40 11.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 12.0 + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} publish\ true @@ -17,26 +21,10 @@ Foreground 7 Days - false + true false true 0 - 1.0.0.%2a - false - false - true - Debug - AnyCPU - - - - 2.0 - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7} - Library - Properties - EnableOpenSource - EnableOpenSource v4.6 false false @@ -44,46 +32,44 @@ false false false - ..\..\.. - + false + false + true None - False - True - - - Program - $(DevEnvDir)devenv.exe - /rootsuffix FSharp /log - FSharp - true - - + Debug + AnyCPU + false + Library + Properties + FSharp Program $(DevEnvDir)devenv.exe - /rootsuffix FSharp /log - FSharp true + /rootsuffix $(VSRootSuffix) /log + $(VSRootSuffix) + Local + VisualFSharpVsix.$(BuildSku) + VisualFSharpVsix.$(BuildSku) + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\vsix\$(BuildSku) + 15.4.1.0 + cs + + + - - - - + Designer - - - PreserveNewest - true - - - + + Always true + False @@ -101,6 +87,7 @@ false + {649FA588-F02E-457C-9FCF-87E46407481E} @@ -150,172 +137,172 @@ DebugSymbolsProjectOutputGroup%3b false - + {6BA13AA4-C25F-480F-856B-8E8000299A72} AppConfig ItemTemplates false TemplateProjectOutputGroup%3b - + {12AC2813-E895-4AAA-AE6C-94E21DA09F64} CodeFile ItemTemplates false TemplateProjectOutputGroup%3b - + {17716AF4-D439-4C74-8326-475FB1847DF2} ODataServiceConnection ItemTemplates false TemplateProjectOutputGroup%3b - + {A333B85A-DC23-49B6-9797-B89A7951E92D} ScriptFile ItemTemplates false TemplateProjectOutputGroup%3b - + {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} SignatureFile ItemTemplates false TemplateProjectOutputGroup%3b - + {35E83EDF-CC5A-441D-8949-17AACC463CA4} SqlDataConnection ItemTemplates false TemplateProjectOutputGroup%3b - + {A2CDA945-EF31-4C37-A063-BD1E2B3938EB} SqlEntityConnection ItemTemplates false TemplateProjectOutputGroup%3b - + {D11FC318-8F5D-4C8C-9287-AB40A016D13C} TextFile ItemTemplates false TemplateProjectOutputGroup%3b - + {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} WsdlServiceConnection ItemTemplates false TemplateProjectOutputGroup%3b - + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} XMLFile ItemTemplates false TemplateProjectOutputGroup%3b - + {604F0DAA-2D33-48DD-B162-EDF0B672803D} ConsoleProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} LibraryProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} NetCoreProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} NetCore78Project ProjectTemplates false TemplateProjectOutputGroup%3b - + {D9D95330-3626-4199-B7AF-17B8E4AF6D87} NetCore259Project ProjectTemplates false TemplateProjectOutputGroup%3b - + {DB374A0C-7560-479F-9B21-D37C81F7624F} PortableLibraryProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} SilverlightProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} TutorialProject ProjectTemplates false TemplateProjectOutputGroup%3b - + {65e0e82a-eace-4787-8994-888674c2fe87} FSharp.Editor - + {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF} FSharp.LanguageService.Base BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false - + {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F} FSharp.LanguageService BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false - + {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7} ProjectSystem.Base BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false - + {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44} ProjectSystem BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false - + {FCFB214C-462E-42B3-91CA-FC557EFEE74F} FSharp.PropertiesPages BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false - + {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} FSharp.VS.FSI BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b @@ -323,15 +310,12 @@ false - - CSharp - - - \ No newline at end of file diff --git a/vsintegration/deployment/EnableOpenSource/Properties/AssemblyInfo.cs b/vsintegration/deployment/EnableOpenSource/Properties/AssemblyInfo.cs deleted file mode 100644 index 30e66c58d33..00000000000 --- a/vsintegration/deployment/EnableOpenSource/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("EnableOpenSource")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("EnableOpenSource")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] diff --git a/vsintegration/deployment/VWDExpressDeployTemplates/VWDExpressDeployTemplates.csproj b/vsintegration/deployment/VWDExpressDeployTemplates/VWDExpressDeployTemplates.csproj deleted file mode 100644 index 4fe9611b2fd..00000000000 --- a/vsintegration/deployment/VWDExpressDeployTemplates/VWDExpressDeployTemplates.csproj +++ /dev/null @@ -1,210 +0,0 @@ - - - - - 15.0 - 11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - 12.0 - SAK - SAK - SAK - SAK - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - $(NoWarn);2008 - - - - Debug - AnyCPU - 2.0 - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {530DF8CA-7996-407A-B533-D0C2873257AF} - Library - Properties - VWDExpressDeployTemplates - VWDExpressDeployTemplates - v4.6 - false - false - false - false - false - false - False - False - True - ..\..\..\src - net40 - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\DeploymentTemplates\$(AssemblyName).vsixlangpack.lcl - $(FSharpSourcesRoot)\..\loc\lci\DeploymentTemplates\$(AssemblyName).vsixlangpack.lci - false - false - 210 - - - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - - - - Designer - - - - - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - LibraryProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} - SilverlightProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - TutorialProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {6BA13AA4-C25F-480F-856B-8E8000299A72} - AppConfig - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {12AC2813-E895-4AAA-AE6C-94E21DA09F64} - CodeFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {17716AF4-D439-4C74-8326-475FB1847DF2} - ODataServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A333B85A-DC23-49B6-9797-B89A7951E92D} - ScriptFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} - SignatureFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {35E83EDF-CC5A-441D-8949-17AACC463CA4} - SqlDataConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A2CDA945-EF31-4C37-A063-BD1E2B3938EB} - SqlEntityConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {D11FC318-8F5D-4C8C-9287-AB40A016D13C} - TextFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} - WsdlServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} - XMLFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - - - False - Microsoft .NET Framework 4.6 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - CSharp - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/deployment/VWDExpressDeployTemplates/extension.vsixlangpack b/vsintegration/deployment/VWDExpressDeployTemplates/extension.vsixlangpack deleted file mode 100644 index 38b92465a98..00000000000 --- a/vsintegration/deployment/VWDExpressDeployTemplates/extension.vsixlangpack +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio Express for Web - - diff --git a/vsintegration/deployment/VsProDeployTemplates/VsProDeployTemplates.csproj b/vsintegration/deployment/VsProDeployTemplates/VsProDeployTemplates.csproj deleted file mode 100644 index e0b3510ecc5..00000000000 --- a/vsintegration/deployment/VsProDeployTemplates/VsProDeployTemplates.csproj +++ /dev/null @@ -1,209 +0,0 @@ - - - - - 15.0 - 11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - 12.0 - - - - - Debug - AnyCPU - 2.0 - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {493D19F9-35A4-4D0B-9B25-CA948823B709} - Library - Properties - VsProDeployTemplates - VsProDeployTemplates - v4.6 - false - false - false - false - false - false - False - False - True - ..\..\..\src - net40 - $(NoWarn);2008 - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\DeploymentTemplates\$(AssemblyName).vsixlangpack.lcl - $(FSharpSourcesRoot)\..\loc\lci\DeploymentTemplates\$(AssemblyName).vsixlangpack.lci - false - false - 210 - - - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - - - - Designer - - - - - {6BA13AA4-C25F-480F-856B-8E8000299A72} - AppConfig - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {12AC2813-E895-4AAA-AE6C-94E21DA09F64} - CodeFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {17716AF4-D439-4C74-8326-475FB1847DF2} - ODataServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A333B85A-DC23-49B6-9797-B89A7951E92D} - ScriptFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} - SignatureFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {35E83EDF-CC5A-441D-8949-17AACC463CA4} - SqlDataConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A2CDA945-EF31-4C37-A063-BD1E2B3938EB} - SqlEntityConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {D11FC318-8F5D-4C8C-9287-AB40A016D13C} - TextFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} - WsdlServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} - XMLFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {604F0DAA-2D33-48DD-B162-EDF0B672803D} - ConsoleProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - LibraryProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} - NetCoreProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} - NetCore78Project - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {D9D95330-3626-4199-B7AF-17B8E4AF6D87} - NetCore259Project - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {DB374A0C-7560-479F-9B21-D37C81F7624F} - PortableLibraryProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} - SilverlightProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - TutorialProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - - - - - CSharp - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/deployment/VsProDeployTemplates/extension.vsixlangpack b/vsintegration/deployment/VsProDeployTemplates/extension.vsixlangpack deleted file mode 100644 index e945fca7c6e..00000000000 --- a/vsintegration/deployment/VsProDeployTemplates/extension.vsixlangpack +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio - - diff --git a/vsintegration/deployment/WDExpressDeployTemplates/WDExpressDeployTemplates.csproj b/vsintegration/deployment/WDExpressDeployTemplates/WDExpressDeployTemplates.csproj deleted file mode 100644 index 802a4c0345d..00000000000 --- a/vsintegration/deployment/WDExpressDeployTemplates/WDExpressDeployTemplates.csproj +++ /dev/null @@ -1,210 +0,0 @@ - - - - - 15.0 - 11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - 12.0 - SAK - SAK - SAK - SAK - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - $(NoWarn);2008 - - - - Debug - AnyCPU - 2.0 - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {98ABDE09-9E08-49C7-B006-FB3CB5365B54} - Library - Properties - WDExpressDeployTemplates - WDExpressDeployTemplates - v4.6 - false - false - false - false - false - false - False - False - True - ..\..\..\src - net40 - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\DeploymentTemplates\$(AssemblyName).vsixlangpack.lcl - $(FSharpSourcesRoot)\..\loc\lci\DeploymentTemplates\$(AssemblyName).vsixlangpack.lci - false - false - 210 - - - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - - - - Designer - - - - - {604F0DAA-2D33-48DD-B162-EDF0B672803D} - ConsoleProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - LibraryProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - TutorialProject - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - - {6BA13AA4-C25F-480F-856B-8E8000299A72} - AppConfig - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {12AC2813-E895-4AAA-AE6C-94E21DA09F64} - CodeFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {17716AF4-D439-4C74-8326-475FB1847DF2} - ODataServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A333B85A-DC23-49B6-9797-B89A7951E92D} - ScriptFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} - SignatureFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {35E83EDF-CC5A-441D-8949-17AACC463CA4} - SqlDataConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A2CDA945-EF31-4C37-A063-BD1E2B3938EB} - SqlEntityConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {D11FC318-8F5D-4C8C-9287-AB40A016D13C} - TextFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} - WsdlServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} - XMLFile - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - - - False - Microsoft .NET Framework 4.6 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - CSharp - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/deployment/WDExpressDeployTemplates/extension.vsixlangpack b/vsintegration/deployment/WDExpressDeployTemplates/extension.vsixlangpack deleted file mode 100644 index e979e4cfb5e..00000000000 --- a/vsintegration/deployment/WDExpressDeployTemplates/extension.vsixlangpack +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio Express for Windows Desktop - - - diff --git a/vsintegration/fsharp-vsintegration-deployment-build.proj b/vsintegration/fsharp-vsintegration-deployment-build.proj deleted file mode 100644 index 4eee6108376..00000000000 --- a/vsintegration/fsharp-vsintegration-deployment-build.proj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net40 - - - - - - - - - - - - diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj new file mode 100644 index 00000000000..e62691e48e8 --- /dev/null +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -0,0 +1,32 @@ + + + + net40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9dd0de48eb40a5315e7d79b14644193de061c230 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 20 Apr 2016 10:30:52 -0700 Subject: [PATCH 092/334] Fix VisualFSharp.sln --- VisualFSharp.sln | 122 ++++-------------- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 29 ++--- .../Project/ProjectSystem.Base.csproj | 1 - 3 files changed, 36 insertions(+), 116 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index f7c3f825295..86096408b61 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,16 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.0.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnableOpenSource", "vsintegration\deployment\EnableOpenSource\EnableOpenSource.csproj", "{4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VsProDeployTemplates", "vsintegration\deployment\VsProDeployTemplates\VsProDeployTemplates.csproj", "{493D19F9-35A4-4D0B-9B25-CA948823B709}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VWDExpressDeployTemplates", "vsintegration\deployment\VWDExpressDeployTemplates\VWDExpressDeployTemplates.csproj", "{530DF8CA-7996-407A-B533-D0C2873257AF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WDExpressDeployTemplates", "vsintegration\deployment\WDExpressDeployTemplates\WDExpressDeployTemplates.csproj", "{98ABDE09-9E08-49C7-B006-FB3CB5365B54}" -EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler", "src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.VS.FSI", "vsintegration\src\FSharp.VS.FSI\FSharp.VS.FSI.fsproj", "{991DCF75-C2EB-42B6-9A0D-AA1D2409D519}" @@ -98,8 +90,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{B8DDA694 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{3058BC79-8E79-4645-B05D-48CC182FA8A6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deployment", "Deployment", "{1B739E2E-8B04-43EB-97A4-CDBC245E69FD}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleProject", "vsintegration\ProjectTemplates\ConsoleProject\ConsoleProject.csproj", "{604F0DAA-2D33-48DD-B162-EDF0B672803D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryProject", "vsintegration\ProjectTemplates\LibraryProject\LibraryProject.csproj", "{01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}" @@ -138,6 +128,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WsdlServiceConnection", "vs EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\ItemTemplates\XMLFile\XMLFile.csproj", "{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpVsix", "vsintegration\VisualFSharpVsix\VisualFSharpVsix.csproj", "{E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -152,86 +144,6 @@ Global VSRelease|x86 = VSRelease|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.Build.0 = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.Build.0 = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|x86.Build.0 = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|x86.Build.0 = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|x86.Build.0 = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|x86.Build.0 = VSRelease|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1269,15 +1181,31 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.Build.0 = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|x86.ActiveCfg = Debug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|x86.Build.0 = Debug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Proto|Any CPU.Build.0 = Proto|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Proto|x86.ActiveCfg = Proto|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Proto|x86.Build.0 = Proto|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|Any CPU.Build.0 = Release|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.ActiveCfg = Release|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.Build.0 = Release|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.Build.0 = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.Build.0 = VSRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7} = {1B739E2E-8B04-43EB-97A4-CDBC245E69FD} - {493D19F9-35A4-4D0B-9B25-CA948823B709} = {1B739E2E-8B04-43EB-97A4-CDBC245E69FD} - {530DF8CA-7996-407A-B533-D0C2873257AF} = {1B739E2E-8B04-43EB-97A4-CDBC245E69FD} - {98ABDE09-9E08-49C7-B006-FB3CB5365B54} = {1B739E2E-8B04-43EB-97A4-CDBC245E69FD} {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77} {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06} = {B8DDA694-7939-42E3-95E5-265C2217C142} @@ -1315,7 +1243,6 @@ Global {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449} {88E2D422-6852-46E3-A740-83E391DC7973} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449} {F7876C9B-FB6A-4EFB-B058-D6967DB75FB2} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} - {1B739E2E-8B04-43EB-97A4-CDBC245E69FD} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} {604F0DAA-2D33-48DD-B162-EDF0B672803D} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} = {C9B1D3F5-4971-4F04-9C26-37E3AC809AB4} @@ -1335,5 +1262,6 @@ Global {D11FC318-8F5D-4C8C-9287-AB40A016D13C} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} EndGlobalSection EndGlobal diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 533adf9f60c..bbb40f4115d 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -4,16 +4,16 @@ ..\..\src ..\src - 15.0 net40 - 11.0 + 15.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - 12.0 + 15.0 2.0 {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - + + publish\ true Disk @@ -41,35 +41,32 @@ false Library Properties - FSharp + FSharp Program $(DevEnvDir)devenv.exe true /rootsuffix $(VSRootSuffix) /log $(VSRootSuffix) - Local + Local VisualFSharpVsix.$(BuildSku) VisualFSharpVsix.$(BuildSku) - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\vsix\$(BuildSku) - 15.4.1.0 - cs + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\vsix\$(BuildSku) + 15.4.1.0 + cs + 14.0 - - Designer - Always true - False @@ -87,7 +84,6 @@ false - {649FA588-F02E-457C-9FCF-87E46407481E} @@ -310,12 +306,9 @@ false - - - + \ No newline at end of file diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index cd54c53ae57..ce57ea0b070 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -5,7 +5,6 @@ ..\..\..\..\src CSharp true - 15.0 3001,3002,3003,3005,3008,3009,3021,3024 15.4.1.0 cs From 416a3859c8e1d10cfeb2a6009d9055c03c363c43 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 20 Apr 2016 15:54:45 -0700 Subject: [PATCH 093/334] Added RegisterFsharpPackage.pkgdef --- .../Desktop/Source.extension.vsixmanifest | 3 +- .../Local/Source.extension.vsixmanifest | 3 +- .../Pro/Source.extension.vsixmanifest | 3 +- .../Web/Source.extension.vsixmanifest | 3 +- .../RegisterFsharpPackage.pkgdef | 309 ++++++++++++++++++ .../VisualFSharpVsix/VisualFSharpVsix.csproj | 4 + 6 files changed, 321 insertions(+), 4 deletions(-) create mode 100644 vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef diff --git a/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest index b9ccf201f07..35e55d9d455 100644 --- a/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio Express for Web @@ -13,6 +13,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest index 319de5f21a1..401cda74172 100644 --- a/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio @@ -14,6 +14,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest index 43153e93e1f..a05df2e85c8 100644 --- a/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio @@ -13,6 +13,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest index 8f2470d3812..2721d73ea4e 100644 --- a/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio Express for Windows Desktop @@ -13,6 +13,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef new file mode 100644 index 00000000000..9124e268ef6 --- /dev/null +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -0,0 +1,309 @@ +# Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +[$RootKey$\ShellFileAssociations] +".fs"="VisualStudio.fs.15.0" +".fsi"="VisualStudio.fsi.15.0" +".fsscript"="VisualStudio.fsscript.15.0" +".fsx"="VisualStudio.fsx.15.0" +".fsproj"="VisualStudio.Launcher.fsproj.15.0" + +[$RootKey$\Editors\{8B382828-6202-11d1-8870-0000F87579D2}\Extensions] +"fs"="97" +"fsi"="97" +"fsscript"="97" +"fsx"="97" +"ml"="97" +"mli"="97" + +[$RootKey$\Packages] +"{871d2a70-12a2-4e42-9440-425dd92a4116}"="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" + +[$RootKey$\Packages\{871d2a70-12a2-4e42-9440-425dd92a4116}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" +"Assembly"="FSharp.LanguageService, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ID"="1" +"MinEdition"="standard" +"ProductVersion"="4.1" +"ProductName"="Visual F#" +"CompanyName"="Microsoft Corp." +"VWDExpressId"="3" +"WDExpressId"="2" + +[$RootKey$\Languages\File Extensions] +".fs"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" +".fsi"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" +".fsscript"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" +".fsx"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" +".ml"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" +".mli"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" + +[$RootKey$\Languages\Language Services] +"F#"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" + +[$RootKey$\Languages\Language Services\F#] +"Package"="{871d2a70-12a2-4e42-9440-425dd92a4116}" +"LangResID"="100" +"MatchBracesAtCaret"="1" +"ShowCompletion"="1" +"CodeSenseDelay"="100" +"ShowMatchingBrace"="1" +"MatchBraces"="1" +"EnableAsyncCompletion"="1" +"QuickInfo"="1" +"DefaultToInsertSpaces"="1" +"CodeSense"="1" +"Default to Non Hot URLs"="1" +"EnableCommenting"="1" +"ShowSmartIndent"="1" +"ShowBraceCompletion"="1" + +[$RootKey$\Services] +"{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}"="{871d2a70-12a2-4e42-9440-425dd92a4116}" + +[$RootKey$\Services\{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}] +"Name"="F#" + +[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{e847195f-56ff-fbc3-d0f2-f7254fb9439c}] +"Name"="FSharp.Core" +"PublicKeyToken"="b03f5f7f11d50a3a" +"OldVersion"="2.0.0.0-4.4.0.0" +"NewVersion"="4.4.1.0" +"Culture"="neutral" + +[$RootKey$\Projects\{A1591282-1198-4647-A2B1-27E5FF5F6F3B}\LanguageTemplates] +"{F2A71F9B-5D33-465A-A702-920D77279786}"="{76B279E8-36ED-494E-B145-5344F8DEFCB6}" + +[$RootKey$\Projects] +"{76B279E8-36ED-494E-B145-5344F8DEFCB6}"="F# Silverlight Project Templates" + +[$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}] +"Language(VsTemplate)"="FSharp" +"Package"="{91A04A73-4F2C-4E7C-AD38-C1A68E7DA05C}" +"ShowOnlySpecifiedTemplates(VsTemplate)"="00000000" +"TemplateGroupIDs(VsTemplate)"="Silverlight" + +[$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}\SilverlightProperties] +"CodeFileExtension"=".fs" +"TemplateFolder"="FSharp" +"DefaultProjectTemplate"="SilverlightLibrary\SilverlightLibrary.vstemplate" +"LanguageDisplayString"="Visual F#" +"PropertyPagesToRemove"="{6D2D9B56-2691-4624-A1BF-D07A14594748};{9CFBEB2A-6824-43e2-BD3B-B112FEBC3772}" + +[$RootKey$\InstalledProducts] +"Microsoft Visual F#"="#9001" + +[$RootKey$\InstalledProducts\Microsoft Visual F#] +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"ProductDetails"="#9002" +"LogoID"="#400" +"UseVSProductID"="1" + +[$RootKey$\AD7Metrics\ExpressionEvaluator\{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}] +"CLSID"="{60F5556F-7EBC-4992-8E83-E9B49187FDE3}" +"Language"="F#" +"Name"="F#" +"PreloadModules"="1" +"CacheFile"="attribcache90.bin" +"GlobalVisualizersDirectory"="$(reg.MODULE_DIR)" +"HelperObject"="{5749A995-CBC2-4de4-86AF-C934D5E57BB9}" +"HostAssemblyName"="$(reg.VisualizerAssemblyName)" +"HostAssemblyRelativeLocation"="PublicAssemblies" +"HostAssemblyFile"="Microsoft.VisualStudio.DebuggerVisualizers.dll" +"HostClassName"="Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.DebugeeHost" +"ViewerClassRef"="Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.ManagedShim, $(reg.VisualizerAssemblyName)" +"ObjectSourceClassRef"="Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource, $(reg.VisualizerAssemblyName)" +"UnmanagedViewer"="{0A9F2A56-3827-42dc-8A8F-B594879873AF}" +"VSUserDataLocationKey"="$(reg.REGROOT)" +"VSUserDataLocationValue"="VisualStudioLocation" +"VisualizersDirectoryName"="Visualizers" +"VisualizersOriginalDirectoryName"="Original" +"DefaultVSLocation"="Microsoft Visual Studio 15" +"AssertToggleObject"="System.Diagnostics.TraceInternal.listeners.list._items[\[]0[\]]" +"AssertToggleField"="assertUIEnabled" +"AssertToggleInit"="((System.Diagnostics.DefaultTraceListener)System.Diagnostics.TraceInternal.Listeners[\[]0[\]]).AssertUiEnabled" +"LoadRuntimeExpression1"="System.Type.GetType("Microsoft.VisualStudio.Debugger.Runtime.Main, Microsoft.VisualStudio.Debugger.Runtime, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")" +"LoadRuntimeExpression2"="Microsoft.VisualStudio.Debugger.Runtime.Main.Initialize((System.IntPtr)0x%p)" +"LoadInShimManagedEE"="1" +"TracingExpression1"="System.Type.GetType("Microsoft.VisualStudio.Debugger.Runtime.Tracing, Microsoft.VisualStudio.Debugger.Runtime, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")" +"TracingExpression2"="Microsoft.VisualStudio.Debugger.Runtime.Tracing.Refresh(@"%s")" + +[$RootKey$\AD7Metrics\ExpressionEvaluator\{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}\Engine] +"0"="{449EC4CC-30D2-4032-9256-EE18EB41B62B}" +"1"="{92EF0900-2251-11D2-B72E-0000F87572EF}" + +[$RootKey$\Packages] +"{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" + +[$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" +"Assembly"="FSharp.ProjectSystem.FSharp, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ID"="1" +"MinEdition"="standard" +"ProductVersion"="4.1" +"ProductName"="Visual F#" +"CompanyName"="Microsoft Corp." +"VWDExpressId"="3" +"WDExpressId"="2" + +[$RootKey$\KeyBindingTables] +"{dee22b65-9761-4a26-8fb2-759b971d6dfc}"="#6001" + +[$RootKey$\KeyBindingTables\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"AllowNavKeyBinding"="0" + +[$RootKey$\Menus] +"{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"=", 1000.ctmenu, 1" + +[$RootKey$\CLSID] +"{e1194663-db3c-49eb-8b45-276fcdc440ea}"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" + +[$RootKey$\CLSID\{e1194663-db3c-49eb-8b45-276fcdc440ea}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" +"Assembly"="FSharp.ProjectSystem.FSharp, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\CLSID] +"{6d2d9b56-2691-4624-a1bf-d07a14594748}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" + +[$RootKey$\CLSID\{6d2d9b56-2691-4624-a1bf-d07a14594748}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" +"Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\CLSID] +"{dd84aa8f-71bb-462a-8ef8-c9992cb325b7}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildEventsPropPageComClass" + +[$RootKey$\CLSID\{dd84aa8f-71bb-462a-8ef8-c9992cb325b7}] +"InprocServer32"="$System$mscoree.dll" +"Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildEventsPropPageComClass" +"Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\CLSID] +"{fac0a17e-2e70-4211-916a-0d34fb708bff}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" + +[$RootKey$\CLSID\{fac0a17e-2e70-4211-916a-0d34fb708bff}] +"InprocServer32"="$System$mscoree.dll" +"Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" +"Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\CLSID] +"{9cfbeb2a-6824-43e2-bd3b-b112febc3772}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" + +[$RootKey$\CLSID\{9cfbeb2a-6824-43e2-bd3b-b112febc3772}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" +"Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\CLSID] +"{df16b1a2-0e91-4499-ae60-c7144e614bf1}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" + +[$RootKey$\CLSID\{df16b1a2-0e91-4499-ae60-c7144e614bf1}] +"InprocServer32"="$System$\mscoree.dll" +"Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" +"Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" +"ThreadingModel"="Both" + +[$RootKey$\ToolsOptionsPages] +"F# Tools"="#6000" + +[$RootKey$\ToolsOptionsPages\F# Tools] +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" + +[$RootKey$\ToolsOptionsPages\F# Tools] +"F# Interactive"="#6001" + +[$RootKey$\ToolsOptionsPages\F# Tools\F# Interactive] +"Keywords"="#6005" +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"Page"="{4489e9de-6ac1-3cd6-bff8-a904fd0e82d4}" + +[$RootKey$\AutomationProperties\F# Tools\F# Interactive] +"Name"="F# Tools.F# Interactive" +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" + +[$RootKey$\Projects] +"{f2a71f9b-5d33-465a-a702-920d77279786}"="FSharpProjectFactory" + +[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}] +"DisplayName"="Visual F#" +"DisplayProjectFileExtensions"="#6002" +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"DefaultProjectExtension"="fsproj" +"PossibleProjectExtensions"="fsproj" +"ProjectTemplatesDir"="\.\NullPath" +"Language(VsTemplate)"="FSharp" + +[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\Filters] +"F# Code Files"="#6003" + +[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\Filters\F# Code Files] +"CommonOpenFilesFilter"="1" +"SortPriority"="2000" + +[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\AddItemTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] +"/1"="#6007" + +[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\AddItemTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}\/1] +"SortPriority"="32" +"TemplatesDir"="\.\NullPath" + +[$RootKey$\Projects\{4ead5bc6-47f1-4fcb-823d-0cd64302d5b9}\WebApplicationProperties] +"CodeBehindCodeGenerator"="{00000000-0000-0000-0000-000000000000}" + +[$RootKey$\NewProjectTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] +"/1"="Visual F#" + +[$RootKey$\NewProjectTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}\/1] +"SortPriority"="31" +"TemplatesDir"="\.\NullPath" +"DeveloperActivity"="Visual F#" + +[$RootKey$\Services] +"{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" + +[$RootKey$\Services\{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}] +"Name"="FSharpInteractive" + +[$RootKey$\AutomationProperties\TextEditor] +"FSharp"="F#" + +[$RootKey$\AutomationProperties\TextEditor\FSharp] +"Package"="{F5E7E720-1401-11D1-883B-0000F87579D2}" +"Name"="F#" +"ProfileSave"="1" +"VSSettingsMigration"="1" + +[$RootKey$\Languages\Language Services] +"FSharpInteractive"="{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}" + + +[$RootKey$\Languages\Language Services\FSharpInteractive] +"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"NotALanguage"="1" + +[$RootKey$\ToolWindows] +"{dee22b65-9761-4a26-8fb2-759b971d6dfc}"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" + +[$RootKey$\ToolWindows\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] +"Name"="Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow" +"Orientation"="Bottom" +"Style"="Tabbed" +"Window"="{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" +"Float"="0, 0, 360, 120" + +[$RootKey$\FontAndColors] +"FSharpInteractive"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" + +[$RootKey$\FontAndColors\FSharpInteractive] +"Category"="{00CCEE86-3140-4E06-A65A-A92665A40D6F}" +"Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}" +"ToolWindowPackage"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +"NameID"="9027" diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index bbb40f4115d..0c87f444743 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -60,6 +60,10 @@ Designer + + Always + true + From 24b27adb62ce2d20b5aecfd6584db6b8fce1553f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 21 Apr 2016 12:57:59 -0700 Subject: [PATCH 094/334] Fixed reg keys default values --- .../RegisterFsharpPackage.pkgdef | 97 +++++-------------- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 2 +- 2 files changed, 25 insertions(+), 74 deletions(-) diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef index 9124e268ef6..d9389a1a55b 100644 --- a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -15,9 +15,6 @@ "ml"="97" "mli"="97" -[$RootKey$\Packages] -"{871d2a70-12a2-4e42-9440-425dd92a4116}"="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" - [$RootKey$\Packages\{871d2a70-12a2-4e42-9440-425dd92a4116}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" @@ -29,6 +26,7 @@ "CompanyName"="Microsoft Corp." "VWDExpressId"="3" "WDExpressId"="2" +@="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" [$RootKey$\Languages\File Extensions] ".fs"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" @@ -38,9 +36,6 @@ ".ml"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" ".mli"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -[$RootKey$\Languages\Language Services] -"F#"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" - [$RootKey$\Languages\Language Services\F#] "Package"="{871d2a70-12a2-4e42-9440-425dd92a4116}" "LangResID"="100" @@ -57,12 +52,11 @@ "EnableCommenting"="1" "ShowSmartIndent"="1" "ShowBraceCompletion"="1" - -[$RootKey$\Services] -"{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}"="{871d2a70-12a2-4e42-9440-425dd92a4116}" +@="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" [$RootKey$\Services\{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}] "Name"="F#" +@="{871d2a70-12a2-4e42-9440-425dd92a4116}" [$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{e847195f-56ff-fbc3-d0f2-f7254fb9439c}] "Name"="FSharp.Core" @@ -74,14 +68,12 @@ [$RootKey$\Projects\{A1591282-1198-4647-A2B1-27E5FF5F6F3B}\LanguageTemplates] "{F2A71F9B-5D33-465A-A702-920D77279786}"="{76B279E8-36ED-494E-B145-5344F8DEFCB6}" -[$RootKey$\Projects] -"{76B279E8-36ED-494E-B145-5344F8DEFCB6}"="F# Silverlight Project Templates" - [$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}] "Language(VsTemplate)"="FSharp" "Package"="{91A04A73-4F2C-4E7C-AD38-C1A68E7DA05C}" "ShowOnlySpecifiedTemplates(VsTemplate)"="00000000" "TemplateGroupIDs(VsTemplate)"="Silverlight" +@="F# Silverlight Project Templates" [$RootKey$\Projects\{76B279E8-36ED-494E-B145-5344F8DEFCB6}\SilverlightProperties] "CodeFileExtension"=".fs" @@ -90,14 +82,12 @@ "LanguageDisplayString"="Visual F#" "PropertyPagesToRemove"="{6D2D9B56-2691-4624-A1BF-D07A14594748};{9CFBEB2A-6824-43e2-BD3B-B112FEBC3772}" -[$RootKey$\InstalledProducts] -"Microsoft Visual F#"="#9001" - [$RootKey$\InstalledProducts\Microsoft Visual F#] "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "ProductDetails"="#9002" "LogoID"="#400" "UseVSProductID"="1" +@="#9001" [$RootKey$\AD7Metrics\ExpressionEvaluator\{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}] "CLSID"="{60F5556F-7EBC-4992-8E83-E9B49187FDE3}" @@ -132,9 +122,6 @@ "0"="{449EC4CC-30D2-4032-9256-EE18EB41B62B}" "1"="{92EF0900-2251-11D2-B72E-0000F87572EF}" -[$RootKey$\Packages] -"{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" - [$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" @@ -146,92 +133,72 @@ "CompanyName"="Microsoft Corp." "VWDExpressId"="3" "WDExpressId"="2" - -[$RootKey$\KeyBindingTables] -"{dee22b65-9761-4a26-8fb2-759b971d6dfc}"="#6001" +@="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" [$RootKey$\KeyBindingTables\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "AllowNavKeyBinding"="0" +@="#6001" [$RootKey$\Menus] "{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"=", 1000.ctmenu, 1" -[$RootKey$\CLSID] -"{e1194663-db3c-49eb-8b45-276fcdc440ea}"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" - [$RootKey$\CLSID\{e1194663-db3c-49eb-8b45-276fcdc440ea}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" "Assembly"="FSharp.ProjectSystem.FSharp, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\CLSID] -"{6d2d9b56-2691-4624-a1bf-d07a14594748}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" +@="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" [$RootKey$\CLSID\{6d2d9b56-2691-4624-a1bf-d07a14594748}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\CLSID] -"{dd84aa8f-71bb-462a-8ef8-c9992cb325b7}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildEventsPropPageComClass" +@="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" [$RootKey$\CLSID\{dd84aa8f-71bb-462a-8ef8-c9992cb325b7}] "InprocServer32"="$System$mscoree.dll" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildEventsPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\CLSID] -"{fac0a17e-2e70-4211-916a-0d34fb708bff}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" +@="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildEventsPropPageComClass" [$RootKey$\CLSID\{fac0a17e-2e70-4211-916a-0d34fb708bff}] "InprocServer32"="$System$mscoree.dll" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\CLSID] -"{9cfbeb2a-6824-43e2-bd3b-b112febc3772}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" +@="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" [$RootKey$\CLSID\{9cfbeb2a-6824-43e2-bd3b-b112febc3772}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\CLSID] -"{df16b1a2-0e91-4499-ae60-c7144e614bf1}"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" +@="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" [$RootKey$\CLSID\{df16b1a2-0e91-4499-ae60-c7144e614bf1}] "InprocServer32"="$System$\mscoree.dll" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" - -[$RootKey$\ToolsOptionsPages] -"F# Tools"="#6000" +@="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" [$RootKey$\ToolsOptionsPages\F# Tools] "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" - -[$RootKey$\ToolsOptionsPages\F# Tools] -"F# Interactive"="#6001" +@="#6000" [$RootKey$\ToolsOptionsPages\F# Tools\F# Interactive] "Keywords"="#6005" "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "Page"="{4489e9de-6ac1-3cd6-bff8-a904fd0e82d4}" +@="#6001" [$RootKey$\AutomationProperties\F# Tools\F# Interactive] "Name"="F# Tools.F# Interactive" "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" -[$RootKey$\Projects] -"{f2a71f9b-5d33-465a-a702-920d77279786}"="FSharpProjectFactory" - [$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}] "DisplayName"="Visual F#" "DisplayProjectFileExtensions"="#6002" @@ -240,57 +207,42 @@ "PossibleProjectExtensions"="fsproj" "ProjectTemplatesDir"="\.\NullPath" "Language(VsTemplate)"="FSharp" - -[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\Filters] -"F# Code Files"="#6003" +@="FSharpProjectFactory" [$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\Filters\F# Code Files] "CommonOpenFilesFilter"="1" "SortPriority"="2000" +@="#6003" -[$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\AddItemTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] -"/1"="#6007" - [$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}\AddItemTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}\/1] "SortPriority"="32" "TemplatesDir"="\.\NullPath" +@="#6007" [$RootKey$\Projects\{4ead5bc6-47f1-4fcb-823d-0cd64302d5b9}\WebApplicationProperties] "CodeBehindCodeGenerator"="{00000000-0000-0000-0000-000000000000}" -[$RootKey$\NewProjectTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] -"/1"="Visual F#" - [$RootKey$\NewProjectTemplates\TemplateDirs\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}\/1] "SortPriority"="31" "TemplatesDir"="\.\NullPath" "DeveloperActivity"="Visual F#" +@="Visual F#" -[$RootKey$\Services] -"{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" - [$RootKey$\Services\{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}] "Name"="FSharpInteractive" - -[$RootKey$\AutomationProperties\TextEditor] -"FSharp"="F#" +@="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" [$RootKey$\AutomationProperties\TextEditor\FSharp] "Package"="{F5E7E720-1401-11D1-883B-0000F87579D2}" "Name"="F#" "ProfileSave"="1" "VSSettingsMigration"="1" +@="F#" -[$RootKey$\Languages\Language Services] -"FSharpInteractive"="{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}" - - [$RootKey$\Languages\Language Services\FSharpInteractive] "Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "NotALanguage"="1" - -[$RootKey$\ToolWindows] -"{dee22b65-9761-4a26-8fb2-759b971d6dfc}"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" +@="{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}" [$RootKey$\ToolWindows\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] "Name"="Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow" @@ -298,12 +250,11 @@ "Style"="Tabbed" "Window"="{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" "Float"="0, 0, 360, 120" +@="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" -[$RootKey$\FontAndColors] -"FSharpInteractive"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" - [$RootKey$\FontAndColors\FSharpInteractive] "Category"="{00CCEE86-3140-4E06-A65A-A92665A40D6F}" "Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}" "ToolWindowPackage"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" "NameID"="9027" +@="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 0c87f444743..354a0bc0b6c 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -50,7 +50,7 @@ Local VisualFSharpVsix.$(BuildSku) VisualFSharpVsix.$(BuildSku) - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\vsix\$(BuildSku) + $(FSharpSourcesRoot)\..\$(Configuration)\setup\$(AssemblyName) 15.4.1.0 cs 14.0 From 6671638d2044a1fcbf7b5a040ef506a98cdafbdd Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 21 Apr 2016 18:08:33 -0700 Subject: [PATCH 095/334] Generated FSharp.ProjectSystem.FSharp.pkgdef --- .../VisualFSharpVsix/EnableOpenSource.pkgdef | 88 ------------------- .../Desktop/Source.extension.vsixmanifest | 45 ---------- .../Pro/Source.extension.vsixmanifest | 50 ----------- .../Web/Source.extension.vsixmanifest | 45 ---------- .../RegisterFsharpPackage.pkgdef | 35 -------- .../Local => }/Source.extension.vsixmanifest | 16 +--- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 23 +++-- .../fsharp-vsintegration-vsix-build.proj | 21 +---- .../InternalsVisibleTo.fs | 2 + .../ProjectSystem.fsproj | 10 ++- 10 files changed, 22 insertions(+), 313 deletions(-) delete mode 100644 vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef delete mode 100644 vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest delete mode 100644 vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest delete mode 100644 vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest rename vsintegration/VisualFSharpVsix/{Manifests/Local => }/Source.extension.vsixmanifest (66%) diff --git a/vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef b/vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef deleted file mode 100644 index 0af694c1da8..00000000000 --- a/vsintegration/VisualFSharpVsix/EnableOpenSource.pkgdef +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{11605AD3-9E1C-4DAE-AA39-C17470D15752}] -"name"="FSharp.Compiler" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="4.3.0.0-4.4.1.0" -"newVersion"="4.4.1.0" -"codeBase"="$PackageFolder$\FSharp.Compiler.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{091CE614-9F5C-46F6-82ED-2BCEC3740C54}] -"name"="FSharp.Compiler.Server.Shared" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="4.3.0.0-4.4.1.0" -"newVersion"="4.4.1.0" -"codeBase"="$PackageFolder$\FSharp.Compiler.Server.Shared.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{4D79C9FC-8AB8-476D-8526-E55B2AF6C6B7}] -"name"="FSharp.Core" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="2.3.0.0-4.4.1.0" -"newVersion"="4.4.1.0" -"codeBase"="$PackageFolder$\FSharp.Core.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{2DB67780-3B09-41E5-A8DC-92AF2E1665BD}] -"name"="FSharp.Editor" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.Editor.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{EBAA5FAC-BE56-4693-82AB-0FD093861AAE}] -"name"="FSharp.LanguageService" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.LanguageService.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{B1E0C67D-87CD-4EA5-A9BC-0D8210A876E7}] -"name"="FSharp.LanguageService.Base" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.LanguageService.Base.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{C9555D76-CA9E-484F-9C53-ED10598E2A48}] -"name"="FSharp.LanguageService.Compiler" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.LanguageService.Compiler.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{892D5910-A99B-4591-9A90-6FBA6E7EFB83}] -"name"="FSharp.VS.FSI" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.VS.FSI.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{01E671A2-D375-4F61-AAB1-FC4A360B7566}] -"name"="FSharp.ProjectSystem.FSharp" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.ProjectSystem.FSharp.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{1FD3D46E-E558-4000-AB74-60745B18F991}] -"name"="FSharp.ProjectSystem.Base" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.ProjectSystem.Base.dll" - -[$RootKey$\RuntimeConfiguration\dependentAssembly\bindingRedirection\{666BAAE7-BC0E-4B74-8048-09567E0862E6}] -"name"="FSharp.ProjectSystem.PropertyPages" -"publicKeyToken"="b03f5f7f11d50a3a" -"culture"="neutral" -"oldVersion"="12.0.0.0-15.0.0.0" -"newVersion"="15.4.1.0" -"codeBase"="$PackageFolder$\FSharp.ProjectSystem.PropertyPages.dll" diff --git a/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest deleted file mode 100644 index 35e55d9d455..00000000000 --- a/vsintegration/VisualFSharpVsix/Manifests/Desktop/Source.extension.vsixmanifest +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio Express for Web - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest deleted file mode 100644 index a05df2e85c8..00000000000 --- a/vsintegration/VisualFSharpVsix/Manifests/Pro/Source.extension.vsixmanifest +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest deleted file mode 100644 index 2721d73ea4e..00000000000 --- a/vsintegration/VisualFSharpVsix/Manifests/Web/Source.extension.vsixmanifest +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Visual F# Tools Templates - Deploy Visual F# Tools templates to Visual Studio Express for Windows Desktop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef index d9389a1a55b..8cf31f30118 100644 --- a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -123,22 +123,9 @@ "1"="{92EF0900-2251-11D2-B72E-0000F87572EF}" [$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] -"InprocServer32"="$System$\mscoree.dll" -"Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" -"Assembly"="FSharp.ProjectSystem.FSharp, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" -"ID"="1" -"MinEdition"="standard" "ProductVersion"="4.1" "ProductName"="Visual F#" "CompanyName"="Microsoft Corp." -"VWDExpressId"="3" -"WDExpressId"="2" -@="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpProjectPackage" - -[$RootKey$\KeyBindingTables\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] -"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" -"AllowNavKeyBinding"="0" -@="#6001" [$RootKey$\Menus] "{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"=", 1000.ctmenu, 1" @@ -185,20 +172,6 @@ "ThreadingModel"="Both" @="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" -[$RootKey$\ToolsOptionsPages\F# Tools] -"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" -@="#6000" - -[$RootKey$\ToolsOptionsPages\F# Tools\F# Interactive] -"Keywords"="#6005" -"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" -"Page"="{4489e9de-6ac1-3cd6-bff8-a904fd0e82d4}" -@="#6001" - -[$RootKey$\AutomationProperties\F# Tools\F# Interactive] -"Name"="F# Tools.F# Interactive" -"Package"="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" - [$RootKey$\Projects\{f2a71f9b-5d33-465a-a702-920d77279786}] "DisplayName"="Visual F#" "DisplayProjectFileExtensions"="#6002" @@ -244,14 +217,6 @@ "NotALanguage"="1" @="{35a5e6b8-4012-41fc-a652-2cdc56d74e9f}" -[$RootKey$\ToolWindows\{dee22b65-9761-4a26-8fb2-759b971d6dfc}] -"Name"="Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow" -"Orientation"="Bottom" -"Style"="Tabbed" -"Window"="{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" -"Float"="0, 0, 360, 120" -@="{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}" - [$RootKey$\FontAndColors\FSharpInteractive] "Category"="{00CCEE86-3140-4E06-A65A-A92665A40D6F}" "Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}" diff --git a/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest similarity index 66% rename from vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest rename to vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 401cda74172..1b3d1d31601 100644 --- a/vsintegration/VisualFSharpVsix/Manifests/Local/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -13,22 +13,8 @@ - - - - - - - - - - - - - - - + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 354a0bc0b6c..8ef8e8f7704 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -1,6 +1,6 @@  - + ..\..\src ..\src @@ -42,33 +42,33 @@ Library Properties FSharp + true Program $(DevEnvDir)devenv.exe true /rootsuffix $(VSRootSuffix) /log $(VSRootSuffix) - Local - VisualFSharpVsix.$(BuildSku) - VisualFSharpVsix.$(BuildSku) - $(FSharpSourcesRoot)\..\$(Configuration)\setup\$(AssemblyName) + VisualFSharpVsix + VisualFSharpVsix + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin 15.4.1.0 cs 14.0 + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} - - + Designer Always true + RegisterFsharpPackage.pkgdef - - - + Always true + FSharp.ProjectSystem.FSharp.pkgdef @@ -312,7 +312,4 @@ - - - \ No newline at end of file diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index e62691e48e8..99f456f9f7b 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -8,25 +8,6 @@ - - - - - - - - - - - - - - - - - - - - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs index b2bc0961d09..3554721433e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs @@ -3,6 +3,7 @@ namespace Microsoft.FSharp open System.Reflection open System.Runtime.CompilerServices +open Microsoft.VisualStudio.Shell [] [] @@ -12,6 +13,7 @@ open System.Runtime.CompilerServices [] [] +[] do() diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 628cfa962a4..d90cef2594f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -1,6 +1,6 @@  - + ..\..\..\src FSharp @@ -24,6 +24,12 @@ false true ProjectResources.rc + true + false + false + true + true + true @@ -136,7 +142,7 @@ FSharp.Core - + true From e82768033689fde47796358bbb9336e162c67034 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 22 Apr 2016 12:05:30 +0300 Subject: [PATCH 096/334] add attribute usage test --- .../Imported/CallerInfo/CSharpLib.cs | 11 +++++++++++ .../Imported/CallerInfo/CallerLineNumber.fs | 7 +++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs index ee1c7d4f834..44750e38379 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Runtime.CompilerServices; namespace CSharpLib @@ -20,4 +21,14 @@ public static Tuple AllInfo(int normalArg, [CallerFilePath] string return new Tuple(filePath, line); } } + + public class MyCallerInfoAttribute : Attribute + { + public int LineNumber { get; set; } + + public MyCallerInfoAttribute([CallerLineNumber] int lineNumber = -1) + { + LineNumber = lineNumber; + } + } } \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index f30d42dfba1..5fb1cb3a211 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -3,7 +3,7 @@ namespace Test open System.Runtime.CompilerServices open CSharpLib -type MyTy() = +[]type MyTy() = static member GetCallerLineNumber([] ?line : int) = line @@ -25,5 +25,8 @@ module Program = match CallerInfoTest.AllInfo(21) with | (_, 25) -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x - + + if (typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerInfoAttribute).LineNumber <> 6 then + failwith "Unexpected C# MyCallerInfoAttribute" + 0 \ No newline at end of file From 0af588175487439a50f3cac78c5840d843b54e26 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 22 Apr 2016 13:45:10 -0700 Subject: [PATCH 097/334] Added FSharp.ProjectSystem.Base.pkgdef --- .../VisualFSharpVsix/Source.extension.vsixmanifest | 3 ++- vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 9 ++------- .../FSharp.ProjectSystem.Base/Project/AssemblyInfo.cs | 2 ++ .../Project/ProjectSystem.Base.csproj | 8 ++++++++ .../{InternalsVisibleTo.fs => AssemblyInfo.fs} | 0 .../src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj | 4 ++-- 6 files changed, 16 insertions(+), 10 deletions(-) rename vsintegration/src/FSharp.ProjectSystem.FSharp/{InternalsVisibleTo.fs => AssemblyInfo.fs} (100%) diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 1b3d1d31601..115855750e1 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -2,7 +2,7 @@ - + Visual F# Tools Templates Deploy Visual F# Tools templates to Visual Studio @@ -15,6 +15,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 8ef8e8f7704..0b44cdf450e 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -65,11 +65,6 @@ true RegisterFsharpPackage.pkgdef - - Always - true - FSharp.ProjectSystem.FSharp.pkgdef - @@ -284,14 +279,14 @@ {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7} ProjectSystem.Base - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44} ProjectSystem - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/AssemblyInfo.cs b/vsintegration/src/FSharp.ProjectSystem.Base/Project/AssemblyInfo.cs index 631339a3aa5..df70af9eaad 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/AssemblyInfo.cs +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/AssemblyInfo.cs @@ -20,3 +20,5 @@ [assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.ProjectSystem.PropertyPages, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")] [assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Salsa, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")] [assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")] + +[assembly: Microsoft.VisualStudio.Shell.ProvideCodeBase(CodeBase = @"$PackageFolder$\FSharp.ProjectSystem.Base.dll")] diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index ce57ea0b070..c20e22eaeb3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -29,6 +29,13 @@ $(DefineConstants);FX_ATLEAST_LINQ $(DefineConstants);FX_PREFERRED_UI_LANG + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -207,6 +214,7 @@ + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/AssemblyInfo.fs similarity index 100% rename from vsintegration/src/FSharp.ProjectSystem.FSharp/InternalsVisibleTo.fs rename to vsintegration/src/FSharp.ProjectSystem.FSharp/AssemblyInfo.fs diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index d90cef2594f..48512268a4a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -1,6 +1,6 @@  - + ..\..\..\src FSharp @@ -55,7 +55,7 @@ fsiCommands.vsct - + From ce60884cd04290ac6da9738ea5ba5e76f978b4bf Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 22 Apr 2016 13:48:26 -0700 Subject: [PATCH 098/334] Added FSharp.VS.FSI.pkgdef --- .../VisualFSharpVsix/Source.extension.vsixmanifest | 1 + vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 2 +- .../{InternalsVisibleTo.fs => AssemblyInfo.fs} | 3 +++ vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj | 10 +++++++++- 4 files changed, 14 insertions(+), 2 deletions(-) rename vsintegration/src/FSharp.VS.FSI/{InternalsVisibleTo.fs => AssemblyInfo.fs} (95%) diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 115855750e1..fea79c2ca6d 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -16,6 +16,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 0b44cdf450e..ad22c00d0e2 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -300,7 +300,7 @@ {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} FSharp.VS.FSI - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false diff --git a/vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs b/vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs similarity index 95% rename from vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs rename to vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs index e4a5bd2e60d..0aa5ac71add 100644 --- a/vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs +++ b/vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs @@ -5,6 +5,7 @@ namespace Microsoft.FSharp open System.Reflection open System.Runtime.CompilerServices open System.Runtime.InteropServices +open Microsoft.VisualStudio.Shell [] @@ -17,5 +18,7 @@ open System.Runtime.InteropServices [] [] +[] + do() diff --git a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj index bda3346734e..9f30d813ee6 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj @@ -20,6 +20,13 @@ LIBRARY $(NoWarn);47;75 $(OtherFlags) --subsystemversion:6.00 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -31,7 +38,7 @@ - + CompilerLocationUtils.fs @@ -106,6 +113,7 @@ + From efe9d286c2344063b48747457a5baa7abf55b766 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 22 Apr 2016 13:48:26 -0700 Subject: [PATCH 099/334] Added FSharp.VS.FSI.pkgdef --- .../VisualFSharpVsix/Source.extension.vsixmanifest | 1 + .../VisualFSharpVsix/VisualFSharpVsix.csproj | 2 +- .../{InternalsVisibleTo.fs => AssemblyInfo.fs} | 3 +++ vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj | 12 +++++++++++- 4 files changed, 16 insertions(+), 2 deletions(-) rename vsintegration/src/FSharp.VS.FSI/{InternalsVisibleTo.fs => AssemblyInfo.fs} (96%) diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 115855750e1..fea79c2ca6d 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -16,6 +16,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 0b44cdf450e..ad22c00d0e2 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -300,7 +300,7 @@ {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} FSharp.VS.FSI - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false diff --git a/vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs b/vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs similarity index 96% rename from vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs rename to vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs index e4a5bd2e60d..6fa80ea3d1c 100644 --- a/vsintegration/src/FSharp.VS.FSI/InternalsVisibleTo.fs +++ b/vsintegration/src/FSharp.VS.FSI/AssemblyInfo.fs @@ -5,6 +5,7 @@ namespace Microsoft.FSharp open System.Reflection open System.Runtime.CompilerServices open System.Runtime.InteropServices +open Microsoft.VisualStudio.Shell [] @@ -17,5 +18,7 @@ open System.Runtime.InteropServices [] [] +[] + do() diff --git a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj index bda3346734e..27c69ce3c91 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj @@ -20,6 +20,13 @@ LIBRARY $(NoWarn);47;75 $(OtherFlags) --subsystemversion:6.00 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -31,7 +38,7 @@ - + CompilerLocationUtils.fs @@ -65,6 +72,8 @@ + + @@ -106,6 +115,7 @@ + From 80cbebecd545eaee26f08b106897caae452e93ed Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 22 Apr 2016 17:22:13 -0700 Subject: [PATCH 100/334] Added missing assemblies pkgdef files --- ...nfo.FSharp.LanguageService.Compiler.dll.fs | 60 +++++++++++++++++++ .../FSharp.LanguageService.Compiler.fsproj | 23 ++++++- .../RegisterFsharpPackage.pkgdef | 21 ++----- .../Source.extension.vsixmanifest | 5 ++ .../VisualFSharpVsix/VisualFSharpVsix.csproj | 11 ++-- .../src/FSharp.Editor/AssemblyInfo.fs | 10 ++++ .../src/FSharp.Editor/FSharp.Editor.fsproj | 26 ++++++-- .../FSharp.LanguageService.Base.csproj | 10 ++++ .../Properties/AssemblyInfo.cs | 3 + ...{InternalsVisibleTo.fs => AssemblyInfo.fs} | 5 ++ .../FSharp.LanguageService.fsproj | 14 ++++- .../AssemblyInfo.vb | 3 + .../Common/Utils.vb | 2 +- .../FSharp.PropertiesPages.vbproj | 11 ++++ 14 files changed, 174 insertions(+), 30 deletions(-) create mode 100644 src/assemblyinfo/assemblyinfo.FSharp.LanguageService.Compiler.dll.fs create mode 100644 vsintegration/src/FSharp.Editor/AssemblyInfo.fs rename vsintegration/src/FSharp.LanguageService/{InternalsVisibleTo.fs => AssemblyInfo.fs} (97%) diff --git a/src/assemblyinfo/assemblyinfo.FSharp.LanguageService.Compiler.dll.fs b/src/assemblyinfo/assemblyinfo.FSharp.LanguageService.Compiler.dll.fs new file mode 100644 index 00000000000..d246c7d156e --- /dev/null +++ b/src/assemblyinfo/assemblyinfo.FSharp.LanguageService.Compiler.dll.fs @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.FSharp + +open System.Reflection +open System.Runtime.InteropServices +open Microsoft.VisualStudio.Shell + +[] +[] +[] +[] +[] +[] + +#if NO_STRONG_NAMES +[] +[] +[] +[] +[] +[] +[] +[] +[] + +// Note: internals visible to unit test DLLs in Retail (and all) builds. +[] +[] +[] +[] +#if BUILDING_WITH_LKG +[] +#endif +#endif +#if STRONG_NAME_AND_DELAY_SIGN_FSHARP_COMPILER_WITH_MSFT_KEY + +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +#endif + +#if BUILDING_WITH_LKG +[] +#endif + +[] + +do() diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index 3551db51797..341c79ef43c 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -21,6 +21,13 @@ {a437a6ec-5323-47c2-8f86-e2cac54ff152} true 0x06800000 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -40,8 +47,8 @@ Reflection\reshapedreflection.fs - - assemblyinfo.FSharp.Compiler.dll.fs + + assemblyinfo.FSharp.LanguageService.Compiler.dll.fs @@ -533,6 +540,17 @@ + + + + + + + + + + + @@ -550,6 +568,7 @@ + $(OtherFlags) /warnon:1182 diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef index 8cf31f30118..aeedcb9c730 100644 --- a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -15,19 +15,6 @@ "ml"="97" "mli"="97" -[$RootKey$\Packages\{871d2a70-12a2-4e42-9440-425dd92a4116}] -"InprocServer32"="$System$\mscoree.dll" -"Class"="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" -"Assembly"="FSharp.LanguageService, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" -"ID"="1" -"MinEdition"="standard" -"ProductVersion"="4.1" -"ProductName"="Visual F#" -"CompanyName"="Microsoft Corp." -"VWDExpressId"="3" -"WDExpressId"="2" -@="Microsoft.VisualStudio.FSharp.LanguageService.FSharpPackage" - [$RootKey$\Languages\File Extensions] ".fs"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" ".fsi"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" @@ -131,14 +118,14 @@ "{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}"=", 1000.ctmenu, 1" [$RootKey$\CLSID\{e1194663-db3c-49eb-8b45-276fcdc440ea}] -"InprocServer32"="$System$\mscoree.dll" +"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" "Class"="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" "Assembly"="FSharp.ProjectSystem.FSharp, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" @="Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpBuildPropertyPage" [$RootKey$\CLSID\{6d2d9b56-2691-4624-a1bf-d07a14594748}] -"InprocServer32"="$System$\mscoree.dll" +"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpApplicationPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" @@ -159,14 +146,14 @@ @="Microsoft.VisualStudio.Editors.PropertyPages.FSharpBuildPropPageComClass" [$RootKey$\CLSID\{9cfbeb2a-6824-43e2-bd3b-b112febc3772}] -"InprocServer32"="$System$\mscoree.dll" +"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" @="Microsoft.VisualStudio.Editors.PropertyPages.FSharpDebugPropPageComClass" [$RootKey$\CLSID\{df16b1a2-0e91-4499-ae60-c7144e614bf1}] -"InprocServer32"="$System$\mscoree.dll" +"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL" "Class"="Microsoft.VisualStudio.Editors.PropertyPages.FSharpReferencePathsPropPageComClass" "Assembly"="FSharp.ProjectSystem.PropertyPages, Version=15.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ThreadingModel"="Both" diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index fea79c2ca6d..b2de135809b 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -17,6 +17,11 @@ + + + + + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index ad22c00d0e2..94e008c57f2 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -114,7 +114,7 @@ {A437A6EC-5323-47C2-8F86-E2CAC54FF152} FSharp.LanguageService.Compiler - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false @@ -261,18 +261,21 @@ {65e0e82a-eace-4787-8994-888674c2fe87} FSharp.Editor + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF} FSharp.LanguageService.Base - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F} FSharp.LanguageService - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false @@ -293,7 +296,7 @@ {FCFB214C-462E-42B3-91CA-FC557EFEE74F} FSharp.PropertiesPages - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false diff --git a/vsintegration/src/FSharp.Editor/AssemblyInfo.fs b/vsintegration/src/FSharp.Editor/AssemblyInfo.fs new file mode 100644 index 00000000000..df2a6155a39 --- /dev/null +++ b/vsintegration/src/FSharp.Editor/AssemblyInfo.fs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.Editor + +open Microsoft.VisualStudio.Shell + +[] + +do() + diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index dc3b6afa8f0..4bdc4a0a106 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -20,8 +20,16 @@ $(NoWarn);75 false $(OtherFlags) --warnon:1182 --subsystemversion:6.00 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true + @@ -60,11 +68,21 @@ - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj index d220bb28138..6071de5261b 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj +++ b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj @@ -31,6 +31,13 @@ $(DefineConstants);FX_ATLEAST_LINQ + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -67,6 +74,8 @@ + + @@ -131,6 +140,7 @@ + diff --git a/vsintegration/src/FSharp.LanguageService.Base/Properties/AssemblyInfo.cs b/vsintegration/src/FSharp.LanguageService.Base/Properties/AssemblyInfo.cs index 31b1845831f..93c6c598728 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/Properties/AssemblyInfo.cs +++ b/vsintegration/src/FSharp.LanguageService.Base/Properties/AssemblyInfo.cs @@ -4,6 +4,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using Microsoft.VisualStudio.Shell; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -26,3 +27,5 @@ [assembly: Guid("1EB3E293-6A40-4480-8FE6-7436C4879CA4")] [assembly: CLSCompliant(true)] + +[assembly: ProvideCodeBase(CodeBase = @"$PackageFolder$\FSharp.LanguageService.Base.dll")] diff --git a/vsintegration/src/FSharp.LanguageService/InternalsVisibleTo.fs b/vsintegration/src/FSharp.LanguageService/AssemblyInfo.fs similarity index 97% rename from vsintegration/src/FSharp.LanguageService/InternalsVisibleTo.fs rename to vsintegration/src/FSharp.LanguageService/AssemblyInfo.fs index 97015e4bc6e..4c0b3b26c18 100644 --- a/vsintegration/src/FSharp.LanguageService/InternalsVisibleTo.fs +++ b/vsintegration/src/FSharp.LanguageService/AssemblyInfo.fs @@ -1,7 +1,10 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.FSharp + open System.Reflection +open Microsoft.VisualStudio.Shell + [] [] [] @@ -13,5 +16,7 @@ open System.Reflection [] [] +[] + do() diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 3a2634fe79a..9c38f06bf16 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -6,6 +6,13 @@ FSharp true v4.6 + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -33,7 +40,7 @@ - + @@ -72,7 +79,8 @@ - + + @@ -115,7 +123,9 @@ True + + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/AssemblyInfo.vb b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/AssemblyInfo.vb index 9a4e0c2f89c..945213f2d89 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/AssemblyInfo.vb +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/AssemblyInfo.vb @@ -3,6 +3,7 @@ Imports System Imports System.Reflection Imports System.Runtime.CompilerServices +Imports Microsoft.VisualStudio.Shell '/* F# additions: begin. */ @@ -12,3 +13,5 @@ Imports System.Runtime.CompilerServices + + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Common/Utils.vb b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Common/Utils.vb index 2341ea9021c..058374e5fbb 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Common/Utils.vb +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Common/Utils.vb @@ -268,7 +268,7 @@ Namespace Microsoft.VisualStudio.Editors.Common If TypeOf ex Is NullReferenceException _ OrElse (Not IgnoreOutOfMemory AndAlso TypeOf ex Is OutOfMemoryException) _ OrElse TypeOf ex Is StackOverflowException _ - OrElse TypeOf ex Is Threading.ThreadAbortException _ + OrElse TypeOf ex Is System.Threading.ThreadAbortException _ OrElse TypeOf ex Is AccessViolationException _ Then Return True diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 7c7314bd741..3d41669383f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -41,6 +41,13 @@ $(DefineConstants),FX_ATLEAST_LINQ=True + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true @@ -63,9 +70,12 @@ + + + @@ -305,6 +315,7 @@ + From 12db616bcaca1f9722698f61c0d043278b78ab1e Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 24 Apr 2016 17:35:44 -0700 Subject: [PATCH 101/334] Make sure to issue error in the case of multiple caller info attributes --- src/fsharp/infos.fs | 28 +++++++++++++++++-- .../Imported/CallerInfo/E_MultipleAttrs.fs | 21 ++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 10854c75fcd..7308224de33 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1285,9 +1285,20 @@ type MethInfo = let isOutArg = (p.IsOut && not p.IsIn) // Note: we get default argument values from VB and other .NET language metadata let optArgInfo = OptionalArgInfo.FromILParameter g amap m ilMethInfo.MetadataScope ilMethInfo.DeclaringTypeInst p + let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute p.CustomAttrs let isCallerFilePathArg = TryFindILAttribute g.attrib_CallerFilePathAttribute p.CustomAttrs - let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber elif isCallerFilePathArg then CallerFilePath else NoCallerInfo + + let callerInfoInfo = + match isCallerLineNumberArg, isCallerFilePathArg with + | false, false -> NoCallerInfo + | true, false -> CallerLineNumber + | false, true -> CallerFilePath + | true, true -> + // if multiple caller info attributes are specified, pick the "wrong" one here + // so that we get an error later + if p.Type.TypeRef.FullName = "System.Int32" then CallerFilePath + else CallerLineNumber yield (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo) ] ] @@ -1303,9 +1314,22 @@ type MethInfo = let isOptArg = HasFSharpAttribute g g.attrib_OptionalArgumentAttribute argInfo.Attribs // Note: can't specify caller-side default arguments in F#, by design (default is specified on the callee-side) let optArgInfo = if isOptArg then CalleeSide else NotOptional + let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs let isCallerFilePathArg = HasFSharpAttribute g g.attrib_CallerFilePathAttribute argInfo.Attribs - let callerInfoInfo = if isCallerLineNumberArg then CallerLineNumber elif isCallerFilePathArg then CallerFilePath else NoCallerInfo + + let callerInfoInfo = + match isCallerLineNumberArg, isCallerFilePathArg with + | false, false -> NoCallerInfo + | true, false -> CallerLineNumber + | false, true -> CallerFilePath + | true, true -> + // if multiple caller info attributes are specified, pick the "wrong" one here + // so that we get an error later + match tryDestOptionTy g ty with + | Some optTy when typeEquiv g g.int32_ty optTy -> CallerFilePath + | _ -> CallerLineNumber + (isParamArrayArg, isOutArg, optArgInfo, callerInfoInfo, reflArgInfo)) | DefaultStructCtor _ -> diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs new file mode 100644 index 00000000000..5385abf532b --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs @@ -0,0 +1,21 @@ +//'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'int' +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'int' + +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member A([] [] ?x : int) = + x + + static member B([] [] ?x : int) = + x + + static member C([] [] ?x : string) = + x + + static member D([] [] ?x : string) = + x From 7185fad30afa082c6443937891d543d2869fd1c6 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 24 Apr 2016 17:40:56 -0700 Subject: [PATCH 102/334] Add additional negative tests for non-optional args with option types --- .../Imported/CallerInfo/E_CallerFilePath.fs | 8 ++++++-- .../Imported/CallerInfo/E_CallerLineNumber.fs | 10 +++++++--- .../Imported/CallerInfo/env.lst | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs index 8eccc449b8d..d6e160d39af 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerFilePath.fs @@ -1,5 +1,6 @@ -//'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' -//'CallerFilePath' can only be applied to optional arguments +//'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerFilePath' can only be applied to optional arguments +//'CallerFilePath' can only be applied to optional arguments namespace Test open System.Runtime.CompilerServices @@ -9,4 +10,7 @@ type MyTy() = path static member GetCallerFilePathNotOptional([] path : string) = + path + + static member GetCallerFilePathNotOptional([] path : string option) = path \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs index b89004e0214..1d66da69961 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerLineNumber.fs @@ -1,5 +1,6 @@ -//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'string' -//'CallerLineNumber' can only be applied to optional arguments +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'string' +//'CallerLineNumber' can only be applied to optional arguments +//'CallerLineNumber' can only be applied to optional arguments namespace Test open System.Runtime.CompilerServices @@ -8,5 +9,8 @@ type MyTy() = static member GetCallerLineNumberNotInt([] ?line : string) = line - static member GetCallerLineNumberNotOptional([] line : string) = + static member GetCallerLineNumberNotOptional([] line : int) = + line + + static member GetCallerLineNumberNotOptional([] line : int option) = line \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index bb430c0b586..ea7b5653a7a 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -2,4 +2,5 @@ SOURCE=CallerFilePath.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerFilePath.fs SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs + SOURCE=E_MutltipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MutltipleAttrs.fs From 58bab3f3d387e4e8bcbc479356cca476a51aa5c3 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 24 Apr 2016 17:53:07 -0700 Subject: [PATCH 103/334] Add tests covering directive-defined line number and file name --- .../Imported/CallerInfo/CallerFilePath.fs | 12 +++++++++++- .../Imported/CallerInfo/CallerLineNumber.fs | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index 2806aadf5b0..1353ac55783 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -51,5 +51,15 @@ module Program = match CallerInfoTest.AllInfo(21) with | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x - + +# 345 "qwerty1" + match CallerInfoTest.AllInfo(123) with + | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty1" path -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + +# 456 "qwerty2" + match CallerInfoTest.AllInfo(123) with + | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty2" path -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index 5fb1cb3a211..d975ddc02d6 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -2,8 +2,8 @@ namespace Test open System.Runtime.CompilerServices open CSharpLib - -[]type MyTy() = +[] +type MyTy() = static member GetCallerLineNumber([] ?line : int) = line @@ -26,7 +26,16 @@ module Program = | (_, 25) -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x - if (typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerInfoAttribute).LineNumber <> 6 then + if (typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerInfoAttribute).LineNumber <> 5 then failwith "Unexpected C# MyCallerInfoAttribute" - + +# 345 "qwerty" + match CallerInfoTest.AllInfo(123) with + | (_, 345) -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x +# 456 "qwerty" + match CallerInfoTest.AllInfo(123) with + | (_, 456) -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + 0 \ No newline at end of file From 718204e8bfb647f3fad67c68e6e22bc7127fd4a9 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 24 Apr 2016 18:11:29 -0700 Subject: [PATCH 104/334] Add tests covering FSI --- .../Imported/CallerInfo/ViaInteractive.fsx | 29 +++++++++++++++++++ .../Imported/CallerInfo/env.lst | 3 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx new file mode 100644 index 00000000000..747997b55d6 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx @@ -0,0 +1,29 @@ +open System.Runtime.CompilerServices +open CSharpLib +;; +type MyTy() = + static member GetCallerFilePath([] ?path : string) = + path + static member GetCallerLineNumber([] ?line : int) = + line +;; +let matchesPath path (s : string) = + s.EndsWith(path) + && not (s.Contains("\\\\")) + && not (path.Contains("\\.\\")) + && not (path.Contains("\\..\\")) + +let scriptName = if Array.contains "--exec" (System.Environment.GetCommandLineArgs()) then "ViaInteractive.fsx" else "stdin" +let checkPath = sprintf "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\%s" scriptName +;; +match MyTy.GetCallerFilePath() with +| Some(path) when matchesPath checkPath path -> () +| x -> failwithf "Unexpected: %A" x +;; +if MyTy.GetCallerLineNumber() <> Some(23) then + failwith "Unexpected F# CallerLineNumber" +;; +match CallerInfoTest.AllInfo(21) with +| (path, 26) when matchesPath checkPath path -> () +| x -> failwithf "Unexpected C# result with multiple parameter types: %A" x +;; \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index ea7b5653a7a..98a9b3019e8 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -3,4 +3,5 @@ SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs SOURCE=E_MutltipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MutltipleAttrs.fs - + SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec + SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe From a4d55abe728cee8b463adebce5950d415d572de1 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 24 Apr 2016 18:26:54 -0700 Subject: [PATCH 105/334] Fix tests --- .../Imported/CallerInfo/E_MultipleAttrs.fs | 4 ++-- .../Imported/CallerInfo/ViaInteractive.fsx | 3 ++- .../SpecialAttributesAndTypes/Imported/CallerInfo/env.lst | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs index 5385abf532b..fda49ca239f 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_MultipleAttrs.fs @@ -1,7 +1,7 @@ //'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' //'CallerFilePath' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' -//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'int' -//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'int' +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'string' +//'CallerLineNumber' must be applied to an argument of type 'int', but has been applied to an argument of type 'string' namespace Test diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx index 747997b55d6..e3668ea3b6a 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx @@ -26,4 +26,5 @@ if MyTy.GetCallerLineNumber() <> Some(23) then match CallerInfoTest.AllInfo(21) with | (path, 26) when matchesPath checkPath path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x -;; \ No newline at end of file +;; +#q;; \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 98a9b3019e8..6f4189af891 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -2,6 +2,6 @@ SOURCE=CallerFilePath.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerFilePath.fs SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs - SOURCE=E_MutltipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MutltipleAttrs.fs - SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec - SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe + SOURCE=E_MultipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MultipleAttrs.fs + SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec + SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe From 1d88a9369cf99358bc148317d5c6fdf45cd1f766 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 24 Apr 2016 18:36:25 -0700 Subject: [PATCH 106/334] Added code quotation conformance test for struct records --- .../Baselines/NewStructRecord.fs | 12 ++++++++++++ .../ExpressionQuotations/Baselines/env.lst | 1 + 2 files changed, 13 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/NewStructRecord.fs diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/NewStructRecord.fs b/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/NewStructRecord.fs new file mode 100644 index 00000000000..0571277fca2 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/NewStructRecord.fs @@ -0,0 +1,12 @@ +// #Conformance #Quotations +open Microsoft.FSharp.Quotations +open Microsoft.FSharp.Quotations.Patterns +open QuoteUtils + +[] type t = { Name : string; Age : int } +let q = <@ let x = { Name = "Bob"; Age = 10; } in x @> +let q' = Expr.NewRecord(typeof, [Expr.Value("Bob"); Expr.Value(10)]) + +let r1 = verify q (|NewRecord|_|) "Let (x, NewRecord (t, Value (\"Bob\"), Value (10)), x)" +let r2 = verify q' (|NewRecord|_|) "NewRecord (t, Value (\"Bob\"), Value (10))" +exit <| if r1 = 0 && r2 = 0 then 0 else 1 diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/env.lst b/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/env.lst index da0fadda588..569c124dfb3 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/env.lst +++ b/tests/fsharpqa/Source/Conformance/Expressions/ExpressionQuotations/Baselines/env.lst @@ -29,6 +29,7 @@ SOURCE=NewDelegate.fs SCFLAGS=-r:QuoteUtils.dll # NewDelegateQuote SOURCE=NewObject.fs SCFLAGS=-r:QuoteUtils.dll # NewObjectQuote SOURCE=NewRecord.fs SCFLAGS=-r:QuoteUtils.dll # NewRecordQuote + SOURCE=NewStructRecord.fs SCFLAGS=-r:QuoteUtils.dll # NewStructRecordQuote SOURCE=NewTuple.fs SCFLAGS=-r:QuoteUtils.dll # NewTupleQuote SOURCE=NewUnionCase.fs SCFLAGS=-r:QuoteUtils.dll # NewUnionCaseQuote SOURCE=OrElse.fs SCFLAGS=-r:QuoteUtils.dll # OrElseQuote From 323237d4ea44687d1b56151b21e7a5d10d9d4bcd Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 24 Apr 2016 19:38:46 -0700 Subject: [PATCH 107/334] Added reflected definition test for struct record --- tests/fsharp/core/quotes/test.fsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/fsharp/core/quotes/test.fsx b/tests/fsharp/core/quotes/test.fsx index 47151507fdb..2c45e996577 100644 --- a/tests/fsharp/core/quotes/test.fsx +++ b/tests/fsharp/core/quotes/test.fsx @@ -2283,6 +2283,14 @@ module ReflectedDefinitionOnTypesWithImplicitCodeGen = #endif check "celnwer34" (Quotations.Expr.TryGetReflectedDefinition(m).IsNone) true + // This type has an implicit IComparable implementation, it is not accessible as a reflected definition + [] type SR = { x:int; y:string; z:System.DateTime } +#if NetCore + for m in typeof.GetMethods() do +#else + for m in typeof.GetMethods(System.Reflection.BindingFlags.DeclaredOnly) do +#endif + check "celnwer35" (Quotations.Expr.TryGetReflectedDefinition(m).IsNone) true #if Portable #else From a71222cfdfd418d45af7c244f9c766923f47a76d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 24 Apr 2016 19:44:09 -0700 Subject: [PATCH 108/334] Added pattern matching struct record tests --- .../PatternMatching/Record/env.lst | 3 ++ .../Record/structRecordPatterns01.fs | 32 +++++++++++++++ .../Record/structRecordPatterns02.fs | 39 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns01.fs create mode 100644 tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns02.fs diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/env.lst b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/env.lst index 9736f33cef5..36e0494dd25 100644 --- a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/env.lst +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/env.lst @@ -1,6 +1,9 @@ SOURCE=recordPatterns01.fs # recordPatterns01.fs SOURCE=recordPatterns02.fs # recordPatterns02.fs + SOURCE=structRecordPatterns01.fs # structRecordPatterns01.fs + SOURCE=structRecordPatterns02.fs # structRecordPatterns02.fs + SOURCE=E_SyntaxError01.fs # E_SyntaxError01.fs SOURCE=E_RecordFieldNotDefined01.fs # E_RecordFieldNotDefined01.fs SOURCE=E_RecTypesNotMatch01.fs # E_RecTypesNotMatch01.fs \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns01.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns01.fs new file mode 100644 index 00000000000..007aac6c23a --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns01.fs @@ -0,0 +1,32 @@ +// #Conformance #PatternMatching #Records +#light + +// Test ability to match records even if a subset of tags are specified. + +type Type = Plant | Animal | Mineral +[] type Thing = {Name : string; Age : int; Type : Type} + +// Single part +let isAnimal thing = + match thing with + | {Type=Animal} -> true + | _ -> false + +// Multi part +let isSteve thing = + match thing with + | {Name = "Steve"; Age = 2} -> true + | _ -> false + + +let animal = {Name = "Steve"; Age = 2; Type = Animal} +let plant = {Name = "Sunflower"; Age = 5; Type = Plant} +let rock = {Name = "Gold"; Age = 500000; Type = Mineral} + +if isAnimal animal <> true then exit 1 +if isAnimal rock <> false then exit 1 + +if isSteve animal <> true then exit 1 +if isSteve plant <> false then exit 1 + +exit 0 diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns02.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns02.fs new file mode 100644 index 00000000000..0d34aaadc7f --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/structRecordPatterns02.fs @@ -0,0 +1,39 @@ +// #Conformance #PatternMatching #Records +#light + +// Verify ability to have nested patterns in record types + +type Type = Plant | Animal | Mineral +[] type Thing = {Name : string; Age : int; Type : Type} + +let isYoung thing = + match thing with + | {Age = x; Type = (Plant|Animal|Mineral)} when x < 10 -> true + | _ -> false + +let isMatch thing (thingName : string option) (thingAge : int option) = + // We can't extract the option value in a match and use it in the same statement, + // so we first break open the optional values. + let name = match thingName with Some(name) -> name | None -> "" + let age = match thingAge with Some(age) -> age | None -> 0 + // Finally match it all + match thingName, thingAge, thing with + | None, None, _ -> false + | Some(_), None, {Name=itsName} when itsName = name -> true + | None, Some(_), {Age=itsAge} when itsAge = age -> true + | Some(_), Some(_), {Name=name; Age=age} -> true + | _ -> false + +let animal = {Name = "Steve"; Age = 2; Type = Animal} +let plant = {Name = "Sunflower"; Age = 5; Type = Plant} +let rock = {Name = "Gold"; Age = 500000; Type = Mineral} + +if isYoung animal <> true then exit 1 +if isYoung rock <> false then exit 1 + +if isMatch animal (Some("Steve")) (Some(2)) <> true then exit 1 +if isMatch animal (Some("Steve")) None <> true then exit 1 + +if isMatch animal (Some("NotSteve")) None <> false then exit 1 + +exit 0 From 3351647294ba00bd6ffa4ff2daca84829a6fe101 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sun, 24 Apr 2016 19:55:24 -0700 Subject: [PATCH 109/334] Added struct record cloning conformance tests --- .../RecordTypes/StructRecordCloning01.fs | 26 +++++++++++++++++ .../RecordTypes/StructRecordCloning02.fs | 15 ++++++++++ .../RecordTypes/StructRecordCloning03.fs | 29 +++++++++++++++++++ .../RecordTypes/env.lst | 4 +++ 4 files changed, 74 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning01.fs create mode 100644 tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning02.fs create mode 100644 tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning03.fs diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning01.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning01.fs new file mode 100644 index 00000000000..27f0c90b20d --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning01.fs @@ -0,0 +1,26 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify the ability to clone records using a simplified syntax + +[] type RecType = { A : int; B : string; C : float; D : RecType option } + +let t1 = { A = 1; B = "t1"; C = 3.14; D = None } + +let t2 = { t1 with A = 2 } +let t3 = { t2 with B = "t3" } +let t4 = { t3 with C = 4.4; D = Some(t1) } + +// Changed field +if t1.A <> 1 || t2.A <> 2 then exit 1 +// The rest were cloned from t1 +if t1.B <> t2.B || t1.C <> t2.C || t1.D <> t2.D then exit 1 + +if t3.B <> "t3" then exit 1 +// The rest were cloned from t2 +if t3.A <> t2.A || t3.C <> t2.C || t3.D <> t2.D then exit 1 + +if t4.C <> 4.4 || t4.D <> Some(t1) then exit 1 +if t4.A <> t3.A || t4.B <> t3.B then exit 1 + +exit 0 diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning02.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning02.fs new file mode 100644 index 00000000000..85aec8d865b --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning02.fs @@ -0,0 +1,15 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify ability to clone records when they are returned from an arbitrary expression + +[] type Person = { Name : string; Age : int } + +let createPersonArray n a num = [| 1 .. num |] |> Array.map (fun _ -> { Name = n; Age = a } ) + +let test = { (createPersonArray "Bob" 30 100).[99] with Age = 0 } + +if test.Name <> "Bob" then exit 1 +if test.Age <> 0 then exit 1 + +exit 0 diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning03.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning03.fs new file mode 100644 index 00000000000..4d95518f756 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/StructRecordCloning03.fs @@ -0,0 +1,29 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify ability to clone a record with mutable fields + +[] type MutableRec = { mutable A : int; mutable B : string } + +let mutable t = { A = 1; B = "1" } +if t.A <> 1 || t.B <> "1" then exit 1 + +// Verify ability to mutate record fields +t.A <- 2 +t.B <- "2" +if t.A <> 2 || t.B <> "2" then exit 1 + +// Make a copy +let mutable copy = { t with A = -1 } +if copy.A <> -1 || copy.B <> "2" then exit 1 + +// Mutate the copy, verify it does NOT affect origional +copy.A <- -3 +copy.B <- "-3" + +if t.A <> 2 || t.B <> "2" then exit 1 +if copy.A <> -3 || copy.B <> "-3" then exit 1 + +exit 0 + + diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst index b3122e7431b..7d4fa2dc06f 100644 --- a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst @@ -53,6 +53,10 @@ NoMT SOURCE=Overload_ToString.fs COMPILE_ONLY=1 SCFLAGS=--warnaserror+ FSIMOD SOURCE=RecordCloning02.fs # RecordCloning02.fs SOURCE=RecordCloning03.fs # RecordCloning03.fs + SOURCE=StructRecordCloning01.fs # StructRecordCloning01.fs + SOURCE=StructRecordCloning02.fs # StructRecordCloning02.fs + SOURCE=StructRecordCloning03.fs # StructRecordCloning03.fs + SOURCE=E_RecordCloning01.fs # E_RecordCloning01.fs SOURCE=Syntax01.fs # Syntax01.fs From 7c87e1e1ca752a91056c777061663a8a666e1b75 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 26 Apr 2016 20:10:05 +0300 Subject: [PATCH 110/334] simplify CallerInfoInfo ToString --- src/fsharp/infos.fs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index bc2a433ff94..bd00e86680b 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -524,12 +524,7 @@ type CallerInfoInfo = | CallerMemberName | CallerFilePath - override x.ToString() = - match x with - | NoCallerInfo -> "NoCallerInfo" - | CallerLineNumber -> "CallerLineNumber" - | CallerMemberName -> "CallerMemberName" - | CallerFilePath -> "CallerFilePath" + override x.ToString() = sprintf "%+A" x [] type ReflectedArgInfo = From 9614626aebdc74b2794b372533998efa4937a619 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 26 Apr 2016 20:11:27 +0300 Subject: [PATCH 111/334] add NoCallerInfo as condition to isSimpleFormalArg --- src/fsharp/TypeChecker.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ce56b889cb5..a3dddda371e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -8714,7 +8714,7 @@ and TcMethodApplication let denv = env.DisplayEnv let isSimpleFormalArg (isParamArrayArg, isOutArg, optArgInfo: OptionalArgInfo, _callerInfoInfo: CallerInfoInfo, _reflArgInfo: ReflectedArgInfo) = - not isParamArrayArg && not isOutArg && not optArgInfo.IsOptional + not isParamArrayArg && not isOutArg && not optArgInfo.IsOptional && _callerInfoInfo = NoCallerInfo let callerObjArgTys = objArgs |> List.map (tyOfExpr cenv.g) From c2e10362951be5880aaf38cad8ae9e1f8c01968c Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 26 Apr 2016 20:11:47 +0300 Subject: [PATCH 112/334] removed ;; not needed --- .../Imported/CallerInfo/ViaInteractive.fsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx index e3668ea3b6a..4e8821372b9 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx @@ -1,12 +1,12 @@ open System.Runtime.CompilerServices open CSharpLib -;; + type MyTy() = static member GetCallerFilePath([] ?path : string) = path static member GetCallerLineNumber([] ?line : int) = line -;; + let matchesPath path (s : string) = s.EndsWith(path) && not (s.Contains("\\\\")) @@ -15,16 +15,16 @@ let matchesPath path (s : string) = let scriptName = if Array.contains "--exec" (System.Environment.GetCommandLineArgs()) then "ViaInteractive.fsx" else "stdin" let checkPath = sprintf "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\%s" scriptName -;; + match MyTy.GetCallerFilePath() with | Some(path) when matchesPath checkPath path -> () | x -> failwithf "Unexpected: %A" x -;; + if MyTy.GetCallerLineNumber() <> Some(23) then failwith "Unexpected F# CallerLineNumber" -;; + match CallerInfoTest.AllInfo(21) with | (path, 26) when matchesPath checkPath path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x -;; -#q;; \ No newline at end of file + +#q \ No newline at end of file From ba7c02f553b85a7a806968c624d50bdfa94b3488 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 26 Apr 2016 20:12:05 +0300 Subject: [PATCH 113/334] add first class tests --- .../Imported/CallerInfo/CallerLineNumber.fs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index d975ddc02d6..665af31c99e 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -29,6 +29,14 @@ module Program = if (typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerInfoAttribute).LineNumber <> 5 then failwith "Unexpected C# MyCallerInfoAttribute" + let getCallerLineNumber = CallerInfoTest.LineNumber + + if () |> CallerInfoTest.LineNumber <> 34 then + failwith "Unexpected C# CallerLineNumber" + + if getCallerLineNumber () <> 32 then + failwith "Unexpected C# CallerLineNumber" + # 345 "qwerty" match CallerInfoTest.AllInfo(123) with | (_, 345) -> () From 081689fb5b04b18fd683a87d5b285c2da9426807 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 26 Apr 2016 21:23:41 +0300 Subject: [PATCH 114/334] remove _ --- src/fsharp/TypeChecker.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a3dddda371e..b9223661279 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -8713,8 +8713,8 @@ and TcMethodApplication let denv = env.DisplayEnv - let isSimpleFormalArg (isParamArrayArg, isOutArg, optArgInfo: OptionalArgInfo, _callerInfoInfo: CallerInfoInfo, _reflArgInfo: ReflectedArgInfo) = - not isParamArrayArg && not isOutArg && not optArgInfo.IsOptional && _callerInfoInfo = NoCallerInfo + let isSimpleFormalArg (isParamArrayArg, isOutArg, optArgInfo: OptionalArgInfo, callerInfoInfo: CallerInfoInfo, _reflArgInfo: ReflectedArgInfo) = + not isParamArrayArg && not isOutArg && not optArgInfo.IsOptional && callerInfoInfo = NoCallerInfo let callerObjArgTys = objArgs |> List.map (tyOfExpr cenv.g) From dba815d981b51f5f722fda70076a590958b5f3d5 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 28 Apr 2016 14:23:37 +0300 Subject: [PATCH 115/334] implement CallerMemberName --- src/fsharp/PostInferenceChecks.fs | 9 +++++++-- src/fsharp/TcGlobals.fs | 2 ++ src/fsharp/TypeChecker.fs | 16 ++++++++++++++-- src/fsharp/infos.fs | 24 ++++++++++++++---------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 872749a9dd0..4d0f15a4ab9 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1339,8 +1339,13 @@ let CheckEntityDefn cenv env (tycon:Entity) = | CalleeSide, CallerFilePath -> if not ((isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.string_ty (destOptionTy cenv.g ty))) then errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy cenv.g ty)),m)) - | _ -> failwith "impossible") - + | CallerSide(_), CallerMemberName -> + if not (typeEquiv cenv.g cenv.g.string_ty ty) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv ty),m)) + | CalleeSide, CallerMemberName -> + if not ((isOptionTy cenv.g ty) && (typeEquiv cenv.g cenv.g.string_ty (destOptionTy cenv.g ty))) then + errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfoInfo.ToString(), "string", NicePrint.minimalStringOfType cenv.denv (destOptionTy cenv.g ty)),m))) + for pinfo in immediateProps do let nm = pinfo.PropertyName let m = (match pinfo.ArbitraryValRef with None -> m | Some vref -> vref.DefinitionRange) diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index 2a9b7a496f0..d0295bc03aa 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -302,6 +302,7 @@ type public TcGlobals = attrib_ExtensionAttribute : BuiltinAttribInfo attrib_CallerLineNumberAttribute : BuiltinAttribInfo attrib_CallerFilePathAttribute : BuiltinAttribInfo + attrib_CallerMemberNameAttribute : BuiltinAttribInfo tcref_System_Collections_Generic_IList : TyconRef tcref_System_Collections_Generic_IReadOnlyList : TyconRef @@ -1207,6 +1208,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa attrib_ExtensionAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.ExtensionAttribute" attrib_CallerLineNumberAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerLineNumberAttribute" attrib_CallerFilePathAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerFilePathAttribute" + attrib_CallerMemberNameAttribute = mkSystemRuntimeAttrib "System.Runtime.CompilerServices.CallerMemberNameAttribute" attrib_ProjectionParameterAttribute = mk_MFCore_attrib "ProjectionParameterAttribute" attrib_CustomOperationAttribute = mk_MFCore_attrib "CustomOperationAttribute" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b9223661279..b20e3b909d6 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -269,6 +269,8 @@ type TcEnv = // Information to enforce special restrictions on valid expressions // for .NET constructors. eCtorInfo : CtorInfo option + + eCallerMemberName : string option } member tenv.DisplayEnv = tenv.eNameResEnv.DisplayEnv member tenv.NameEnv = tenv.eNameResEnv @@ -289,7 +291,8 @@ let emptyTcEnv g = eInternalsVisibleCompPaths=[] eModuleOrNamespaceTypeAccumulator= ref (NewEmptyModuleOrNamespaceType Namespace) eFamilyType=None - eCtorInfo=None } + eCtorInfo=None + eCallerMemberName=None} //------------------------------------------------------------------------- // Helpers related to determining if we're in a constructor and/or a class @@ -9207,6 +9210,8 @@ and TcMethodApplication emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> emptyPreBinder,Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) + | CallerMemberName when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty && env.eCallerMemberName.IsSome -> + emptyPreBinder,Expr.Const(Const.String(env.eCallerMemberName.Value), mMethExpr, currCalledArgTy) | _ -> emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) @@ -9245,6 +9250,9 @@ and TcMethodApplication | CallerFilePath when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) + | CallerMemberName when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty && env.eCallerMemberName.IsSome -> + let memberNameExpr = Expr.Const(Const.String(env.eCallerMemberName.Value), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[memberNameExpr],mMethExpr) | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) // Combine the variable allocators (if any) @@ -9606,7 +9614,11 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt match bind with | NormalizedBinding(vis,bkind,isInline,isMutable,attrs,doc,_,valSynData,pat,NormalizedBindingRhs(spatsL,rtyOpt,rhsExpr),mBinding,spBind) -> - + let name = match pat with + | SynPat.Named(_,name,_,_,_) -> Some(name.idText) + | _ -> None + let envinner = {envinner with eCallerMemberName = name } + let (SynValData(memberFlagsOpt,valSynInfo,_)) = valSynData let attrTgt = DeclKind.AllowedAttribTargets memberFlagsOpt declKind diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index bd00e86680b..7d37ad064cb 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1288,13 +1288,15 @@ type MethInfo = let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute p.CustomAttrs let isCallerFilePathArg = TryFindILAttribute g.attrib_CallerFilePathAttribute p.CustomAttrs + let isCallerMemberNameArg = TryFindILAttribute g.attrib_CallerMemberNameAttribute p.CustomAttrs let callerInfoInfo = - match isCallerLineNumberArg, isCallerFilePathArg with - | false, false -> NoCallerInfo - | true, false -> CallerLineNumber - | false, true -> CallerFilePath - | true, true -> + match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg with + | false, false, false -> NoCallerInfo + | true, false, false -> CallerLineNumber + | false, true, false -> CallerFilePath + | false, false, true -> CallerMemberName + | _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later if p.Type.TypeRef.FullName = "System.Int32" then CallerFilePath @@ -1317,13 +1319,15 @@ type MethInfo = let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs let isCallerFilePathArg = HasFSharpAttribute g g.attrib_CallerFilePathAttribute argInfo.Attribs + let isCallerMemberNameArg = HasFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs let callerInfoInfo = - match isCallerLineNumberArg, isCallerFilePathArg with - | false, false -> NoCallerInfo - | true, false -> CallerLineNumber - | false, true -> CallerFilePath - | true, true -> + match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg with + | false, false, false -> NoCallerInfo + | true, false, false -> CallerLineNumber + | false, true, false -> CallerFilePath + | false, false, true -> CallerMemberName + | _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later match tryDestOptionTy g ty with From 25d73d393a6f07df13bdf4123aa971d5bcb138e6 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 28 Apr 2016 15:17:34 +0300 Subject: [PATCH 116/334] add quotation test --- .../CallerInfo/CallerInfoAndQuotiation.fs | 30 +++++++++++++++++++ .../Imported/CallerInfo/env.lst | 1 + 2 files changed, 31 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndQuotiation.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndQuotiation.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndQuotiation.fs new file mode 100644 index 00000000000..cd06b29d97f --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndQuotiation.fs @@ -0,0 +1,30 @@ +namespace Test + +open System.Runtime.CompilerServices +open Microsoft.FSharp.Quotations +open Microsoft.FSharp.Quotations.Patterns + +type MyTy() = + static member GetCallerLineNumber([] ?line : int) = + line + +module Program = + [] + let main (_:string[]) = + let expr = <@ MyTy.GetCallerLineNumber () @> + + match expr with + | Call(None, methodInfo, e::[]) + when methodInfo.Name = "GetCallerLineNumber" -> + match e with + | NewUnionCase(uci, value::[]) + when uci.Name = "Some" -> + match value with + | Value(obj, ty) when ty = typeof && obj :?> int = 14 -> () + | _ -> failwith "Unexpected F# CallerLineNumber" + | _ -> + failwith "Unexpected F# CallerLineNumber" + | _ -> + failwith "Unexpected F# CallerLineNumber" + + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 6f4189af891..c310757eae2 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -5,3 +5,4 @@ SOURCE=E_MultipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MultipleAttrs.fs SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe + SOURCE=CallerInfoAndQuotiation.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerInfoAndQuotiation.fs From 013db2f64d1509e46515957be9c431f5acba3cde Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 28 Apr 2016 15:39:08 +0300 Subject: [PATCH 117/334] add caller info test with computation expression --- .../CallerInfoAndComputationExpression.fs | 27 +++++++++++++++++++ .../Imported/CallerInfo/env.lst | 1 + 2 files changed, 28 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndComputationExpression.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndComputationExpression.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndComputationExpression.fs new file mode 100644 index 00000000000..8c28f251fc8 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerInfoAndComputationExpression.fs @@ -0,0 +1,27 @@ +namespace Test + +open System.Runtime.CompilerServices + +type Builder() = + member self.Bind(x, f, [] ?line : int) = + (f x, line) + + member self.Return(x, [] ?line : int) = + (x, line) + +module Program = + let builder = Builder() + + [] + let main (_:string[]) = + let result = + builder { + let! x = 1 + let! y = 2 + return x + y + } + + if result <> (((3, Some 21), Some 20), Some 19) then + failwith "Unexpected F# CallerLineNumber" + + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index c310757eae2..db596ffae40 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -6,3 +6,4 @@ SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe SOURCE=CallerInfoAndQuotiation.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerInfoAndQuotiation.fs + SOURCE=CallerInfoAndComputationExpression.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerInfoAndComputationExpression.fs From e743a8d7ddfa8969a807f28f8831a7eb0f24d427 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 28 Apr 2016 20:53:18 +0100 Subject: [PATCH 118/334] integrate visualfsharp\master (2) --- .../FSharp.ProjectSystem.FSharp/Project.fs | 176 +----------------- 1 file changed, 1 insertion(+), 175 deletions(-) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index 66a2eafb91f..d47bc2ec328 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -38,11 +38,6 @@ namespace rec Microsoft.VisualStudio.FSharp.ProjectSystem open Microsoft.VisualStudio.Editors open Microsoft.VisualStudio.Editors.PropertyPages -<<<<<<< HEAD -======= - open Microsoft.VisualStudio - ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 open EnvDTE open Microsoft.Build.BuildEngine @@ -283,10 +278,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. this.RegisterProjectFactory(new FSharpProjectFactory(this)) //this.RegisterProjectFactory(new FSharpWPFProjectFactory(this :> IServiceProvider)) -<<<<<<< HEAD -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 // was used to ensure the LS has been initialized, because the TypeProviderSecurityGlobals // global state was needed for e.g. Tools\Options //TODO the TypeProviderSecurityGlobals does not exists anymore, remove the initialization? @@ -363,20 +355,11 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. (project :> ProjectNode) -<<<<<<< HEAD /// This class is a 'fake' project factory that is used by WAP to register WAP specific information about /// FSharp projects. [] type internal WAFSharpProjectFactory() = class end -======= - and /// This class is a 'fake' project factory that is used by WAP to register WAP specific information about - /// FSharp projects. - [] - internal WAFSharpProjectFactory() = class end - - and ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 [] type internal FSharpProjectNode(package:FSharpProjectPackage) as this = @@ -387,12 +370,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. let GUID_MruPage = new Guid("{BF42FC6C-1C43-487F-A524-C2E7BC707479}") #endif let mutable vsProject : VSLangProj.VSProject = null -<<<<<<< HEAD -#if AUTOMATION - let mutable codeDomProvider : Microsoft.VisualStudio.Designer.Interfaces.IVSMDCodeDomProvider = null -#endif -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 let mutable trackDocumentsHandle = 0u let mutable addFilesNotification : option<(array -> unit)> = None // this object is only used for helping re-order newly added files (VS defaults to alphabetical order) @@ -458,12 +435,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. // The following properties classes are specific to F# so we can use their GUIDs directly this.AddCATIDMapping(typeof, typeof.GUID) this.AddCATIDMapping(typeof, typeof.GUID) -<<<<<<< HEAD -#if AUTOMATION - this.AddCATIDMapping(typeof, typeof.GUID) -#endif -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 // This one we use the same as F# file nodes since both refer to files this.AddCATIDMapping(typeof, typeof.GUID) this.AddCATIDMapping(typeof, typeof.GUID) @@ -624,11 +595,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. let documentTracker = this.Site.GetService(typeof) :?> IVsTrackProjectDocuments2 documentTracker.AdviseTrackProjectDocumentsEvents(this, &trackDocumentsHandle) |> ignore -<<<<<<< HEAD -======= - - ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 /// Returns the outputfilename based on the output type member x.OutputFileName = let assemblyName = this.ProjectMgr.GetProjectProperty(GeneralPropertyPageTag.AssemblyName.ToString(), true) @@ -638,17 +604,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. assemblyName + GetOutputExtension(outputType) -<<<<<<< HEAD -#if AUTOMATION - /// Retreive the CodeDOM provider - member this.CodeDomProvider : IVSMDCodeDomProvider = - if (codeDomProvider= null) then - codeDomProvider <- (new VSMDFSharpProvider(this.VSProject) :> IVSMDCodeDomProvider) - codeDomProvider -#endif - -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 /// Get the VSProject corresponding to this project member this.VSProject : VSLangProj.VSProject = if (vsProject= null) then @@ -830,13 +785,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. typeof.GUID typeof.GUID |] (VSHiveUtilities.getPriorityExtendedPropertyPages()) -<<<<<<< HEAD -#if AUTOMATION - override x.GetAutomationObject() = - new OAFSharpProject(this) |> box -#endif -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 /// Overriding to provide customization of files on add files. /// This will replace tokens in the file with actual value (namespace, class name,...) @@ -1352,16 +1300,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. /// Creates the services exposed by this project. member x.CreateServices(serviceType:Type) = -<<<<<<< HEAD -#if AUTOMATION - if (typeof = serviceType) then - this.CodeDomProvider |> box - else if (typeof = serviceType) then - this.CodeDomProvider.CodeDomProvider - else -#endif -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 if (typeof = serviceType) then this.VSProject |> box else if (typeof = serviceType) then @@ -1689,10 +1627,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. result <- null VSConstants.E_NOTIMPL -<<<<<<< HEAD - -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 member x.GetSpecificEditorType( _mkDocument:string, guidEditorType:byref ) = // Ideally we should at this point initalize a File extension to EditorFactory guid Map e.g. // in the registry hive so that more editors can be added without changing this part of the @@ -2107,16 +2041,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. | :? IOleServiceProvider as x -> x | _ -> null let sp = new Microsoft.VisualStudio.Shell.ServiceProvider(iOle) -<<<<<<< HEAD - Some(new SelectionElementValueChangedListener(sp, root)) -#if AUTOMATION - let mutable vsProjectItem : OAVSProjectItem = null - let mutable automationObject : OAFSharpFileItem option = None -#endif -======= Some(new SelectionElementValueChangedListener(sp)) ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 do selectionChangedListener.Value.Init() @@ -2170,18 +2096,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. with get() = x.ItemNode.GetMetadata(ProjectFileConstants.SubType) and set(value) = x.ItemNode.SetMetadata(ProjectFileConstants.SubType, value) -<<<<<<< HEAD -#if AUTOMATION - member x.VSProjectItem = - if (null = vsProjectItem) then - vsProjectItem <- new OAVSProjectItem(x) - vsProjectItem - - override x.Object = x.VSProjectItem |> box -#endif - -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 override x.CreatePropertiesObject() = let properties = new FSharpFileNodeProperties(x) (properties :> NodeProperties) @@ -2204,16 +2118,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. finally base.Dispose(disposing) -<<<<<<< HEAD -#if AUTOMATION - /// Returns an FSharp FileNode specific object implmenting DTE.ProjectItem - override x.GetAutomationObject() = - if automationObject.IsNone then - automationObject <- Some(new OAFSharpFileItem((x.ProjectMgr.GetAutomationObject() :?> OAProject), x)) - automationObject |> box -#endif -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 override x.ImageIndex = if (x.IsFormSubType) then int32 ProjectNode.ImageName.WindowsForm @@ -2612,21 +2516,6 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. new(project:ProjectNode, referencedProjectName:string, projectPath:string, projectReference:string) = { inherit ProjectReferenceNode(project, referencedProjectName, projectPath, projectReference) } -<<<<<<< HEAD - - /// Checks if a reference can be added to the project. - /// It calls base to see if the reference is not already there, - /// and that it is not circular reference. - /// If the target project is a a FSharp Project we can not add the project reference - /// because this scenario is not supported. - - /// The error handler delegate to return - /// false if reference cannot be added, otherwise true - override x.CheckIfCanAddReference() = - base.CheckIfCanAddReference() - -======= ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 /// Evaluates all fsharpfilenode children of the project and returns true if anyone has subtype set to Form /// true if a fsharpfilenode with subtype Form is found @@ -2663,71 +2552,8 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. override x.CreateProjectReferenceNode(selectorData:VSCOMPONENTSELECTORDATA) = (new FSharpProjectReferenceNode(x.ProjectMgr, selectorData.bstrTitle, selectorData.bstrFile, selectorData.bstrProjRef) :> ProjectReferenceNode) -<<<<<<< HEAD - type internal SelectionElementValueChangedListener(serviceProvider:Microsoft.VisualStudio.Shell.ServiceProvider, projMgr:ProjectNode ) = - inherit SelectionListener(serviceProvider) - - override x.OnElementValueChanged(elementid:uint32, varValueOld:obj, _varValueNew:obj) = - let mutable hr = VSConstants.S_OK - if (elementid = VSConstants.DocumentFrame) then - let pWindowFrame = varValueOld :?> IVsWindowFrame - if (pWindowFrame <> null) then - let mutable document : obj = null - // Get the name of the document associated with the old window frame - hr <- pWindowFrame.GetProperty(int32 __VSFPROPID.VSFPROPID_pszMkDocument, &document) - if (ErrorHandler.Succeeded(hr)) then - let mutable itemid = 0u - let hier = (box projMgr :?> IVsHierarchy) - hr <- hier.ParseCanonicalName((document :?> string), &itemid) - match projMgr.NodeFromItemId(itemid) with - | :? FSharpFileNode as node -> - ignore(node) - | _ -> - () - hr - -#if AUTOMATION - - /// Add support for automation on fs files. - [] - [] - type public OAFSharpFileItem(project:OAProject, node:FileNode) = - inherit OAFileItem(project, node) - let mutable codeModel : EnvDTE.FileCodeModel = null - - override this.FileCodeModel : EnvDTE.FileCodeModel = - match codeModel with - | null -> - if this.Node = null then null else - if this.Node.OleServiceProvider = null then null else - let sp = new ServiceProvider(this.Node.OleServiceProvider) - match TryGetService2(sp :> IServiceProvider) with - | None -> null - | Some(smdProvider) -> - let provider = (smdProvider.CodeDomProvider :?> CodeDomProvider) - codeModel <- FSharpCodeModelFactory.CreateFileCodeModel((box this :?> EnvDTE.ProjectItem), provider, this.Node.Url) - codeModel - | _ -> codeModel - - override this.Open(viewKind: string) : EnvDTE.Window = - if (String.Compare(viewKind, EnvDTE.Constants.vsViewKindPrimary) = 0) && - // Get the subtype and decide the viewkind based on the result - ((this.Node :?> FSharpFileNode).IsFormSubType) then - base.Open(EnvDTE.Constants.vsViewKindDesigner) - else - base.Open(viewKind) - - [] - type public OAFSharpProject(fsharpProject:FSharpProjectNode) = - inherit OAProject(fsharpProject) - - override x.CodeModel : EnvDTE.CodeModel = - FSharpCodeModelFactory.CreateProjectCodeModel(x) -#endif -======= - and internal SelectionElementValueChangedListener(serviceProvider:Microsoft.VisualStudio.Shell.ServiceProvider) = + type internal SelectionElementValueChangedListener(serviceProvider:Microsoft.VisualStudio.Shell.ServiceProvider) = inherit SelectionListener(serviceProvider) override x.OnElementValueChanged(_elementid, _varValueOld, _varValueNew) = VSConstants.S_OK ->>>>>>> 580da22232240847a9ee2a076a80c815959b1457 From 1a41b2e2979026c8e3b4a3e1ac33cc77de820c57 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 29 Apr 2016 16:10:29 +0100 Subject: [PATCH 119/334] fix failing test --- src/fsharp/FindUnsolved.fs | 2 +- src/fsharp/IlxGen.fs | 4 ++-- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 4 ++-- src/fsharp/NicePrint.fs | 4 ++-- src/fsharp/Optimizer.fs | 12 ++++++------ src/fsharp/PostInferenceChecks.fs | 5 +++-- src/fsharp/TastOps.fs | 22 +++++++++++----------- src/fsharp/TypeChecker.fs | 8 ++++---- src/fsharp/tast.fs | 4 ++-- 9 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index 9fcd10d7885..f9057a9d078 100644 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -231,7 +231,7 @@ and accModuleOrNamespaceDefs cenv env x = List.iter (accModuleOrNamespaceDef cen and accModuleOrNamespaceDef cenv env x = match x with - | TMDefRec(tycons,mbinds,_m) -> + | TMDefRec(_,tycons,mbinds,_m) -> accTycons cenv env tycons; accModuleOrNamespaceBinds cenv env mbinds | TMDefLet(bind,_m) -> accBind cenv env bind diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 3a710b6a20c..2e5f01feccd 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -967,7 +967,7 @@ let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = and AddBindingsForModuleDef allocVal cloc eenv x = match x with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_isRec,tycons,mbinds,_) -> (* Virtual don't have 'let' bindings and must be added to the environment *) let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv @@ -5650,7 +5650,7 @@ and GenModuleDefs cenv cgbuf qname lazyInitInfo eenv mdefs = and GenModuleDef cenv (cgbuf:CodeGenBuffer) qname lazyInitInfo eenv x = match x with - | TMDefRec(tycons,mbinds,m) -> + | TMDefRec(_isRec,tycons,mbinds,m) -> tycons |> List.iter (fun tc -> if tc.IsExceptionDecl then GenExnDef cenv cgbuf.mgbuf eenv m tc diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index 9e73276f794..0ff4d2aa6dc 100644 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -1286,9 +1286,9 @@ module Pass4_RewriteAssembly = and TransModuleDefs penv z x = List.foldMap (TransModuleDef penv) z x and TransModuleDef penv (z: RewriteState) x = match x with - | TMDefRec(tycons,mbinds,m) -> + | TMDefRec(isRec,tycons,mbinds,m) -> let z,mbinds = TransModuleBindings penv z mbinds - z,TMDefRec(tycons,mbinds,m) + z,TMDefRec(isRec,tycons,mbinds,m) | TMDefLet(bind,m) -> let z,bind = TransValBinding penv z bind z,TMDefLet(bind,m) diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 96682180598..d271fb06611 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -1742,7 +1742,7 @@ module private InferredSigPrinting = let rec isConcreteNamespace x = match x with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> nonNil tycons || (mbinds |> List.exists (function ModuleOrNamespaceBinding.Binding _ -> true | ModuleOrNamespaceBinding.Module(x,_) -> not x.IsNamespace)) | TMDefLet _ -> true | TMDefDo _ -> true @@ -1759,7 +1759,7 @@ module private InferredSigPrinting = let filterVal (v:Val) = not v.IsCompilerGenerated && isNone v.MemberInfo let filterExtMem (v:Val) = v.IsExtensionMember match x with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> TastDefinitionPrinting.layoutTyconDefns denv infoReader ad m tycons @@ (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterExtMem |> TastDefinitionPrinting.layoutExtensionMembers denv) @@ (mbinds |> List.choose (function ModuleOrNamespaceBinding.Binding bind -> Some bind | _ -> None) |> valsOfBinds |> List.filter filterVal |> List.map (PrintTastMemberOrVals.layoutValOrMember denv) |> aboveListL) @@ diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index bc0e34c2fcb..453c6663c27 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3128,11 +3128,11 @@ and OptimizeModuleExpr cenv env x = let rec elimModDef x = match x with - | TMDefRec(tycons,mbinds,m) -> + | TMDefRec(isRec,tycons,mbinds,m) -> let mbinds = mbinds |> List.choose elimModuleBinding - TMDefRec(tycons,mbinds,m) + TMDefRec(isRec,tycons,mbinds,m) | TMDefLet(bind,m) -> - if Zset.contains bind.Var deadSet then TMDefRec([],[],m) else x + if Zset.contains bind.Var deadSet then TMDefRec(false,[],[],m) else x | TMDefDo _ -> x | TMDefs(defs) -> TMDefs(List.map elimModDef defs) | TMAbstract _ -> x @@ -3157,8 +3157,8 @@ and mkValBind (bind:Binding) info = and OptimizeModuleDef cenv (env,bindInfosColl) x = match x with - | TMDefRec(tycons,mbinds,m) -> - let env = BindInternalValsToUnknown cenv (allValsOfModDef x) env + | TMDefRec(isRec,tycons,mbinds,m) -> + let env = if isRec then BindInternalValsToUnknown cenv (allValsOfModDef x) env else env let mbindInfos,(env,bindInfosColl) = OptimizeModuleBindings cenv (env,bindInfosColl) mbinds let mbinds,minfos = List.unzip mbindInfos let binds = minfos |> List.choose (function Choice1Of2 (x,_) -> Some x | _ -> None) @@ -3167,7 +3167,7 @@ and OptimizeModuleDef cenv (env,bindInfosColl) x = (* REVIEW: Eliminate let bindings on the way back up *) - (TMDefRec(tycons,mbinds,m), + (TMDefRec(isRec,tycons,mbinds,m), notlazy { ValInfos= ValInfos(FlatList.map2 (fun bind binfo -> mkValBind bind (mkValInfo binfo bind.Var)) binds binfos); ModuleOrNamespaceInfos = NameMap.ofList minfos}), (env,bindInfosColl) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 2c8a48211a5..5f56cb1295e 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1491,9 +1491,9 @@ and CheckNothingAfterEntryPoint cenv m = and CheckDefnInModule cenv env x = match x with - | TMDefRec(tycons,mspecs,m) -> + | TMDefRec(isRec,tycons,mspecs,m) -> CheckNothingAfterEntryPoint cenv m - BindVals cenv (allValsOfModDef x |> Seq.toList) + if isRec then BindVals cenv (allValsOfModDef x |> Seq.toList) CheckEntityDefns cenv env tycons List.iter (CheckModuleSpec cenv env) mspecs | TMDefLet(bind,m) -> @@ -1510,6 +1510,7 @@ and CheckDefnInModule cenv env x = and CheckModuleSpec cenv env x = match x with | ModuleOrNamespaceBinding.Binding bind -> + BindVals cenv (valsOfBinds [bind]) CheckModuleBinding cenv env bind | ModuleOrNamespaceBinding.Module (mspec, rhs) -> CheckEntityDefn cenv env mspec; diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 8891c2a14ed..d31fd7fa66e 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3379,7 +3379,7 @@ module DebugPrint = begin and mdefsL defs = wordL "Module Defs" @@-- aboveListL(List.map mdefL defs) and mdefL x = match x with - | TMDefRec(tycons ,mbinds,_) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) + | TMDefRec(_,tycons ,mbinds,_) -> aboveListL ((tycons |> List.map tyconL) @ List.map mbindL mbinds) | TMDefLet(bind,_) -> letL bind emptyL | TMDefDo(e,_) -> exprL e | TMDefs defs -> mdefsL defs; @@ -3455,7 +3455,7 @@ let wrapModuleOrNamespaceTypeInNamespace id cpath (mtyp:ModuleOrNamespaceType) = let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = let mspec = NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (notlazy (NewEmptyModuleOrNamespaceType Namespace)) - TMDefRec ([],[ModuleOrNamespaceBinding.Module(mspec, mexpr)],id.idRange) + TMDefRec (false, [], [ModuleOrNamespaceBinding.Module(mspec, mexpr)], id.idRange) // cleanup: make this a property let SigTypeOfImplFile (TImplFile(_,_,mexpr,_,_)) = mexpr.Type @@ -3613,7 +3613,7 @@ let abstractSlotValsOfTycons (tycons:Tycon list) = let rec accEntityRemapFromModuleOrNamespace msigty x acc = match x with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> let acc = (mbinds, acc) ||> List.foldBack (accEntityRemapFromModuleOrNamespaceBind msigty) let acc = (tycons, acc) ||> List.foldBack (accEntityRemap msigty) let acc = (tycons, acc) ||> List.foldBack (fun e acc -> accEntityRemapFromModuleOrNamespaceType e.ModuleOrNamespaceType (getCorrespondingSigTy e.LogicalName msigty) acc) @@ -3635,7 +3635,7 @@ and accEntityRemapFromModuleOrNamespaceBind msigty x acc = let rec accValRemapFromModuleOrNamespace g aenv msigty x acc = match x with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> let acc = (mbinds, acc) ||> List.foldBack (accValRemapFromModuleOrNamespaceBind g aenv msigty) // Abstract (virtual) vslots in the tycons at TMDefRec nodes are binders. They also need to be added to the remapping. let vslotvs = abstractSlotValsOfTycons tycons @@ -4195,7 +4195,7 @@ and freeInExpr opts e = accFreeInExpr opts e emptyFreeVars // Note: these are only an approximation - they are currently used only by the optimizer let rec accFreeInModuleOrNamespace opts x acc = match x with - | TMDefRec(_,mbinds,_) -> List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc + | TMDefRec(_,_,mbinds,_) -> List.foldBack (accFreeInModuleOrNamespaceBind opts) mbinds acc | TMDefLet(bind,_) -> accBindRhs opts bind acc | TMDefDo(e,_) -> accFreeInExpr opts e acc | TMDefs defs -> accFreeInModuleOrNamespaces opts defs acc @@ -4856,7 +4856,7 @@ and allTyconsOfTycon (tycon:Tycon) = and allEntitiesOfModDef mdef = seq { match mdef with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> for tycon in tycons do yield! allTyconsOfTycon tycon for mbind in mbinds do @@ -4875,7 +4875,7 @@ and allEntitiesOfModDef mdef = and allValsOfModDef mdef = seq { match mdef with - | TMDefRec(tycons,mbinds,_) -> + | TMDefRec(_,tycons,mbinds,_) -> yield! abstractSlotValsOfTycons tycons for mbind in mbinds do match mbind with @@ -4911,11 +4911,11 @@ and remapAndRenameModDefs g compgen tmenv x = and remapAndRenameModDef g compgen tmenv mdef = match mdef with - | TMDefRec(tycons,mbinds,m) -> + | TMDefRec(isRec,tycons,mbinds,m) -> // Abstract (virtual) vslots in the tycons at TMDefRec nodes are binders. They also need to be copied and renamed. let tycons = tycons |> List.map (renameTycon tmenv) let mbinds = mbinds |> List.map (remapAndRenameModBind g compgen tmenv) - TMDefRec(tycons,mbinds,m) + TMDefRec(isRec,tycons,mbinds,m) | TMDefLet(bind,m) -> let v = bind.Var let bind = remapAndRenameBind g compgen tmenv bind (renameVal tmenv v) @@ -5691,7 +5691,7 @@ let mkFolders (folders : _ ExprFolder) = and mdefF z x = match x with - | TMDefRec(_,mbinds,_) -> + | TMDefRec(_,_,mbinds,_) -> (* REVIEW: also iterate the abstract slot vspecs hidden in the _vslots field in the tycons *) let z = List.fold mbindF z mbinds z @@ -7392,7 +7392,7 @@ and rewriteModuleOrNamespaceDefs env x = List.map (rewriteModuleOrNamespaceDef e and rewriteModuleOrNamespaceDef env x = match x with - | TMDefRec(tycons,mbinds,m) -> TMDefRec(tycons,rewriteModuleOrNamespaceBindings env mbinds,m) + | TMDefRec(isRec,tycons,mbinds,m) -> TMDefRec(isRec,tycons,rewriteModuleOrNamespaceBindings env mbinds,m) | TMDefLet(bind,m) -> TMDefLet(rewriteBind env bind,m) | TMDefDo(e,m) -> TMDefDo(RewriteExpr env e,m) | TMDefs defs -> TMDefs(rewriteModuleOrNamespaceDefs env defs) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index eed815e2a7e..6c86de226e1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15820,7 +15820,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = | SynModuleDecl.Exception (edef,m) -> let binds,decl,env = TcExceptionDeclarations.TcExnDefn cenv env parent (edef,scopem) - return ((fun e -> TMDefRec([decl], binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env + return ((fun e -> TMDefRec(true,[decl], binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env | SynModuleDecl.Types (typeDefs,m) -> let scopem = unionRanges m scopem @@ -15851,7 +15851,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = let scopem = unionRanges m scopem let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,bind)) let binds,env,_ = TcLetrec WarnOnOverrides cenv env tpenv (binds,m, scopem) - return ((fun e -> TMDefRec([],binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env + return ((fun e -> TMDefRec(true,[],binds |> List.map ModuleOrNamespaceBinding.Binding,m) :: e),[]), env, env else let binds,env,_ = TcLetBindings cenv env containerInfo ModuleOrMemberBinding tpenv (binds,m,scopem) return ((fun e -> binds@e),[]), env, env @@ -15880,7 +15880,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = TcModuleOrNamespace cenv env (id,isRec,true,mdefs,xml,modAttrs,vis,m) let mspec = mspecPriorToOuterOrExplicitSig - let mdef = TMDefRec([],[ModuleOrNamespaceBinding.Module(mspecPriorToOuterOrExplicitSig,mexpr)],m) + let mdef = TMDefRec(false,[],[ModuleOrNamespaceBinding.Module(mspecPriorToOuterOrExplicitSig,mexpr)],m) PublishModuleDefn cenv env mspec let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec @@ -16049,7 +16049,7 @@ and TcMutRecDefsFinish cenv defs m = mspec.Data.entity_modul_contents <- notlazy !mtypeAcc [ ModuleOrNamespaceBinding.Module(mspec,mexpr) ]) - TMDefRec(tycons,binds,m) + TMDefRec(true,tycons,binds,m) and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = eventually { diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 5b5285e92ec..31d9ff3c886 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3964,8 +3964,8 @@ and ModuleOrNamespaceExpr = | TMDefLet of Binding * range /// Indicates the module fragment is an evaluation of expression for side-effects | TMDefDo of Expr * range - /// Indicates the module fragment is a 'rec' definition of types, values and modules - | TMDefRec of Tycon list * ModuleOrNamespaceBinding list * range + /// Indicates the module fragment is a 'rec' or 'non-rec' definition of types and modules + | TMDefRec of isRec:bool * Tycon list * ModuleOrNamespaceBinding list * range /// A named module-or-namespace-fragment definition and [] From fcbef0cd69c4bcca2837f0fdd58addf5a37e4dbf Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Sat, 30 Apr 2016 23:35:15 +0300 Subject: [PATCH 120/334] merege branch 'master' into 'latkin-caller-info-attrs' --- .gitignore | 2 - .nuget/NuGet.Config | 4 +- BuildToolsVersion.txt | 1 + DEVGUIDE.md | 14 +- DotnetCLIVersion.txt | 1 + VisualFSharp.sln | 418 --- build.cmd | 155 +- init-tools.cmd | 69 + init-tools.sh | 88 + packages.config | 3 +- src/FSharpSource.Settings.targets | 22 +- src/FSharpSource.targets | 17 +- src/absil/il.fs | 2 +- src/absil/ilascii.fs | 1 - src/absil/illex.fsl | 4 +- src/fsharp-compiler-build.proj | 5 +- src/fsharp/AccessibilityLogic.fs | 333 +++ src/fsharp/AttributeChecking.fs | 499 ++++ src/fsharp/CompileOps.fs | 33 +- src/fsharp/CompileOptions.fs | 2 +- src/fsharp/ConstraintSolver.fs | 26 +- src/fsharp/ConstraintSolver.fsi | 7 +- src/fsharp/FSharp.Build/FSharp.Build.fsproj | 8 +- src/fsharp/FSharp.Build/Fsc.fs | 16 +- .../FSharp.Build/Microsoft.FSharp.targets | 13 +- src/fsharp/FSharp.Build/project.json | 20 + .../FSharp.Compiler-proto.fsproj | 22 +- .../FSharp.Compiler/FSharp.Compiler.fsproj | 22 +- src/fsharp/FSharp.Core/FSharp.Core.fsproj | 1 + src/fsharp/FSharp.Core/printf.fs | 3 +- .../FSharp.LanguageService.Compiler.fsproj | 18 + src/fsharp/FindUnsolved.fs | 4 +- src/fsharp/InfoReader.fs | 727 +++++ src/fsharp/LowerCallsAndSeqs.fs | 9 +- src/fsharp/MethodCalls.fs | 1212 +++++++++ src/fsharp/MethodOverrides.fs | 712 +++++ src/fsharp/NameResolution.fs | 5 +- src/fsharp/NameResolution.fsi | 6 +- src/fsharp/NicePrint.fs | 19 +- src/fsharp/Optimizer.fs | 13 +- src/fsharp/PostInferenceChecks.fs | 8 +- src/fsharp/PostInferenceChecks.fsi | 3 +- src/fsharp/SignatureConformance.fs | 638 +++++ src/fsharp/TypeChecker.fs | 14 +- src/fsharp/TypeChecker.fsi | 3 +- src/fsharp/TypeRelations.fs | 2384 +---------------- src/fsharp/fsc.fs | 25 +- src/fsharp/fsi/fsi.fs | 34 +- src/fsharp/infos.fs | 1655 +----------- src/fsharp/vs/ServiceDeclarations.fs | 16 +- src/fsharp/vs/ServiceDeclarations.fsi | 1 + src/fsharp/vs/Symbols.fs | 13 +- src/fsharp/vs/Symbols.fsi | 11 +- src/fsharp/vs/service.fs | 24 +- src/update.cmd | 4 - tests/RunTests.cmd | 2 +- tests/fsharp/FSharp.Tests.fsproj | 1 + tests/fsharp/FSharpTestSuiteAsserts.fs | 22 + tests/fsharp/core/.gitignore | 8 + tests/fsharp/core/control/test.fsx | 2 + tests/fsharp/core/fsi-shadowcopy/test1.fsx | 5 +- tests/fsharp/core/fsi-shadowcopy/test2.fsx | 5 +- tests/fsharp/core/tests_core.fs | 15 +- tests/fsharp/project.json | 4 +- tests/fsharp/regression/656/run.bat | 33 - tests/fsharp/regression/tests_regression.fs | 17 - .../typeProviders/tests_typeProviders.fs | 14 +- ...cs.il.bsl => CallIntrinsics.il.netfx4.bsl} | 0 .../CodeGen/EmittedIL/TypeProviders/env.lst | 2 +- tests/fsharpqa/Source/test.lst | 2 +- .../EnableOpenSource/EnableOpenSource.csproj | 4 +- .../FSharp.ProjectSystem.FSharp/Project.fs | 28 +- vsintegration/src/fsharp.common.props | 4 +- vsintegration/tests/Salsa/salsa.fs | 4 +- vsintegration/tests/unittests/Tests.Build.fs | 2 +- .../Tests.ProjectSystem.MultiTargeting.fs | 4 +- 76 files changed, 4772 insertions(+), 4775 deletions(-) create mode 100644 BuildToolsVersion.txt create mode 100644 DotnetCLIVersion.txt create mode 100644 init-tools.cmd create mode 100644 init-tools.sh create mode 100644 src/fsharp/AccessibilityLogic.fs create mode 100644 src/fsharp/AttributeChecking.fs create mode 100644 src/fsharp/FSharp.Build/project.json create mode 100644 src/fsharp/InfoReader.fs create mode 100644 src/fsharp/MethodCalls.fs create mode 100644 src/fsharp/MethodOverrides.fs create mode 100644 src/fsharp/SignatureConformance.fs mode change 100755 => 100644 src/fsharp/TypeRelations.fs create mode 100644 tests/fsharp/FSharpTestSuiteAsserts.fs delete mode 100644 tests/fsharp/regression/656/run.bat rename tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/{CallIntrinsics.il.bsl => CallIntrinsics.il.netfx4.bsl} (100%) diff --git a/.gitignore b/.gitignore index 9ed02a63124..49835c4987b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,8 +29,6 @@ src/fsharp/FSharp.Compiler/*.userprefs src/*.log Debug Release -vsdebug -vsrelease Proto sign_temp .libs diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config index dfd48a090ff..8ef59b9c202 100644 --- a/.nuget/NuGet.Config +++ b/.nuget/NuGet.Config @@ -8,8 +8,8 @@ - - + + diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt new file mode 100644 index 00000000000..cfa9f1b4166 --- /dev/null +++ b/BuildToolsVersion.txt @@ -0,0 +1 @@ +1.0.25-prerelease-00317-01 diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 6a155ce5f11..bfdbefe2b72 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -30,18 +30,28 @@ There are various qualifiers: build.cmd release -- build release (the default) build.cmd debug -- build debug instead of release + build.cmd proto -- force the rebuild of the Proto bootstrap compiler in addition to other things + build.cmd compiler -- build/tests only the compiler (not the Visual F# IDE Tools) build.cmd vs -- build/tests the Visual F# IDE Tools build.cmd pcls -- build/tests the PCL FSharp.Core libraries build.cmd build -- build, do not test - build.cmd smoke -- build, run smoke tests build.cmd ci -- build, run the same tests as CI build.cmd all -- build, run all tests + build.cmd notests -- turn off testing (used in conjunction with other options) + + build.cmd test-smoke -- build, run smoke tests + build.cmd test-coreunit -- build, run FSharp.Core tests + build.cmd test-coreclr -- build, run CoreCLR tests + build.cmd test-pcls -- build, run PCL tests + build.cmd test-fsharp -- build, run tests\fsharp suite + build.cmd test-fsharpqa -- build, run tests\fsharpqa suite + build.cmd test-vs -- build, run Visual F# IDE Tools unit tests Combinations are also allowed: - build.cmd debug,compiler,smoke -- build the debug compiler and run smoke tests + build.cmd debug,compiler,notests -- build the debug compiler and run smoke tests After you build the first time you can open and use this solution: diff --git a/DotnetCLIVersion.txt b/DotnetCLIVersion.txt new file mode 100644 index 00000000000..34a7239cbdd --- /dev/null +++ b/DotnetCLIVersion.txt @@ -0,0 +1 @@ +1.0.0-beta-002173 \ No newline at end of file diff --git a/VisualFSharp.sln b/VisualFSharp.sln index 60aa9be6fbf..0bc7980829a 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -136,10 +136,6 @@ Global Proto|x86 = Proto|x86 Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 - VSDebug|Any CPU = VSDebug|Any CPU - VSDebug|x86 = VSDebug|x86 - VSRelease|Any CPU = VSRelease|Any CPU - VSRelease|x86 = VSRelease|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -154,14 +150,6 @@ Global {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.Build.0 = Release|Any CPU {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.ActiveCfg = Release|Any CPU {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.Build.0 = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.VSRelease|x86.Build.0 = VSRelease|Any CPU {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.Build.0 = Debug|Any CPU {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -174,14 +162,6 @@ Global {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.Build.0 = Release|Any CPU {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.ActiveCfg = Release|Any CPU {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.VSRelease|x86.Build.0 = VSRelease|Any CPU {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -194,14 +174,6 @@ Global {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.Build.0 = Release|Any CPU {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.ActiveCfg = Release|Any CPU {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.VSRelease|x86.Build.0 = VSRelease|Any CPU {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.Build.0 = Debug|Any CPU {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -214,14 +186,6 @@ Global {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.Build.0 = Release|Any CPU {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.ActiveCfg = Release|Any CPU {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.VSRelease|x86.Build.0 = VSRelease|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -234,14 +198,6 @@ Global {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.ActiveCfg = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.Build.0 = Release|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.VSRelease|x86.Build.0 = VSRelease|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|Any CPU.Build.0 = Debug|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -254,14 +210,6 @@ Global {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|Any CPU.Build.0 = Release|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|x86.ActiveCfg = Release|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|x86.Build.0 = Release|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.VSRelease|x86.Build.0 = VSRelease|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -274,14 +222,6 @@ Global {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|Any CPU.Build.0 = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|x86.ActiveCfg = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|x86.Build.0 = Release|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.VSRelease|x86.Build.0 = VSRelease|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|Any CPU.Build.0 = Debug|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -294,14 +234,6 @@ Global {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|Any CPU.Build.0 = Release|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|x86.ActiveCfg = Release|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|x86.Build.0 = Release|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.VSRelease|x86.Build.0 = VSRelease|Any CPU {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Debug|Any CPU.Build.0 = Debug|Any CPU {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -314,14 +246,6 @@ Global {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Release|Any CPU.Build.0 = Release|Any CPU {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Release|x86.ActiveCfg = Release|Any CPU {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.Release|x86.Build.0 = Release|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {A437A6EC-5323-47C2-8F86-E2CAC54FF152}.VSRelease|x86.Build.0 = VSRelease|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -334,14 +258,6 @@ Global {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Release|Any CPU.Build.0 = Release|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Release|x86.ActiveCfg = Release|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.Release|x86.Build.0 = Release|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}.VSRelease|x86.Build.0 = VSRelease|Any CPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -354,14 +270,6 @@ Global {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Release|Any CPU.Build.0 = Release|Any CPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Release|x86.ActiveCfg = Release|Any CPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.Release|x86.Build.0 = Release|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}.VSRelease|x86.Build.0 = VSRelease|Any CPU {65E0E82A-EACE-4787-8994-888674C2FE87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {65E0E82A-EACE-4787-8994-888674C2FE87}.Debug|Any CPU.Build.0 = Debug|Any CPU {65E0E82A-EACE-4787-8994-888674C2FE87}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -374,14 +282,6 @@ Global {65E0E82A-EACE-4787-8994-888674C2FE87}.Release|Any CPU.Build.0 = Release|Any CPU {65E0E82A-EACE-4787-8994-888674C2FE87}.Release|x86.ActiveCfg = Release|Any CPU {65E0E82A-EACE-4787-8994-888674C2FE87}.Release|x86.Build.0 = Release|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {65E0E82A-EACE-4787-8994-888674C2FE87}.VSRelease|x86.Build.0 = VSRelease|Any CPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -394,14 +294,6 @@ Global {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Release|Any CPU.Build.0 = Release|Any CPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Release|x86.ActiveCfg = Release|Any CPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.Release|x86.Build.0 = Release|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}.VSRelease|x86.Build.0 = VSRelease|Any CPU {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Debug|Any CPU.Build.0 = Debug|Any CPU {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -414,14 +306,6 @@ Global {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Release|Any CPU.Build.0 = Release|Any CPU {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Release|x86.ActiveCfg = Release|Any CPU {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.Release|x86.Build.0 = Release|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {FCFB214C-462E-42B3-91CA-FC557EFEE74F}.VSRelease|x86.Build.0 = VSRelease|Any CPU {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Debug|Any CPU.Build.0 = Debug|Any CPU {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -434,14 +318,6 @@ Global {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Release|Any CPU.Build.0 = Release|Any CPU {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Release|x86.ActiveCfg = Release|Any CPU {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.Release|x86.Build.0 = Release|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}.VSRelease|x86.Build.0 = VSRelease|Any CPU {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -454,14 +330,6 @@ Global {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Release|Any CPU.Build.0 = Release|Any CPU {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Release|x86.ActiveCfg = Release|Any CPU {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.Release|x86.Build.0 = Release|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {FBD4B354-DC6E-4032-8EC7-C81D8DFB1AF7}.VSRelease|x86.Build.0 = VSRelease|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -474,14 +342,6 @@ Global {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Release|Any CPU.Build.0 = Release|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Release|x86.ActiveCfg = Release|Any CPU {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.Release|x86.Build.0 = Release|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {EE85AAB7-CDA0-4C4E-BDA0-A64DDDD13E3F}.VSRelease|x86.Build.0 = VSRelease|Any CPU {DA39AD38-4A58-47BF-9215-E49768295169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA39AD38-4A58-47BF-9215-E49768295169}.Debug|Any CPU.Build.0 = Debug|Any CPU {DA39AD38-4A58-47BF-9215-E49768295169}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -494,14 +354,6 @@ Global {DA39AD38-4A58-47BF-9215-E49768295169}.Release|Any CPU.Build.0 = Release|Any CPU {DA39AD38-4A58-47BF-9215-E49768295169}.Release|x86.ActiveCfg = Release|Any CPU {DA39AD38-4A58-47BF-9215-E49768295169}.Release|x86.Build.0 = Release|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {DA39AD38-4A58-47BF-9215-E49768295169}.VSRelease|x86.Build.0 = VSRelease|Any CPU {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -514,14 +366,6 @@ Global {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Release|Any CPU.Build.0 = Release|Any CPU {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Release|x86.ActiveCfg = Release|Any CPU {8C2439BD-0E49-4929-A8B1-29CEE228191E}.Release|x86.Build.0 = Release|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {8C2439BD-0E49-4929-A8B1-29CEE228191E}.VSRelease|x86.Build.0 = VSRelease|Any CPU {F47196DC-186D-4055-BAF2-658282A12F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F47196DC-186D-4055-BAF2-658282A12F33}.Debug|Any CPU.Build.0 = Debug|Any CPU {F47196DC-186D-4055-BAF2-658282A12F33}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -534,14 +378,6 @@ Global {F47196DC-186D-4055-BAF2-658282A12F33}.Release|Any CPU.Build.0 = Release|Any CPU {F47196DC-186D-4055-BAF2-658282A12F33}.Release|x86.ActiveCfg = Release|Any CPU {F47196DC-186D-4055-BAF2-658282A12F33}.Release|x86.Build.0 = Release|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {F47196DC-186D-4055-BAF2-658282A12F33}.VSRelease|x86.Build.0 = VSRelease|Any CPU {D4C88934-5893-467E-A55C-A11ECD6479FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4C88934-5893-467E-A55C-A11ECD6479FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {D4C88934-5893-467E-A55C-A11ECD6479FE}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -554,14 +390,6 @@ Global {D4C88934-5893-467E-A55C-A11ECD6479FE}.Release|Any CPU.Build.0 = Release|Any CPU {D4C88934-5893-467E-A55C-A11ECD6479FE}.Release|x86.ActiveCfg = Release|Any CPU {D4C88934-5893-467E-A55C-A11ECD6479FE}.Release|x86.Build.0 = Release|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {D4C88934-5893-467E-A55C-A11ECD6479FE}.VSRelease|x86.Build.0 = VSRelease|Any CPU {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -574,14 +402,6 @@ Global {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Release|Any CPU.Build.0 = Release|Any CPU {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Release|x86.ActiveCfg = Release|Any CPU {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.Release|x86.Build.0 = Release|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B}.VSRelease|x86.Build.0 = VSRelease|Any CPU {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Debug|Any CPU.Build.0 = Debug|Any CPU {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -594,14 +414,6 @@ Global {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Release|Any CPU.Build.0 = Release|Any CPU {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Release|x86.ActiveCfg = Release|Any CPU {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.Release|x86.Build.0 = Release|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E}.VSRelease|x86.Build.0 = VSRelease|Any CPU {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Debug|Any CPU.Build.0 = Debug|Any CPU {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -614,14 +426,6 @@ Global {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Release|Any CPU.Build.0 = Release|Any CPU {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Release|x86.ActiveCfg = Release|Any CPU {004982C6-93EA-4E70-B4F0-BE7D7219926A}.Release|x86.Build.0 = Release|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {004982C6-93EA-4E70-B4F0-BE7D7219926A}.VSRelease|x86.Build.0 = VSRelease|Any CPU {243A81AC-A954-4601-833A-60EEEFB00FCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {243A81AC-A954-4601-833A-60EEEFB00FCD}.Debug|Any CPU.Build.0 = Debug|Any CPU {243A81AC-A954-4601-833A-60EEEFB00FCD}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -634,14 +438,6 @@ Global {243A81AC-A954-4601-833A-60EEEFB00FCD}.Release|Any CPU.Build.0 = Release|Any CPU {243A81AC-A954-4601-833A-60EEEFB00FCD}.Release|x86.ActiveCfg = Release|Any CPU {243A81AC-A954-4601-833A-60EEEFB00FCD}.Release|x86.Build.0 = Release|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {243A81AC-A954-4601-833A-60EEEFB00FCD}.VSRelease|x86.Build.0 = VSRelease|Any CPU {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -654,14 +450,6 @@ Global {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Release|Any CPU.Build.0 = Release|Any CPU {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Release|x86.ActiveCfg = Release|Any CPU {B4595EB6-053A-400E-AA1B-7727F1BC900F}.Release|x86.Build.0 = Release|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {B4595EB6-053A-400E-AA1B-7727F1BC900F}.VSRelease|x86.Build.0 = VSRelease|Any CPU {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Debug|Any CPU.Build.0 = Debug|Any CPU {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -674,14 +462,6 @@ Global {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Release|Any CPU.Build.0 = Release|Any CPU {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Release|x86.ActiveCfg = Release|Any CPU {A559D7E8-7EFD-473A-B618-A10B41AB523B}.Release|x86.Build.0 = Release|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {A559D7E8-7EFD-473A-B618-A10B41AB523B}.VSRelease|x86.Build.0 = VSRelease|Any CPU {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -694,14 +474,6 @@ Global {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Release|Any CPU.Build.0 = Release|Any CPU {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Release|x86.ActiveCfg = Release|Any CPU {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.Release|x86.Build.0 = Release|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9}.VSRelease|x86.Build.0 = VSRelease|Any CPU {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Debug|Any CPU.Build.0 = Debug|Any CPU {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -714,14 +486,6 @@ Global {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Release|Any CPU.Build.0 = Release|Any CPU {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Release|x86.ActiveCfg = Release|Any CPU {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.Release|x86.Build.0 = Release|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C}.VSRelease|x86.Build.0 = VSRelease|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|Any CPU.Build.0 = Debug|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -734,14 +498,6 @@ Global {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|Any CPU.Build.0 = Release|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|x86.ActiveCfg = Release|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|x86.Build.0 = Release|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.VSRelease|x86.Build.0 = VSRelease|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|Any CPU.Build.0 = Debug|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -754,14 +510,6 @@ Global {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.ActiveCfg = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.Build.0 = Release|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.VSRelease|x86.Build.0 = VSRelease|Any CPU {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -774,14 +522,6 @@ Global {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.Build.0 = Release|Any CPU {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.ActiveCfg = Release|Any CPU {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.Build.0 = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.VSRelease|x86.Build.0 = VSRelease|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.Build.0 = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -794,14 +534,6 @@ Global {649FA588-F02E-457C-9FCF-87E46407481E}.Release|Any CPU.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Release|x86.ActiveCfg = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Release|x86.Build.0 = Release|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.VSRelease|x86.Build.0 = VSRelease|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|Any CPU.ActiveCfg = Debug|x86 {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|Any CPU.Build.0 = Debug|x86 {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|x86.ActiveCfg = Debug|x86 @@ -813,12 +545,6 @@ Global {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|Any CPU.Build.0 = Release|x86 {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|x86.ActiveCfg = Release|x86 {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|x86.Build.0 = Release|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSDebug|Any CPU.ActiveCfg = VSDebug|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSDebug|x86.ActiveCfg = VSDebug|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSDebug|x86.Build.0 = VSDebug|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSRelease|Any CPU.ActiveCfg = VSRelease|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSRelease|x86.ActiveCfg = VSRelease|x86 - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.VSRelease|x86.Build.0 = VSRelease|x86 {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|Any CPU.Build.0 = Debug|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -831,14 +557,6 @@ Global {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|Any CPU.Build.0 = Release|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|x86.ActiveCfg = Release|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|x86.Build.0 = Release|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.VSRelease|x86.Build.0 = VSRelease|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -851,14 +569,6 @@ Global {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|Any CPU.Build.0 = Release|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|x86.ActiveCfg = Release|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|x86.Build.0 = Release|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.VSRelease|x86.Build.0 = VSRelease|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -871,14 +581,6 @@ Global {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|Any CPU.Build.0 = Release|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|x86.ActiveCfg = Release|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|x86.Build.0 = Release|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.VSRelease|x86.Build.0 = VSRelease|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|Any CPU.Build.0 = Debug|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -891,14 +593,6 @@ Global {88E2D422-6852-46E3-A740-83E391DC7973}.Release|Any CPU.Build.0 = Release|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Release|x86.ActiveCfg = Release|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Release|x86.Build.0 = Release|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.VSRelease|x86.Build.0 = VSRelease|Any CPU {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Debug|Any CPU.Build.0 = Debug|Any CPU {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -911,14 +605,6 @@ Global {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Release|Any CPU.Build.0 = Release|Any CPU {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Release|x86.ActiveCfg = Release|Any CPU {604F0DAA-2D33-48DD-B162-EDF0B672803D}.Release|x86.Build.0 = Release|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {604F0DAA-2D33-48DD-B162-EDF0B672803D}.VSRelease|x86.Build.0 = VSRelease|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -931,14 +617,6 @@ Global {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|Any CPU.Build.0 = Release|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|x86.ActiveCfg = Release|Any CPU {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.Release|x86.Build.0 = Release|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7}.VSRelease|x86.Build.0 = VSRelease|Any CPU {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -951,14 +629,6 @@ Global {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|Any CPU.Build.0 = Release|Any CPU {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|x86.ActiveCfg = Release|Any CPU {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.Release|x86.Build.0 = Release|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210}.VSRelease|x86.Build.0 = VSRelease|Any CPU {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|Any CPU.Build.0 = Debug|Any CPU {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -971,14 +641,6 @@ Global {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|Any CPU.Build.0 = Release|Any CPU {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|x86.ActiveCfg = Release|Any CPU {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.Release|x86.Build.0 = Release|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {D9D95330-3626-4199-B7AF-17B8E4AF6D87}.VSRelease|x86.Build.0 = VSRelease|Any CPU {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -991,14 +653,6 @@ Global {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|Any CPU.Build.0 = Release|Any CPU {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|x86.ActiveCfg = Release|Any CPU {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.Release|x86.Build.0 = Release|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5}.VSRelease|x86.Build.0 = VSRelease|Any CPU {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|Any CPU.Build.0 = Debug|Any CPU {DB374A0C-7560-479F-9B21-D37C81F7624F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1011,14 +665,6 @@ Global {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|Any CPU.Build.0 = Release|Any CPU {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|x86.ActiveCfg = Release|Any CPU {DB374A0C-7560-479F-9B21-D37C81F7624F}.Release|x86.Build.0 = Release|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {DB374A0C-7560-479F-9B21-D37C81F7624F}.VSRelease|x86.Build.0 = VSRelease|Any CPU {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Debug|Any CPU.Build.0 = Debug|Any CPU {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1031,14 +677,6 @@ Global {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Release|Any CPU.Build.0 = Release|Any CPU {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Release|x86.ActiveCfg = Release|Any CPU {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.Release|x86.Build.0 = Release|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70}.VSRelease|x86.Build.0 = VSRelease|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1051,14 +689,6 @@ Global {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Release|Any CPU.Build.0 = Release|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Release|x86.ActiveCfg = Release|Any CPU {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.Release|x86.Build.0 = Release|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4}.VSRelease|x86.Build.0 = VSRelease|Any CPU {6BA13AA4-C25F-480F-856B-8E8000299A72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6BA13AA4-C25F-480F-856B-8E8000299A72}.Debug|Any CPU.Build.0 = Debug|Any CPU {6BA13AA4-C25F-480F-856B-8E8000299A72}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1071,14 +701,6 @@ Global {6BA13AA4-C25F-480F-856B-8E8000299A72}.Release|Any CPU.Build.0 = Release|Any CPU {6BA13AA4-C25F-480F-856B-8E8000299A72}.Release|x86.ActiveCfg = Release|Any CPU {6BA13AA4-C25F-480F-856B-8E8000299A72}.Release|x86.Build.0 = Release|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {6BA13AA4-C25F-480F-856B-8E8000299A72}.VSRelease|x86.Build.0 = VSRelease|Any CPU {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Debug|Any CPU.Build.0 = Debug|Any CPU {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1091,14 +713,6 @@ Global {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Release|Any CPU.Build.0 = Release|Any CPU {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Release|x86.ActiveCfg = Release|Any CPU {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.Release|x86.Build.0 = Release|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.Build.0 = VSRelease|Any CPU {A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1111,14 +725,6 @@ Global {A333B85A-DC23-49B6-9797-B89A7951E92D}.Release|Any CPU.Build.0 = Release|Any CPU {A333B85A-DC23-49B6-9797-B89A7951E92D}.Release|x86.ActiveCfg = Release|Any CPU {A333B85A-DC23-49B6-9797-B89A7951E92D}.Release|x86.Build.0 = Release|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {A333B85A-DC23-49B6-9797-B89A7951E92D}.VSRelease|x86.Build.0 = VSRelease|Any CPU {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1131,14 +737,6 @@ Global {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Release|Any CPU.Build.0 = Release|Any CPU {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Release|x86.ActiveCfg = Release|Any CPU {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.Release|x86.Build.0 = Release|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.Build.0 = VSRelease|Any CPU {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.Build.0 = Debug|Any CPU {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1151,14 +749,6 @@ Global {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Release|Any CPU.Build.0 = Release|Any CPU {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Release|x86.ActiveCfg = Release|Any CPU {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Release|x86.Build.0 = Release|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.Build.0 = VSRelease|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1171,14 +761,6 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|Any CPU.Build.0 = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.ActiveCfg = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.Build.0 = Release|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.Build.0 = VSRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build.cmd b/build.cmd index e5deb34ec6b..1bdb8c12acd 100644 --- a/build.cmd +++ b/build.cmd @@ -13,7 +13,7 @@ echo Build and run a subset of test suites echo. echo Usage: echo. -echo build.cmd ^ +echo build.cmd ^ echo. echo No arguments default to 'build' echo. @@ -33,6 +33,8 @@ set BUILD_PORTABLE=0 set BUILD_VS=0 set BUILD_CONFIG=release set BUILD_CONFIG_LOWERCASE=release +set BUILD_DIAG= +set BUILD_LOG=con set TEST_COMPILERUNIT=0 set TEST_NET40_COREUNIT=0 @@ -42,6 +44,7 @@ set TEST_VS=0 set TEST_FSHARP_SUITE=0 set TEST_FSHARPQA_SUITE=0 set TEST_TAGS= +set SKIP_EXPENSIVE_TESTS=1 setlocal enableDelayedExpansion set /a counter=0 @@ -75,18 +78,31 @@ if /i '%ARG%' == 'vs' ( set TEST_VS=1 ) +if /i '%ARG%' == 'diag' ( + set BUILD_DIAG=/v:diag + set BUILD_LOG=fsharp_build_log.log +) + if /i '%ARG%' == 'all' ( set BUILD_PROTO=1 set BUILD_NET40=1 set BUILD_CORECLR=1 set BUILD_PORTABLE=1 set BUILD_VS=1 + set TEST_COMPILERUNIT=1 + set TEST_NET40_COREUNIT=1 set TEST_PORTABLE_COREUNIT=1 set TEST_FSHARP_SUITE=1 set TEST_FSHARPQA_SUITE=1 set TEST_CORECLR=1 set TEST_VS=1 + + set SKIP_EXPENSIVE_TESTS=0 +) + +if /i '%ARG%' == 'proto' ( + set BUILD_PROTO=1 ) REM Same as 'all' but smoke testing only @@ -134,20 +150,7 @@ if /i '%ARG%' == 'ci_part2' ( set TEST_FSHARP_SUITE=1 ) -if /i '%ARG%' == 'smoke' ( - REM Smoke tests are a very small quick subset of tests - - set SKIP_EXPENSIVE_TESTS=1 - set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=0 - set TEST_FSHARP_SUITE=1 - set TEST_FSHARPQA_SUITE=0 - set TEST_TAGS=Smoke -) - if /i '%ARG%' == 'coreclr' ( - REM Smoke tests are a very small quick subset of tests - set BUILD_CORECLR=1 set TEST_CORECLR=1 ) @@ -170,6 +173,52 @@ if /i '%ARG%' == 'notests' ( set TEST_VS=0 set TEST_FSHARP_SUITE=0 set TEST_FSHARPQA_SUITE=0 + set SKIP_EXPENSIVE_TESTS=1 +) + +if /i '%ARG%' == 'test-smoke' ( + REM Smoke tests are a very small quick subset of tests + + set SKIP_EXPENSIVE_TESTS=1 + set TEST_COMPILERUNIT=0 + set TEST_NET40_COREUNIT=0 + set TEST_FSHARP_SUITE=1 + set TEST_FSHARPQA_SUITE=0 + set TEST_TAGS=Smoke +) + +if /i '%ARG%' == 'test-fsharpqa' ( + set BUILD_NET40=1 + set TEST_FSHARPQA_SUITE=1 +) + +if /i '%ARG%' == 'test-compilerunit' ( + set BUILD_NET40=1 + set TEST_COMPILERUNIT=1 +) + +if /i '%ARG%' == 'test-coreunit' ( + set BUILD_NET40=1 + set TEST_NET40_COREUNIT=1 +) + +if /i '%ARG%' == 'test-coreclr' ( + set BUILD_CORECLR=1 + set TEST_CORECLR=1 +) + +if /i '%ARG%' == 'test-pcls' ( + set BUILD_PORTABLE=1 + set TEST_PORTABLE_COREUNIT=1 +) + +if /i '%ARG%' == 'test-vs' ( + set BUILD_VS=1 + set TEST_VS=1 +) + +if /i '%ARG%' == 'test-fsharp' ( + set TEST_FSHARP_SUITE=1 ) goto :EOF @@ -180,6 +229,7 @@ REM after this point, ARG variable should not be used, use only BUILD_* or TEST_ echo Build/Tests configuration: echo. +echo BUILD_PROTO=%BUILD_PROTO% echo BUILD_NET40=%BUILD_NET40% echo BUILD_CORECLR=%BUILD_CORECLR% echo BUILD_PORTABLE=%BUILD_PORTABLE% @@ -188,16 +238,15 @@ echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_CONFIG_LOWERCASE=%BUILD_CONFIG_LOWERCASE% echo. echo TEST_COMPILERUNIT=%TEST_COMPILERUNIT% +echo TEST_NET40_COREUNIT=%TEST_NET40_COREUNIT% echo TEST_PORTABLE_COREUNIT=%TEST_PORTABLE_COREUNIT% echo TEST_VS=%TEST_VS% echo TEST_FSHARP_SUITE=%TEST_FSHARP_SUITE% echo TEST_FSHARPQA_SUITE=%TEST_FSHARPQA_SUITE% echo TEST_TAGS=%TEST_TAGS% +echo SKIP_EXPENSIVE_TESTS=%SKIP_EXPENSIVE_TESTS% echo. -REM Remove lingering copies of the OSS FSharp.Core from the GAC -gacutil /u "FSharp.Core, Version=4.4.1.9055, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - if "%RestorePackages%"=="" ( set RestorePackages=true ) @@ -220,16 +269,21 @@ if '%VisualStudioVersion%' == '' echo Error: Could not find an installation of V if exist "%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" set _msbuildexe="%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" if exist "%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" set _msbuildexe="%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" if not exist %_msbuildexe% echo Error: Could not find MSBuild.exe. && goto :failure +set _nrswitch=/nr:false +rem uncomment to use coreclr msbuild not ready yet!!!! +rem set _msbuildexe=%~dp0Tools\CoreRun.exe %~dp0Tools\MSBuild.exe +rem set _nrswitch= + :: See if defined APPVEYOR ( - rem See - if exist "C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ( + rem See + if exist "C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ( rem HACK HACK HACK - set _msbuildexe=%_msbuildexe% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - ) + set _msbuildexe=%_msbuildexe% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + ) ) -set msbuildflags=/maxcpucount +set msbuildflags=/maxcpucount %_nrswitch% set _ngenexe="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\ngen.exe" if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure @@ -240,37 +294,37 @@ if '%RestorePackages%' == 'true' ( @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure ) +:: Restore the Tools directory +call %~dp0init-tools.cmd -rem Always do this it installs the dotnet cli and publishes the LKG -rem =============================================================== +set _dotnetexe=%~dp0Tools\dotnetcli\dotnet.exe +pushd .\lkg & %_dotnetexe% restore &popd +@if ERRORLEVEL 1 echo Error: dotnet restore failed && goto :failure -set DOTNET_HOME=.\packages\dotnet -set _dotnetexe=.\packages\dotnet\dotnet.exe -rem check to see if the dotnet cli tool exists -if not exist %_dotnetexe% ( - echo Could not find %_dotnetexe%. Do zipfile install - if not exist packages ( md packages ) - if exist packages\dotnet ( rd packages\dotnet /s /q ) - powershell.exe -executionpolicy unrestricted -command .\scripts\install-dotnetcli.ps1 https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-dev-win-x64.latest.zip packages - @if ERRORLEVEL 1 echo Error: fetch dotnetcli failed && goto :failure +pushd .\lkg & %_dotnetexe% publish project.json &popd +@if ERRORLEVEL 1 echo Error: dotnet publish failed && goto :failure - pushd .\lkg & ..\%_dotnetexe% restore &popd - @if ERRORLEVEL 1 echo Error: dotnet restore failed && goto :failure - pushd .\lkg & ..\%_dotnetexe% publish project.json &popd - @if ERRORLEVEL 1 echo Error: dotnet publish failed && goto :failure - - rem rename fsc and coreconsole to allow fsc.exe to to start compiler - pushd .\lkg\bin\debug\dnxcore50\win7-x64\publish - ren fsc.exe fsc.dll +rem rename fsc and coreconsole to allow fsc.exe to to start compiler +pushd .\lkg\bin\debug\dnxcore50\win7-x64\publish +fc fsc.exe corehost.exe >nul +@if ERRORLEVEL 1 ( + copy fsc.exe fsc.dll copy corehost.exe fsc.exe - popd +) +popd - rem rename fsi and coreconsole to allow fsi.exe to to start interative - pushd .\lkg\bin\debug\dnxcore50\win7-x64\publish - ren fsi.exe fsi.dll +rem rename fsc and coreconsole to allow fsc.exe to to start compiler +pushd .\lkg\bin\debug\dnxcore50\win7-x64\publish +fc fsi.exe corehost.exe >nul +@if ERRORLEVEL 1 ( + copy fsi.exe fsi.dll copy corehost.exe fsi.exe - popd ) +popd + +rem copy targestfile into tools directory ... temporary fix until packaging complete. +copy src\fsharp\FSharp.Build\Microsoft.FSharp.targets tools\Microsoft.FSharp.targets +copy src\fsharp\FSharp.Build\Microsoft.Portable.FSharp.targets tools\Microsoft.Portable.FSharp.targets :: Build Proto if NOT EXIST Proto\net40\bin\fsc-proto.exe (set BUILD_PROTO=1) @@ -284,7 +338,7 @@ if '%BUILD_PROTO%' == '1' ( @if ERRORLEVEL 1 echo Error: NGen of proto failed && goto :failure ) -%_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% +%_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% %BUILD_DIAG% >%BUILD_LOG% @if ERRORLEVEL 1 echo Error: '%_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG%' failed && goto :failure @echo on @@ -292,6 +346,8 @@ call src\update.cmd %BUILD_CONFIG_LOWERCASE% -ngen pushd tests +if 'TEST_COMPILERUNIT' == '0' and 'TEST_PORTABLE_COREUNIT' == '0' and 'TEST_CORECLR' == '0' and 'TEST_VS' == '0' and 'TEST_FSHARP_SUITE' == '0' and 'TEST_FSHARPQA_SUITE' == '0' goto :finished + @echo on call BuildTestTools.cmd %BUILD_CONFIG_LOWERCASE% @if ERRORLEVEL 1 echo Error: 'BuildTestTools.cmd %BUILD_CONFIG_LOWERCASE%' failed && goto :failed_tests @@ -299,10 +355,6 @@ call BuildTestTools.cmd %BUILD_CONFIG_LOWERCASE% @echo on if '%TEST_FSHARP_SUITE%' == '1' ( set FSHARP_TEST_SUITE_USE_NUNIT_RUNNER=true - - %_msbuildexe% %msbuildflags% fsharp\fsharp.tests.fsproj /p:Configuration=%BUILD_CONFIG% - @if ERRORLEVEL 1 echo Error: fsharp cambridge tests for nunit failed && goto :failed_tests - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharp %TEST_TAGS% @if ERRORLEVEL 1 ( type testresults\FSharpNunit_Error.log @@ -364,6 +416,7 @@ if '%TEST_VS%' == '1' ( @if ERRORLEVEL 1 echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWER% ideunit %TEST_TAGS%' failed && goto :failed_tests ) +:finished @echo "Finished" popd goto :eof diff --git a/init-tools.cmd b/init-tools.cmd new file mode 100644 index 00000000000..d48ff4d1248 --- /dev/null +++ b/init-tools.cmd @@ -0,0 +1,69 @@ +@if "%_echo%" neq "on" echo off +setlocal + +set INIT_TOOLS_LOG=%~dp0init-tools.log +if [%PACKAGES_DIR%]==[] set PACKAGES_DIR=%~dp0packages\ +if [%TOOLRUNTIME_DIR%]==[] set TOOLRUNTIME_DIR=%~dp0Tools +set DOTNET_PATH=%TOOLRUNTIME_DIR%\dotnetcli\ +if [%DOTNET_CMD%]==[] set DOTNET_CMD=%DOTNET_PATH%dotnet.exe +if [%BUILDTOOLS_SOURCE%]==[] set BUILDTOOLS_SOURCE=https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json +set /P BUILDTOOLS_VERSION=< %~dp0BuildToolsVersion.txt +set BUILD_TOOLS_PATH=%PACKAGES_DIR%Microsoft.DotNet.BuildTools\%BUILDTOOLS_VERSION%\lib\ +set PROJECT_JSON_PATH=%TOOLRUNTIME_DIR%\%BUILDTOOLS_VERSION% +set PROJECT_JSON_FILE=%PROJECT_JSON_PATH%\project.json +set PROJECT_JSON_CONTENTS={ "dependencies": { "Microsoft.DotNet.BuildTools": "%BUILDTOOLS_VERSION%" }, "frameworks": { "dnxcore50": { } } } +set BUILD_TOOLS_SEMAPHORE=%PROJECT_JSON_PATH%\init-tools.completed + +:: if force option is specified then clean the tool runtime and build tools package directory to force it to get recreated +if [%1]==[force] ( + if exist "%TOOLRUNTIME_DIR%" rmdir /S /Q "%TOOLRUNTIME_DIR%" + if exist "%PACKAGES_DIR%Microsoft.DotNet.BuildTools" rmdir /S /Q "%PACKAGES_DIR%Microsoft.DotNet.BuildTools" +) + +:: If sempahore exists do nothing +if exist "%BUILD_TOOLS_SEMAPHORE%" ( + echo Tools are already initialized. + goto :EOF +) + +if exist "%TOOLRUNTIME_DIR%" rmdir /S /Q "%TOOLRUNTIME_DIR%" + +if NOT exist "%PROJECT_JSON_PATH%" mkdir "%PROJECT_JSON_PATH%" +echo %PROJECT_JSON_CONTENTS% > %PROJECT_JSON_FILE% +echo Running %0 > %INIT_TOOLS_LOG% + +if exist "%DOTNET_CMD%" goto :afterdotnetrestore + +echo Installing dotnet cli... +if NOT exist "%DOTNET_PATH%" mkdir "%DOTNET_PATH%" +set /p DOTNET_VERSION=< %~dp0DotnetCLIVersion.txt +set DOTNET_ZIP_NAME=dotnet-dev-win-x64.%DOTNET_VERSION%.zip +set DOTNET_REMOTE_PATH=https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/%DOTNET_VERSION%/%DOTNET_ZIP_NAME% +set DOTNET_LOCAL_PATH=%DOTNET_PATH%%DOTNET_ZIP_NAME% +echo Installing '%DOTNET_REMOTE_PATH%' to '%DOTNET_LOCAL_PATH%' >> %INIT_TOOLS_LOG% +powershell -NoProfile -ExecutionPolicy unrestricted -Command "(New-Object Net.WebClient).DownloadFile('%DOTNET_REMOTE_PATH%', '%DOTNET_LOCAL_PATH%'); Add-Type -Assembly 'System.IO.Compression.FileSystem' -ErrorVariable AddTypeErrors; if ($AddTypeErrors.Count -eq 0) { [System.IO.Compression.ZipFile]::ExtractToDirectory('%DOTNET_LOCAL_PATH%', '%DOTNET_PATH%') } else { (New-Object -com shell.application).namespace('%DOTNET_PATH%').CopyHere((new-object -com shell.application).namespace('%DOTNET_LOCAL_PATH%').Items(),16) }" >> %INIT_TOOLS_LOG% +if NOT exist "%DOTNET_LOCAL_PATH%" ( + echo ERROR: Could not install dotnet cli correctly. See '%INIT_TOOLS_LOG%' for more details. + goto :EOF +) + +:afterdotnetrestore + +if exist "%BUILD_TOOLS_PATH%" goto :afterbuildtoolsrestore +echo Restoring BuildTools version %BUILDTOOLS_VERSION%... +echo Running: "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> %INIT_TOOLS_LOG% +call "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> %INIT_TOOLS_LOG% +if NOT exist "%BUILD_TOOLS_PATH%init-tools.cmd" ( + echo ERROR: Could not restore build tools correctly. See '%INIT_TOOLS_LOG%' for more details. + goto :EOF +) + +:afterbuildtoolsrestore + +echo Initializing BuildTools ... +echo Running: "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> %INIT_TOOLS_LOG% +call "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> %INIT_TOOLS_LOG% + +:: Create sempahore file +echo Done initializing tools. +echo Init-Tools.cmd completed for BuildTools Version: %BUILDTOOLS_VERSION% > "%BUILD_TOOLS_SEMAPHORE%" \ No newline at end of file diff --git a/init-tools.sh b/init-tools.sh new file mode 100644 index 00000000000..033a652cde5 --- /dev/null +++ b/init-tools.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +__scriptpath=$(cd "$(dirname "$0")"; pwd -P) +__init_tools_log=$__scriptpath/init-tools.log +__PACKAGES_DIR=$__scriptpath/packages +__TOOLRUNTIME_DIR=$__scriptpath/Tools +__DOTNET_PATH=$__TOOLRUNTIME_DIR/dotnetcli +__DOTNET_CMD=$__DOTNET_PATH/dotnet +if [ -z "$__BUILDTOOLS_SOURCE" ]; then __BUILDTOOLS_SOURCE=https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json; fi +__BUILD_TOOLS_PACKAGE_VERSION=$(cat $__scriptpath/BuildToolsVersion.txt) +__DOTNET_TOOLS_VERSION=$(cat $__scriptpath/DotnetCLIVersion.txt) +__BUILD_TOOLS_PATH=$__PACKAGES_DIR/Microsoft.DotNet.BuildTools/$__BUILD_TOOLS_PACKAGE_VERSION/lib +__PROJECT_JSON_PATH=$__TOOLRUNTIME_DIR/$__BUILD_TOOLS_PACKAGE_VERSION +__PROJECT_JSON_FILE=$__PROJECT_JSON_PATH/project.json +__PROJECT_JSON_CONTENTS="{ \"dependencies\": { \"Microsoft.DotNet.BuildTools\": \"$__BUILD_TOOLS_PACKAGE_VERSION\" }, \"frameworks\": { \"dnxcore50\": { } } }" + +OSName=$(uname -s) +case $OSName in + Darwin) + OS=OSX + __DOTNET_PKG=dotnet-dev-osx-x64 + ulimit -n 2048 + ;; + + Linux) + OS=Linux + source /etc/os-release + if [ "$ID" == "centos" -o "$ID" == "rhel" ]; then + __DOTNET_PKG=dotnet-dev-centos-x64 + elif [ "$ID" == "ubuntu" -o "$ID" == "debian" ]; then + __DOTNET_PKG=dotnet-dev-ubuntu-x64 + else + echo "Unsupported Linux distribution '$ID' detected. Downloading ubuntu-x64 tools." + __DOTNET_PKG=dotnet-dev-ubuntu-x64 + fi + ;; + + *) + echo "Unsupported OS '$OSName' detected. Downloading ubuntu-x64 tools." + OS=Linux + __DOTNET_PKG=dotnet-dev-ubuntu-x64 + ;; +esac + +if [ ! -e $__PROJECT_JSON_FILE ]; then + if [ -e $__TOOLRUNTIME_DIR ]; then rm -rf -- $__TOOLRUNTIME_DIR; fi + echo "Running: $__scriptpath/init-tools.sh" > $__init_tools_log + if [ ! -e $__DOTNET_PATH ]; then + echo "Installing dotnet cli..." + __DOTNET_LOCATION="https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz" + # curl has HTTPS CA trust-issues less often than wget, so lets try that first. + echo "Installing '${__DOTNET_LOCATION}' to '$__DOTNET_PATH/dotnet.tar'" >> $__init_tools_log + which curl > /dev/null 2> /dev/null + if [ $? -ne 0 ]; then + mkdir -p "$__DOTNET_PATH" + wget -q -O $__DOTNET_PATH/dotnet.tar ${__DOTNET_LOCATION} + else + curl -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar ${__DOTNET_LOCATION} + fi + cd $__DOTNET_PATH + tar -xf $__DOTNET_PATH/dotnet.tar + if [ -n "$BUILDTOOLS_OVERRIDE_RUNTIME" ]; then + find $__DOTNET_PATH -name *.ni.* | xargs rm 2>/dev/null + cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin + cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin/dnx + cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/runtime/coreclr + fi + + cd $__scriptpath + fi + + if [ ! -d "$__PROJECT_JSON_PATH" ]; then mkdir "$__PROJECT_JSON_PATH"; fi + echo $__PROJECT_JSON_CONTENTS > "$__PROJECT_JSON_FILE" + + if [ ! -e $__BUILD_TOOLS_PATH ]; then + echo "Restoring BuildTools version $__BUILD_TOOLS_PACKAGE_VERSION..." + echo "Running: $__DOTNET_CMD restore \"$__PROJECT_JSON_FILE\" --packages $__PACKAGES_DIR --source $__BUILDTOOLS_SOURCE" >> $__init_tools_log + $__DOTNET_CMD restore "$__PROJECT_JSON_FILE" --packages $__PACKAGES_DIR --source $__BUILDTOOLS_SOURCE >> $__init_tools_log + if [ ! -e "$__BUILD_TOOLS_PATH/init-tools.sh" ]; then echo "ERROR: Could not restore build tools correctly. See '$__init_tools_log' for more details."; fi + fi + + echo "Initializing BuildTools..." + echo "Running: $__BUILD_TOOLS_PATH/init-tools.sh $__scriptpath $__DOTNET_CMD $__TOOLRUNTIME_DIR" >> $__init_tools_log + $__BUILD_TOOLS_PATH/init-tools.sh $__scriptpath $__DOTNET_CMD $__TOOLRUNTIME_DIR >> $__init_tools_log + echo "Done initializing tools." +else + echo "Tools are already initialized" +fi diff --git a/packages.config b/packages.config index 14439234ef2..176d60691ff 100644 --- a/packages.config +++ b/packages.config @@ -1,17 +1,16 @@ - + - diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index ccc53d04c91..1bc0b2a965c 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -12,7 +12,10 @@ FSharp true true + $(MSBuildThisFileDirectory)..\Tools\ + $(ToolsDir)net45\ + false @@ -41,25 +44,6 @@ false - - full - prompt - AnyCPU - $(OtherFlags) --no-jit-optimize --jit-tracking - DEBUG;TRACE;CODE_ANALYSIS;$(DefineConstants) - DEBUG=True,TRACE=True,CODE_ANALYSIS=True,$(DefineConstants) - true - - - - pdbonly - true - TRACE;$(DefineConstants) - TRACE=True,$(DefineConstants) - prompt - true - - true diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 3aa7acbb6b1..800286a3b47 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -11,7 +11,7 @@ 3.259.41.0 - + false true @@ -159,7 +159,6 @@ - v4.5 $(DefineConstants);FSHARP_CORE_4_5 $(DefineConstants);FX_ATLEAST_45 $(DefineConstants);FX_ATLEAST_40 @@ -174,12 +173,12 @@ $(DefineConstants);FX_RESX_RESOURCE_READER $(DefineConstants);FX_RESIDENT_COMPILER $(DefineConstants);SHADOW_COPY_REFERENCES + v4.5 - v4.5 $(DefineConstants);FSHARP_CORE_4_5 $(DefineConstants);FX_NO_BEGINEND_READWRITE $(DefineConstants);FX_ATLEAST_45 @@ -191,7 +190,7 @@ $(DefineConstants);FX_ATLEAST_LINQ $(DefineConstants);FX_RESHAPED_GLOBALIZATION $(DefineConstants);FX_RESHAPED_REFLECTION - $(DefineConstants);FX_RESHAPED_REFLECTION_CORECLR + $(DefineConstants);FX_RESHAPED_REFLECTION_CORECLR $(DefineConstants);RESHAPED_MSBUILD $(DefineConstants);FX_NO_CONVERTER $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH @@ -230,8 +229,11 @@ $(DefineConstants);NO_LOADER_OPTIMIZATION $(DefineConstants);SILVERLIGHT_COMPILER_FSHARP_CORE $(DefineConstants);I_DONT_KNOW_HOW_TO_DO_THIS_YET - profile7 + $(OtherFlags) --simpleresolution + + v5.0 false + true @@ -796,9 +798,6 @@ $(FSharpSourcesRoot)\..\packages - - $(MSBuildThisFileDirectory)..\packages\Microsoft.DotNet.BuildTools.1.0.25-prerelease-00140\lib\ - $(NuGetPackagesPath)\ @@ -819,7 +818,7 @@ so we ignore the pre-calculation in the lock file and calculate asset applicability in the build task --> true - + diff --git a/src/absil/il.fs b/src/absil/il.fs index b731eaed7c3..cf71760fe39 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -10,9 +10,9 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.IL open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open System.Collections open System.Collections.Generic open System.Collections.Concurrent diff --git a/src/absil/ilascii.fs b/src/absil/ilascii.fs index 695b0340f79..42f63f21ee0 100644 --- a/src/absil/ilascii.fs +++ b/src/absil/ilascii.fs @@ -8,7 +8,6 @@ open Internal.Utilities.Collections open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types open Microsoft.FSharp.Compiler.AbstractIL.IL diff --git a/src/absil/illex.fsl b/src/absil/illex.fsl index ed6494092f2..478126cac29 100644 --- a/src/absil/illex.fsl +++ b/src/absil/illex.fsl @@ -12,15 +12,13 @@ open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.Internal.AsciiParser open Microsoft.FSharp.Compiler.AbstractIL.Internal.AsciiConstants let lexeme (lexbuf : LexBuffer) = new System.String(lexbuf.Lexeme) -let unexpectedChar lexbuf = - dprintf "Unexpected character '%s'" (lexeme lexbuf); +let unexpectedChar _lexbuf = raise Parsing.RecoverableParseError ;; // -------------------------------------------------------------------- diff --git a/src/fsharp-compiler-build.proj b/src/fsharp-compiler-build.proj index 478927e20ea..4c338446f7c 100644 --- a/src/fsharp-compiler-build.proj +++ b/src/fsharp-compiler-build.proj @@ -8,8 +8,9 @@ - - + + + diff --git a/src/fsharp/AccessibilityLogic.fs b/src/fsharp/AccessibilityLogic.fs new file mode 100644 index 00000000000..38354e674e2 --- /dev/null +++ b/src/fsharp/AccessibilityLogic.fs @@ -0,0 +1,333 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// The basic logic of private/internal/protected/InternalsVisibleTo/public accessibility +module internal Microsoft.FSharp.Compiler.AccessibilityLogic + +open Internal.Utilities +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.TcGlobals + +#if EXTENSIONTYPING +open Microsoft.FSharp.Compiler.ExtensionTyping +#endif + +/// Represents the 'keys' a particular piece of code can use to access other constructs?. +[] +type AccessorDomain = + /// AccessibleFrom(cpaths, tyconRefOpt) + /// + /// cpaths: indicates we have the keys to access any members private to the given paths + /// tyconRefOpt: indicates we have the keys to access any protected members of the super types of 'TyconRef' + | AccessibleFrom of CompilationPath list * TyconRef option + + /// An AccessorDomain which returns public items + | AccessibleFromEverywhere + + /// An AccessorDomain which returns everything but .NET private/internal items. + /// This is used + /// - when solving member trait constraints, which are solved independently of accessibility + /// - for failure paths in error reporting, e.g. to produce an error that an F# item is not accessible + /// - an adhoc use in service.fs to look up a delegate signature + | AccessibleFromSomeFSharpCode + + /// An AccessorDomain which returns all items + | AccessibleFromSomewhere + + // Hashing and comparison is used for the memoization tables keyed by an accessor domain. + // It is dependent on a TcGlobals because of the TyconRef in the data structure + static member CustomGetHashCode(ad:AccessorDomain) = + match ad with + | AccessibleFrom _ -> 1 + | AccessibleFromEverywhere -> 2 + | AccessibleFromSomeFSharpCode -> 3 + | AccessibleFromSomewhere -> 4 + static member CustomEquals(g:TcGlobals, ad1:AccessorDomain, ad2:AccessorDomain) = + match ad1, ad2 with + | AccessibleFrom(cs1,tc1), AccessibleFrom(cs2,tc2) -> (cs1 = cs2) && (match tc1,tc2 with None,None -> true | Some tc1, Some tc2 -> tyconRefEq g tc1 tc2 | _ -> false) + | AccessibleFromEverywhere, AccessibleFromEverywhere -> true + | AccessibleFromSomeFSharpCode, AccessibleFromSomeFSharpCode -> true + | AccessibleFromSomewhere, AccessibleFromSomewhere -> true + | _ -> false + +/// Indicates if an F# item is accessible +let IsAccessible ad taccess = + match ad with + | AccessibleFromEverywhere -> canAccessFromEverywhere taccess + | AccessibleFromSomeFSharpCode -> canAccessFromSomewhere taccess + | AccessibleFromSomewhere -> true + | AccessibleFrom (cpaths,_tcrefViewedFromOption) -> + List.exists (canAccessFrom taccess) cpaths + +/// Indicates if an IL member is accessible (ignoring its enclosing type) +let private IsILMemberAccessible g amap m (tcrefOfViewedItem : TyconRef) ad access = + match ad with + | AccessibleFromEverywhere -> + access = ILMemberAccess.Public + | AccessibleFromSomeFSharpCode -> + (access = ILMemberAccess.Public || + access = ILMemberAccess.Family || + access = ILMemberAccess.FamilyOrAssembly) + | AccessibleFrom (cpaths,tcrefViewedFromOption) -> + let accessibleByFamily = + ((access = ILMemberAccess.Family || + access = ILMemberAccess.FamilyOrAssembly) && + match tcrefViewedFromOption with + | None -> false + | Some tcrefViewedFrom -> + ExistsHeadTypeInEntireHierarchy g amap m (generalizedTyconRef tcrefViewedFrom) tcrefOfViewedItem) + let accessibleByInternalsVisibleTo = + (access = ILMemberAccess.Assembly && canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath) + (access = ILMemberAccess.Public) || accessibleByFamily || accessibleByInternalsVisibleTo + | AccessibleFromSomewhere -> + true + +/// Indicates if tdef is accessible. If tdef.Access = ILTypeDefAccess.Nested then encTyconRefOpt s TyconRef of enclosing type +/// and visibility of tdef is obtained using member access rules +let private IsILTypeDefAccessible (amap : Import.ImportMap) m ad encTyconRefOpt (tdef: ILTypeDef) = + match tdef.Access with + | ILTypeDefAccess.Nested nestedAccess -> + match encTyconRefOpt with + | None -> assert false; true + | Some encTyconRef -> IsILMemberAccessible amap.g amap m encTyconRef ad nestedAccess + | _ -> + match ad with + | AccessibleFromSomewhere -> true + | AccessibleFromEverywhere + | AccessibleFromSomeFSharpCode + | AccessibleFrom _ -> tdef.Access = ILTypeDefAccess.Public + +/// Indicates if a TyconRef is visible through the AccessibleFrom(cpaths,_). +/// Note that InternalsVisibleTo extends those cpaths. +let private IsTyconAccessibleViaVisibleTo ad (tcrefOfViewedItem:TyconRef) = + match ad with + | AccessibleFromEverywhere + | AccessibleFromSomewhere + | AccessibleFromSomeFSharpCode -> false + | AccessibleFrom (cpaths,_tcrefViewedFromOption) -> + canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath + +/// Indicates if given IL based TyconRef is accessible. If TyconRef is nested then we'll +/// walk though the list of enclosing types and test if all of them are accessible +let private IsILTypeInfoAccessible amap m ad (tcrefOfViewedItem : TyconRef) = + let scoref, enc, tdef = tcrefOfViewedItem.ILTyconInfo + let rec check parentTycon path = + let ilTypeDefAccessible = + match parentTycon with + | None -> + match path with + | [] -> assert false; true // in this case path should have at least one element + | [x] -> IsILTypeDefAccessible amap m ad None x // shortcut for non-nested types + | x::xs -> + // check if enclosing type x is accessible. + // if yes - create parent tycon for type 'x' and continue with the rest of the path + IsILTypeDefAccessible amap m ad None x && + ( + let parentILTyRef = mkRefForNestedILTypeDef scoref ([], x) + let parentTycon = Import.ImportILTypeRef amap m parentILTyRef + check (Some (parentTycon, [x])) xs + ) + | (Some (parentTycon, parentPath)) -> + match path with + | [] -> true // end of path is reached - success + | x::xs -> + // check if x is accessible from the parent tycon + // if yes - create parent tycon for type 'x' and continue with the rest of the path + IsILTypeDefAccessible amap m ad (Some parentTycon) x && + ( + let parentILTyRef = mkRefForNestedILTypeDef scoref (parentPath, x) + let parentTycon = Import.ImportILTypeRef amap m parentILTyRef + check (Some (parentTycon, parentPath @ [x])) xs + ) + ilTypeDefAccessible || IsTyconAccessibleViaVisibleTo ad tcrefOfViewedItem + + check None (enc @ [tdef]) + +/// Indicates if an IL member associated with the given ILType is accessible +let private IsILTypeAndMemberAccessible g amap m adType ad (ILTypeInfo(tcrefOfViewedItem, _, _, _)) access = + IsILTypeInfoAccessible amap m adType tcrefOfViewedItem && IsILMemberAccessible g amap m tcrefOfViewedItem ad access + +/// Indicates if an entity is accessible +let IsEntityAccessible amap m ad (tcref:TyconRef) = + if tcref.IsILTycon then + IsILTypeInfoAccessible amap m ad tcref + else + tcref.Accessibility |> IsAccessible ad + +/// Check that an entity is accessible +let CheckTyconAccessible amap m ad tcref = + let res = IsEntityAccessible amap m ad tcref + if not res then + errorR(Error(FSComp.SR.typeIsNotAccessible tcref.DisplayName,m)) + res + +/// Indicates if a type definition and its representation contents are accessible +let IsTyconReprAccessible amap m ad tcref = + IsEntityAccessible amap m ad tcref && + IsAccessible ad tcref.TypeReprAccessibility + +/// Check that a type definition and its representation contents are accessible +let CheckTyconReprAccessible amap m ad tcref = + CheckTyconAccessible amap m ad tcref && + (let res = IsAccessible ad tcref.TypeReprAccessibility + if not res then + errorR (Error (FSComp.SR.unionCasesAreNotAccessible tcref.DisplayName,m)) + res) + +/// Indicates if a type is accessible (both definition and instantiation) +let rec IsTypeAccessible g amap m ad ty = + not (isAppTy g ty) || + let tcref,tinst = destAppTy g ty + IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst + +and IsTypeInstAccessible g amap m ad tinst = + match tinst with + | [] -> true + | _ -> List.forall (IsTypeAccessible g amap m ad) tinst + +/// Indicate if a provided member is accessible +let IsProvidedMemberAccessible (amap:Import.ImportMap) m ad ty access = + let g = amap.g + let isTyAccessible = IsTypeAccessible g amap m ad ty + if not isTyAccessible then false + else + not (isAppTy g ty) || + let tcrefOfViewedItem,_ = destAppTy g ty + IsILMemberAccessible g amap m tcrefOfViewedItem ad access + +/// Compute the accessibility of a provided member +let ComputeILAccess isPublic isFamily isFamilyOrAssembly isFamilyAndAssembly = + if isPublic then ILMemberAccess.Public + elif isFamily then ILMemberAccess.Family + elif isFamilyOrAssembly then ILMemberAccess.FamilyOrAssembly + elif isFamilyAndAssembly then ILMemberAccess.FamilyAndAssembly + else ILMemberAccess.Private + +/// IndiCompute the accessibility of a provided member +let IsILFieldInfoAccessible g amap m ad x = + match x with + | ILFieldInfo (tinfo,fd) -> IsILTypeAndMemberAccessible g amap m ad ad tinfo fd.Access +#if EXTENSIONTYPING + | ProvidedField (amap, tpfi, m) as pfi -> + let access = tpfi.PUntaint((fun fi -> ComputeILAccess fi.IsPublic fi.IsFamily fi.IsFamilyOrAssembly fi.IsFamilyAndAssembly), m) + IsProvidedMemberAccessible amap m ad pfi.EnclosingType access +#endif + +let GetILAccessOfILEventInfo (ILEventInfo (tinfo,edef)) = + (resolveILMethodRef tinfo.RawMetadata edef.AddMethod).Access + +let IsILEventInfoAccessible g amap m ad einfo = + let access = GetILAccessOfILEventInfo einfo + IsILTypeAndMemberAccessible g amap m ad ad einfo.ILTypeInfo access + +let private IsILMethInfoAccessible g amap m adType ad ilminfo = + match ilminfo with + | ILMethInfo (_,typ,None,mdef,_) -> IsILTypeAndMemberAccessible g amap m adType ad (ILTypeInfo.FromType g typ) mdef.Access + | ILMethInfo (_,_,Some declaringTyconRef,mdef,_) -> IsILMemberAccessible g amap m declaringTyconRef ad mdef.Access + +let GetILAccessOfILPropInfo (ILPropInfo(tinfo,pdef)) = + let tdef = tinfo.RawMetadata + let ilAccess = + match pdef.GetMethod with + | Some mref -> (resolveILMethodRef tdef mref).Access + | None -> + match pdef.SetMethod with + | None -> ILMemberAccess.Public + | Some mref -> (resolveILMethodRef tdef mref).Access + ilAccess + +let IsILPropInfoAccessible g amap m ad pinfo = + let ilAccess = GetILAccessOfILPropInfo pinfo + IsILTypeAndMemberAccessible g amap m ad ad pinfo.ILTypeInfo ilAccess + +let IsValAccessible ad (vref:ValRef) = + vref.Accessibility |> IsAccessible ad + +let CheckValAccessible m ad (vref:ValRef) = + if not (IsValAccessible ad vref) then + errorR (Error (FSComp.SR.valueIsNotAccessible vref.DisplayName,m)) + +let IsUnionCaseAccessible amap m ad (ucref:UnionCaseRef) = + IsTyconReprAccessible amap m ad ucref.TyconRef && + IsAccessible ad ucref.UnionCase.Accessibility + +let CheckUnionCaseAccessible amap m ad (ucref:UnionCaseRef) = + CheckTyconReprAccessible amap m ad ucref.TyconRef && + (let res = IsAccessible ad ucref.UnionCase.Accessibility + if not res then + errorR (Error (FSComp.SR.unionCaseIsNotAccessible ucref.CaseName,m)) + res) + +let IsRecdFieldAccessible amap m ad (rfref:RecdFieldRef) = + IsTyconReprAccessible amap m ad rfref.TyconRef && + IsAccessible ad rfref.RecdField.Accessibility + +let CheckRecdFieldAccessible amap m ad (rfref:RecdFieldRef) = + CheckTyconReprAccessible amap m ad rfref.TyconRef && + (let res = IsAccessible ad rfref.RecdField.Accessibility + if not res then + errorR (Error (FSComp.SR.fieldIsNotAccessible rfref.FieldName,m)) + res) + +let CheckRecdFieldInfoAccessible amap m ad (rfinfo:RecdFieldInfo) = + CheckRecdFieldAccessible amap m ad rfinfo.RecdFieldRef |> ignore + +let CheckILFieldInfoAccessible g amap m ad finfo = + if not (IsILFieldInfoAccessible g amap m ad finfo) then + errorR (Error (FSComp.SR.structOrClassFieldIsNotAccessible finfo.FieldName,m)) + +/// Uses a separate accessibility domains for containing type and method itself +/// This makes sense cases like +/// type A() = +/// type protected B() = +/// member this.Public() = () +/// member protected this.Protected() = () +/// type C() = +/// inherit A() +/// let x = A.B() +/// do x.Public() +/// when calling x.SomeMethod() we need to use 'adTyp' do verify that type of x is accessible from C +/// and 'ad' to determine accessibility of SomeMethod. +/// I.e when calling x.Public() and x.Protected() -in both cases first check should succeed and second - should fail in the latter one. +let IsTypeAndMethInfoAccessible amap m adTyp ad = function + | ILMeth (g,x,_) -> IsILMethInfoAccessible g amap m adTyp ad x + | FSMeth (_,_,vref,_) -> IsValAccessible ad vref + | DefaultStructCtor(g,typ) -> IsTypeAccessible g amap m ad typ +#if EXTENSIONTYPING + | ProvidedMeth(amap,tpmb,_,m) as etmi -> + let access = tpmb.PUntaint((fun mi -> ComputeILAccess mi.IsPublic mi.IsFamily mi.IsFamilyOrAssembly mi.IsFamilyAndAssembly), m) + IsProvidedMemberAccessible amap m ad etmi.EnclosingType access +#endif +let IsMethInfoAccessible amap m ad minfo = IsTypeAndMethInfoAccessible amap m ad ad minfo + +let IsPropInfoAccessible g amap m ad = function + | ILProp (_,x) -> IsILPropInfoAccessible g amap m ad x + | FSProp (_,_,Some vref,_) + | FSProp (_,_,_,Some vref) -> IsValAccessible ad vref +#if EXTENSIONTYPING + | ProvidedProp (amap, tppi, m) as pp-> + let access = + let a = tppi.PUntaint((fun ppi -> + let tryGetILAccessForProvidedMethodBase (mi : ProvidedMethodBase) = + match mi with + | null -> None + | mi -> Some(ComputeILAccess mi.IsPublic mi.IsFamily mi.IsFamilyOrAssembly mi.IsFamilyAndAssembly) + match tryGetILAccessForProvidedMethodBase(ppi.GetGetMethod()) with + | None -> tryGetILAccessForProvidedMethodBase(ppi.GetSetMethod()) + | x -> x), m) + defaultArg a ILMemberAccess.Public + IsProvidedMemberAccessible amap m ad pp.EnclosingType access +#endif + | _ -> false + +let IsFieldInfoAccessible ad (rfref:RecdFieldInfo) = + IsAccessible ad rfref.RecdField.Accessibility + + + diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs new file mode 100644 index 00000000000..661b5ede03d --- /dev/null +++ b/src/fsharp/AttributeChecking.fs @@ -0,0 +1,499 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Logic associated with checking "ObsoleteAttribute" and other attributes +/// on items from name resolution +module internal Microsoft.FSharp.Compiler.AttributeChecking + +open Internal.Utilities +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.TcGlobals + +#if EXTENSIONTYPING +open Microsoft.FSharp.Compiler.ExtensionTyping +open Microsoft.FSharp.Core.CompilerServices +#endif + +exception ObsoleteWarning of string * range +exception ObsoleteError of string * range + +let fail() = failwith "This custom attribute has an argument that can not yet be converted using this API" + +let rec private evalILAttribElem e = + match e with + | ILAttribElem.String (Some x) -> box x + | ILAttribElem.String None -> null + | ILAttribElem.Bool x -> box x + | ILAttribElem.Char x -> box x + | ILAttribElem.SByte x -> box x + | ILAttribElem.Int16 x -> box x + | ILAttribElem.Int32 x -> box x + | ILAttribElem.Int64 x -> box x + | ILAttribElem.Byte x -> box x + | ILAttribElem.UInt16 x -> box x + | ILAttribElem.UInt32 x -> box x + | ILAttribElem.UInt64 x -> box x + | ILAttribElem.Single x -> box x + | ILAttribElem.Double x -> box x + | ILAttribElem.Null -> null + | ILAttribElem.Array (_, a) -> box [| for i in a -> evalILAttribElem i |] + // TODO: typeof<..> in attribute values + | ILAttribElem.Type (Some _t) -> fail() + | ILAttribElem.Type None -> null + | ILAttribElem.TypeRef (Some _t) -> fail() + | ILAttribElem.TypeRef None -> null + +let rec private evalFSharpAttribArg g e = + match e with + | Expr.Const(c,_,_) -> + match c with + | Const.Bool b -> box b + | Const.SByte i -> box i + | Const.Int16 i -> box i + | Const.Int32 i -> box i + | Const.Int64 i -> box i + | Const.Byte i -> box i + | Const.UInt16 i -> box i + | Const.UInt32 i -> box i + | Const.UInt64 i -> box i + | Const.Single i -> box i + | Const.Double i -> box i + | Const.Char i -> box i + | Const.Zero -> null + | Const.String s -> box s + | _ -> fail() + | Expr.Op (TOp.Array,_,a,_) -> box [| for i in a -> evalFSharpAttribArg g i |] + | TypeOfExpr g ty -> box ty + // TODO: | TypeDefOfExpr g ty + | _ -> fail() + +type AttribInfo = + | FSAttribInfo of TcGlobals * Attrib + | ILAttribInfo of TcGlobals * Import.ImportMap * ILScopeRef * ILAttribute * range + + member x.TyconRef = + match x with + | FSAttribInfo(_g,Attrib(tcref,_,_,_,_,_,_)) -> tcref + | ILAttribInfo (g, amap, scoref, a, m) -> + let ty = ImportILType scoref amap m [] a.Method.EnclosingType + tcrefOfAppTy g ty + + member x.ConstructorArguments = + match x with + | FSAttribInfo(g,Attrib(_,_,unnamedArgs,_,_,_,_)) -> + unnamedArgs + |> List.map (fun (AttribExpr(origExpr,evaluatedExpr)) -> + let ty = tyOfExpr g origExpr + let obj = evalFSharpAttribArg g evaluatedExpr + ty,obj) + | ILAttribInfo (g, amap, scoref, cattr, m) -> + let parms, _args = decodeILAttribData g.ilg cattr + [ for (argty,argval) in Seq.zip cattr.Method.FormalArgTypes parms -> + let ty = ImportILType scoref amap m [] argty + let obj = evalILAttribElem argval + ty,obj ] + + member x.NamedArguments = + match x with + | FSAttribInfo(g,Attrib(_,_,_,namedArgs,_,_,_)) -> + namedArgs + |> List.map (fun (AttribNamedArg(nm,_,isField,AttribExpr(origExpr,evaluatedExpr))) -> + let ty = tyOfExpr g origExpr + let obj = evalFSharpAttribArg g evaluatedExpr + ty, nm, isField, obj) + | ILAttribInfo (g, amap, scoref, cattr, m) -> + let _parms, namedArgs = decodeILAttribData g.ilg cattr + [ for (nm, argty, isProp, argval) in namedArgs -> + let ty = ImportILType scoref amap m [] argty + let obj = evalILAttribElem argval + let isField = not isProp + ty, nm, isField, obj ] + + +/// Check custom attributes. This is particularly messy because custom attributes come in in three different +/// formats. +let AttribInfosOfIL g amap scoref m (attribs: ILAttributes) = + attribs.AsList |> List.map (fun a -> ILAttribInfo (g, amap, scoref, a, m)) + +let AttribInfosOfFS g attribs = + attribs |> List.map (fun a -> FSAttribInfo (g, a)) + +let GetAttribInfosOfEntity g amap m (tcref:TyconRef) = + match metadataOfTycon tcref.Deref with +#if EXTENSIONTYPING + // TODO: provided attributes + | ProvidedTypeMetadata _info -> [] + //let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) + //match provAttribs.PUntaint((fun a -> a. .GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with + //| Some args -> f3 args + //| None -> None +#endif + | ILTypeMetadata (scoref,tdef) -> + tdef.CustomAttrs |> AttribInfosOfIL g amap scoref m + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + tcref.Attribs |> List.map (fun a -> FSAttribInfo (g, a)) + + +let GetAttribInfosOfMethod amap m minfo = + match minfo with + | ILMeth (g,ilminfo,_) -> ilminfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilminfo.MetadataScope m + | FSMeth (g,_,vref,_) -> vref.Attribs |> AttribInfosOfFS g + | DefaultStructCtor _ -> [] +#if EXTENSIONTYPING + // TODO: provided attributes + | ProvidedMeth (_,_mi,_,_m) -> + [] + +#endif + +let GetAttribInfosOfProp amap m pinfo = + match pinfo with + | ILProp(g,ilpinfo) -> ilpinfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilpinfo.ILTypeInfo.ILScopeRef m + | FSProp(g,_,Some vref,_) + | FSProp(g,_,_,Some vref) -> vref.Attribs |> AttribInfosOfFS g + | FSProp _ -> failwith "GetAttribInfosOfProp: unreachable" +#if EXTENSIONTYPING + // TODO: provided attributes + | ProvidedProp _ -> [] +#endif + +let GetAttribInfosOfEvent amap m einfo = + match einfo with + | ILEvent(g, x) -> x.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap x.ILTypeInfo.ILScopeRef m + | FSEvent(_, pi, _vref1, _vref2) -> GetAttribInfosOfProp amap m pi +#if EXTENSIONTYPING + // TODO: provided attributes + | ProvidedEvent _ -> [] +#endif + +/// Analyze three cases for attributes declared on type definitions: IL-declared attributes, F#-declared attributes and +/// provided attributes. +// +// This is used for AttributeUsageAttribute, DefaultMemberAttribute and ConditionalAttribute (on attribute types) +let TryBindTyconRefAttribute g m (AttribInfo (atref,_) as args) (tcref:TyconRef) f1 f2 f3 = + ignore m; ignore f3 + match metadataOfTycon tcref.Deref with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) + match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with + | Some args -> f3 args + | None -> None +#endif + | ILTypeMetadata (_,tdef) -> + match TryDecodeILAttribute g atref tdef.CustomAttrs with + | Some attr -> f1 attr + | _ -> None + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + match TryFindFSharpAttribute g args tcref.Attribs with + | Some attr -> f2 attr + | _ -> None + +/// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and +/// provided attributes. +let BindMethInfoAttributes m minfo f1 f2 f3 = + ignore m; ignore f3 + match minfo with + | ILMeth (_,x,_) -> f1 x.RawMetadata.CustomAttrs + | FSMeth (_,_,vref,_) -> f2 vref.Attribs + | DefaultStructCtor _ -> f2 [] +#if EXTENSIONTYPING + | ProvidedMeth (_,mi,_,_) -> f3 (mi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) +#endif + +/// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and +/// provided attributes. +let TryBindMethInfoAttribute g m (AttribInfo(atref,_) as attribSpec) minfo f1 f2 f3 = +#if EXTENSIONTYPING +#else + // to prevent unused parameter warning + ignore f3 +#endif + BindMethInfoAttributes m minfo + (fun ilAttribs -> TryDecodeILAttribute g atref ilAttribs |> Option.bind f1) + (fun fsAttribs -> TryFindFSharpAttribute g attribSpec fsAttribs |> Option.bind f2) +#if EXTENSIONTYPING + (fun provAttribs -> + match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with + | Some args -> f3 args + | None -> None) +#else + (fun _provAttribs -> None) +#endif + +/// Try to find a specific attribute on a method, where the attribute accepts a string argument. +/// +/// This is just used for the 'ConditionalAttribute' attribute +let TryFindMethInfoStringAttribute g m attribSpec minfo = + TryBindMethInfoAttribute g m attribSpec minfo + (function ([ILAttribElem.String (Some msg) ],_) -> Some msg | _ -> None) + (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) + (function ([ Some ((:? string as msg) : obj) ],_) -> Some msg | _ -> None) + +/// Check if a method has a specific attribute. +let MethInfoHasAttribute g m attribSpec minfo = + TryBindMethInfoAttribute g m attribSpec minfo + (fun _ -> Some ()) + (fun _ -> Some ()) + (fun _ -> Some ()) + |> Option.isSome + + + +/// Check IL attributes for 'ObsoleteAttribute', returning errors and warnings as data +let private CheckILAttributes g cattrs m = + let (AttribInfo(tref,_)) = g.attrib_SystemObsolete + match TryDecodeILAttribute g tref cattrs with + | Some ([ILAttribElem.String (Some msg) ],_) -> + WarnD(ObsoleteWarning(msg,m)) + | Some ([ILAttribElem.String (Some msg); ILAttribElem.Bool isError ],_) -> + if isError then + ErrorD (ObsoleteError(msg,m)) + else + WarnD (ObsoleteWarning(msg,m)) + | Some ([ILAttribElem.String None ],_) -> + WarnD(ObsoleteWarning("",m)) + | Some _ -> + WarnD(ObsoleteWarning("",m)) + | None -> + CompleteD + +/// Check F# attributes for 'ObsoleteAttribute', 'CompilerMessageAttribute' and 'ExperimentalAttribute', +/// returning errors and warnings as data +let CheckFSharpAttributes g attribs m = + if isNil attribs then CompleteD + else + (match TryFindFSharpAttribute g g.attrib_SystemObsolete attribs with + | Some(Attrib(_,_,[ AttribStringArg s ],_,_,_,_)) -> + WarnD(ObsoleteWarning(s,m)) + | Some(Attrib(_,_,[ AttribStringArg s; AttribBoolArg(isError) ],_,_,_,_)) -> + if isError then + ErrorD (ObsoleteError(s,m)) + else + WarnD (ObsoleteWarning(s,m)) + | Some _ -> + WarnD(ObsoleteWarning("", m)) + | None -> + CompleteD + ) ++ (fun () -> + + match TryFindFSharpAttribute g g.attrib_CompilerMessageAttribute attribs with + | Some(Attrib(_,_,[ AttribStringArg s ; AttribInt32Arg n ],namedArgs,_,_,_)) -> + let msg = UserCompilerMessage(s,n,m) + let isError = + match namedArgs with + | ExtractAttribNamedArg "IsError" (AttribBoolArg v) -> v + | _ -> false + if isError then ErrorD msg else WarnD msg + + | _ -> + CompleteD + ) ++ (fun () -> + + match TryFindFSharpAttribute g g.attrib_ExperimentalAttribute attribs with + | Some(Attrib(_,_,[ AttribStringArg(s) ],_,_,_,_)) -> + WarnD(Experimental(s,m)) + | Some _ -> + WarnD(Experimental(FSComp.SR.experimentalConstruct (), m)) + | _ -> + CompleteD + ) ++ (fun () -> + + match TryFindFSharpAttribute g g.attrib_UnverifiableAttribute attribs with + | Some _ -> + WarnD(PossibleUnverifiableCode(m)) + | _ -> + CompleteD + ) + +#if EXTENSIONTYPING +/// Check a list of provided attributes for 'ObsoleteAttribute', returning errors and warnings as data +let private CheckProvidedAttributes g m (provAttribs: Tainted) = + let (AttribInfo(tref,_)) = g.attrib_SystemObsolete + match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), tref.FullName)),m) with + | Some ([ Some (:? string as msg) ], _) -> WarnD(ObsoleteWarning(msg,m)) + | Some ([ Some (:? string as msg); Some (:?bool as isError) ], _) -> + if isError then + ErrorD (ObsoleteError(msg,m)) + else + WarnD (ObsoleteWarning(msg,m)) + | Some ([ None ], _) -> + WarnD(ObsoleteWarning("",m)) + | Some _ -> + WarnD(ObsoleteWarning("",m)) + | None -> + CompleteD +#endif + +/// Indicate if a list of IL attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. +let CheckILAttributesForUnseen g cattrs _m = + let (AttribInfo(tref,_)) = g.attrib_SystemObsolete + isSome (TryDecodeILAttribute g tref cattrs) + +/// Checks the attributes for CompilerMessageAttribute, which has an IsHidden argument that allows +/// items to be suppressed from intellisense. +let CheckFSharpAttributesForHidden g attribs = + nonNil attribs && + (match TryFindFSharpAttribute g g.attrib_CompilerMessageAttribute attribs with + | Some(Attrib(_,_,[AttribStringArg _; AttribInt32Arg messageNumber], + ExtractAttribNamedArg "IsHidden" (AttribBoolArg v),_,_,_)) -> + // Message number 62 is for "ML Compatibility". Items labelled with this are visible in intellisense + // when mlCompatibility is set. + v && not (messageNumber = 62 && g.mlCompatibility) + | _ -> false) + +/// Indicate if a list of F# attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. +let CheckFSharpAttributesForObsolete g attribs = + nonNil attribs && (HasFSharpAttribute g g.attrib_SystemObsolete attribs) + +/// Indicate if a list of F# attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. +/// Also check the attributes for CompilerMessageAttribute, which has an IsHidden argument that allows +/// items to be suppressed from intellisense. +let CheckFSharpAttributesForUnseen g attribs _m = + nonNil attribs && + (CheckFSharpAttributesForObsolete g attribs || + CheckFSharpAttributesForHidden g attribs) + +#if EXTENSIONTYPING +/// Indicate if a list of provided attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. +let CheckProvidedAttributesForUnseen (provAttribs: Tainted) m = + provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome),m) +#endif + +/// Check the attributes associated with a property, returning warnings and errors as data. +let CheckPropInfoAttributes pinfo m = + match pinfo with + | ILProp(g,ILPropInfo(_,pdef)) -> CheckILAttributes g pdef.CustomAttrs m + | FSProp(g,_,Some vref,_) + | FSProp(g,_,_,Some vref) -> CheckFSharpAttributes g vref.Attribs m + | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" +#if EXTENSIONTYPING + | ProvidedProp (amap,pi,m) -> + CheckProvidedAttributes amap.g m (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) + +#endif + + +/// Check the attributes associated with a IL field, returning warnings and errors as data. +let CheckILFieldAttributes g (finfo:ILFieldInfo) m = + match finfo with + | ILFieldInfo(_,pd) -> + CheckILAttributes g pd.CustomAttrs m |> CommitOperationResult +#if EXTENSIONTYPING + | ProvidedField (amap,fi,m) -> + CheckProvidedAttributes amap.g m (fi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) |> CommitOperationResult +#endif + +/// Check the attributes associated with a method, returning warnings and errors as data. +let CheckMethInfoAttributes g m tyargsOpt minfo = + let search = + BindMethInfoAttributes m minfo + (fun ilAttribs -> Some(CheckILAttributes g ilAttribs m)) + (fun fsAttribs -> + let res = + CheckFSharpAttributes g fsAttribs m ++ (fun () -> + if isNone tyargsOpt && HasFSharpAttribute g g.attrib_RequiresExplicitTypeArgumentsAttribute fsAttribs then + ErrorD(Error(FSComp.SR.tcFunctionRequiresExplicitTypeArguments(minfo.LogicalName),m)) + else + CompleteD) + Some res) +#if EXTENSIONTYPING + (fun provAttribs -> Some (CheckProvidedAttributes g m provAttribs)) +#else + (fun _provAttribs -> None) +#endif + match search with + | Some res -> res + | None -> CompleteD // no attribute = no errors + +/// Indicate if a method has 'Obsolete', 'CompilerMessageAttribute' or 'TypeProviderEditorHideMethodsAttribute'. +/// Used to suppress the item in intellisense. +let MethInfoIsUnseen g m typ minfo = + let isUnseenByObsoleteAttrib = + match BindMethInfoAttributes m minfo + (fun ilAttribs -> Some(CheckILAttributesForUnseen g ilAttribs m)) + (fun fsAttribs -> Some(CheckFSharpAttributesForUnseen g fsAttribs m)) +#if EXTENSIONTYPING + (fun provAttribs -> Some(CheckProvidedAttributesForUnseen provAttribs m)) +#else + (fun _provAttribs -> None) +#endif + with + | Some res -> res + | None -> false + + let isUnseenByHidingAttribute = +#if EXTENSIONTYPING + not (isObjTy g typ) && + isAppTy g typ && + isObjTy g minfo.EnclosingType && + let tcref = tcrefOfAppTy g typ + match tcref.TypeReprInfo with + | TProvidedTypeExtensionPoint info -> + info.ProvidedType.PUntaint((fun st -> (st :> IProvidedCustomAttributeProvider).GetHasTypeProviderEditorHideMethodsAttribute(info.ProvidedType.TypeProvider.PUntaintNoFailure(id))), m) + | _ -> + // This attribute check is done by name to ensure compilation doesn't take a dependency + // on Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute. + // + // We are only interested in filtering out the method on System.Object, so it is sufficient + // just to look at the attributes on IL methods. + if tcref.IsILTycon then + tcref.ILTyconRawMetadata.CustomAttrs.AsList + |> List.exists (fun attr -> attr.Method.EnclosingType.TypeSpec.Name = typeof.FullName) + else + false +#else + typ |> ignore + false +#endif + isUnseenByObsoleteAttrib || isUnseenByHidingAttribute + +/// Indicate if a property has 'Obsolete' or 'CompilerMessageAttribute'. +/// Used to suppress the item in intellisense. +let PropInfoIsUnseen m pinfo = + match pinfo with + | ILProp (g,ILPropInfo(_,pdef)) -> CheckILAttributesForUnseen g pdef.CustomAttrs m + | FSProp (g,_,Some vref,_) + | FSProp (g,_,_,Some vref) -> CheckFSharpAttributesForUnseen g vref.Attribs m + | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" +#if EXTENSIONTYPING + | ProvidedProp (_amap,pi,m) -> + CheckProvidedAttributesForUnseen (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) m +#endif + +/// Check the attributes on an entity, returning errors and warnings as data. +let CheckEntityAttributes g (x:TyconRef) m = + if x.IsILTycon then + CheckILAttributes g x.ILTyconRawMetadata.CustomAttrs m + else + CheckFSharpAttributes g x.Attribs m + +/// Check the attributes on a union case, returning errors and warnings as data. +let CheckUnionCaseAttributes g (x:UnionCaseRef) m = + CheckEntityAttributes g x.TyconRef m ++ (fun () -> + CheckFSharpAttributes g x.Attribs m) + +/// Check the attributes on a record field, returning errors and warnings as data. +let CheckRecdFieldAttributes g (x:RecdFieldRef) m = + CheckEntityAttributes g x.TyconRef m ++ (fun () -> + CheckFSharpAttributes g x.PropertyAttribs m) + +/// Check the attributes on an F# value, returning errors and warnings as data. +let CheckValAttributes g (x:ValRef) m = + CheckFSharpAttributes g x.Attribs m + +/// Check the attributes on a record field, returning errors and warnings as data. +let CheckRecdFieldInfoAttributes g (x:RecdFieldInfo) m = + CheckRecdFieldAttributes g x.RecdFieldRef m + + diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 9c6ac439041..f7950c34dba 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -7,26 +7,29 @@ open System open System.Text open System.IO open System.Collections.Generic +open System.Runtime.CompilerServices + open Internal.Utilities open Internal.Utilities.Text -open Microsoft.FSharp.Compiler +open Internal.Utilities.Collections +open Internal.Utilities.Filename + open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics + +open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.TastPickle open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.TypeChecker open Microsoft.FSharp.Compiler.SR open Microsoft.FSharp.Compiler.DiagnosticMessage - -module Tc = Microsoft.FSharp.Compiler.TypeChecker - -open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.AttributeChecking open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops @@ -38,17 +41,17 @@ open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.ConstraintSolver open Microsoft.FSharp.Compiler.MSBuildResolver open Microsoft.FSharp.Compiler.TypeRelations +open Microsoft.FSharp.Compiler.SignatureConformance +open Microsoft.FSharp.Compiler.MethodOverrides open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.PrettyNaming -open Internal.Utilities.Collections -open Internal.Utilities.Filename open Microsoft.FSharp.Compiler.Import + #if EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif -open System.Runtime.CompilerServices #if FX_RESHAPED_REFLECTION open Microsoft.FSharp.Core.ReflectionAdapters @@ -4602,7 +4605,7 @@ let RequireDLL (tcImports:TcImports, tcEnv, thisAssemblyName, m, file) = let g = tcImports.GetTcGlobals() let amap = tcImports.GetImportMap() - let tcEnv = (tcEnv, asms) ||> List.fold (fun tcEnv asm -> Tc.AddCcuToTcEnv(g,amap,m,tcEnv,thisAssemblyName,asm.FSharpViewOfMetadata,asm.AssemblyAutoOpenAttributes,asm.AssemblyInternalsVisibleToAttributes)) + let tcEnv = (tcEnv, asms) ||> List.fold (fun tcEnv asm -> AddCcuToTcEnv(g,amap,m,tcEnv,thisAssemblyName,asm.FSharpViewOfMetadata,asm.AssemblyAutoOpenAttributes,asm.AssemblyInternalsVisibleToAttributes)) tcEnv,(dllinfos,asms) @@ -5030,11 +5033,11 @@ let GetInitialTcEnv (thisAssemblyName:string, initm:range, tcConfig:TcConfig, tc let amap = tcImports.GetImportMap() - let tcEnv = Tc.CreateInitialTcEnv(tcGlobals, amap, initm, thisAssemblyName, ccus) + let tcEnv = CreateInitialTcEnv(tcGlobals, amap, initm, thisAssemblyName, ccus) let tcEnv = if tcConfig.checkOverflow then - Tc.TcOpenDecl TcResultsSink.NoSink tcGlobals amap initm initm tcEnv (pathToSynLid initm (splitNamespace FSharpLib.CoreOperatorsCheckedName)) + TcOpenDecl TcResultsSink.NoSink tcGlobals amap initm initm tcEnv (pathToSynLid initm (splitNamespace FSharpLib.CoreOperatorsCheckedName)) else tcEnv tcEnv @@ -5162,7 +5165,7 @@ let TypeCheckOneInputEventually // Typecheck the signature file let! (tcEnvAtEnd,tcEnv,smodulTypeRoot) = - Tc.TypeCheckOneSigFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcState.tcsTcSigEnv file + TypeCheckOneSigFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcState.tcsTcSigEnv file let rootSigs = Zmap.add qualNameOfFile smodulTypeRoot rootSigs @@ -5192,7 +5195,7 @@ let TypeCheckOneInputEventually // Typecheck the implementation file let! topAttrs,implFile,tcEnvAtEnd = - Tc.TypeCheckOneImplFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcImplEnv rootSigOpt file + TypeCheckOneImplFile (tcGlobals,tcState.tcsNiceNameGen,amap,tcState.tcsCcu,checkForErrors,tcConfig.conditionalCompilationDefines,tcSink) tcImplEnv rootSigOpt file let hadSig = isSome rootSigOpt let implFileSigType = SigTypeOfImplFile implFile @@ -5204,12 +5207,12 @@ let TypeCheckOneInputEventually let m = qualNameOfFile.Range // Add the implementation as to the implementation env - let tcImplEnv = Tc.AddLocalRootModuleOrNamespace TcResultsSink.NoSink tcGlobals amap m tcImplEnv implFileSigType + let tcImplEnv = AddLocalRootModuleOrNamespace TcResultsSink.NoSink tcGlobals amap m tcImplEnv implFileSigType // Add the implementation as to the signature env (unless it had an explicit signature) let tcSigEnv = if hadSig then tcState.tcsTcSigEnv - else Tc.AddLocalRootModuleOrNamespace TcResultsSink.NoSink tcGlobals amap m tcState.tcsTcSigEnv implFileSigType + else AddLocalRootModuleOrNamespace TcResultsSink.NoSink tcGlobals amap m tcState.tcsTcSigEnv implFileSigType // Open the prefixPath for fsi.exe (tcImplEnv) let tcImplEnv = diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index de7d14ac5bd..60f34d73267 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -33,7 +33,7 @@ open Microsoft.FSharp.Compiler.IlxGen #endif #if FX_RESHAPED_REFLECTION - open Microsoft.FSharp.Core.ReflectionAdapters +open Microsoft.FSharp.Core.ReflectionAdapters #endif module Attributes = diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 45fb086f907..c3fe9f8608d 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -32,26 +32,28 @@ module internal Microsoft.FSharp.Compiler.ConstraintSolver open Internal.Utilities open Internal.Utilities.Collections + +open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler - -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics -open Microsoft.FSharp.Compiler.Range -open Microsoft.FSharp.Compiler.Rational open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.AttributeChecking +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.MethodCalls +open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Rational +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.Lib -open Microsoft.FSharp.Compiler.Infos -open Microsoft.FSharp.Compiler.Infos.AccessibilityLogic -open Microsoft.FSharp.Compiler.Infos.AttributeChecking open Microsoft.FSharp.Compiler.TypeRelations -open Microsoft.FSharp.Compiler.PrettyNaming //------------------------------------------------------------------------- // Generate type variables and record them in within the scope of the @@ -1290,7 +1292,7 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst = let minst = [] // GENERIC TYPE PROVIDERS: for generics, we would have an minst here let allArgVars, allArgs = minfo.GetParamTypes(amap, m, minst) |> List.concat |> List.mapi (fun i ty -> mkLocal m ("arg"+string i) ty) |> List.unzip let objArgVars, objArgs = (if minfo.IsInstance then [mkLocal m "this" minfo.EnclosingType] else []) |> List.unzip - let callMethInfoOpt, callExpr,callExprTy = TypeRelations.ProvidedMethodCalls.BuildInvokerExpressionForProvidedMethodCall css.TcVal (g, amap, mi, objArgs, NeverMutates, false, ValUseFlag.NormalValUse, allArgs, m) + let callMethInfoOpt, callExpr,callExprTy = ProvidedMethodCalls.BuildInvokerExpressionForProvidedMethodCall css.TcVal (g, amap, mi, objArgs, NeverMutates, false, ValUseFlag.NormalValUse, allArgs, m) let closedExprSln = ClosedExprSln (mkLambdas m [] (objArgVars@allArgVars) (callExpr, callExprTy) ) // If the call is a simple call to an IL method with all the arguments in the natural order, then revert to use ILMethSln. // This is important for calls to operators on generated provided types. There is an (unchecked) condition @@ -2539,7 +2541,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait let wrap,h' = mkExprAddrOfExpr g true false PossiblyMutates h None m ResultD (Some (wrap (Expr.Op(TOp.TraitCall(traitInfo), [], (h' :: t), m)))) else - ResultD (Some (Infos.MakeMethInfoCall amap m minfo methArgTys argExprs )) + ResultD (Some (MakeMethInfoCall amap m minfo methArgTys argExprs )) | Choice2Of4 (tinst,rfref,isSet) -> let res = diff --git a/src/fsharp/ConstraintSolver.fsi b/src/fsharp/ConstraintSolver.fsi index 75dda149237..7f648f99ca7 100644 --- a/src/fsharp/ConstraintSolver.fsi +++ b/src/fsharp/ConstraintSolver.fsi @@ -9,6 +9,7 @@ open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast @@ -18,6 +19,8 @@ open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.MethodCalls +open Microsoft.FSharp.Compiler.InfoReader /// Create a type variable representing the use of a "_" in F# code val NewAnonTypar : TyparKind * range * TyparRigidity * TyparStaticReq * TyparDynamicReq -> Typar @@ -83,8 +86,8 @@ val SimplifyMeasuresInTypeScheme : TcGlobals -> bool -> Typars -> TT val SolveTyparEqualsTyp : ConstraintSolverEnv -> int -> range -> OptionalTrace -> TType -> TType -> OperationResult val SolveTypEqualsTypKeepAbbrevs : ConstraintSolverEnv -> int -> range -> OptionalTrace -> TType -> TType -> OperationResult val CanonicalizeRelevantMemberConstraints : ConstraintSolverEnv -> int -> OptionalTrace -> Typars -> OperationResult -val ResolveOverloading : ConstraintSolverEnv -> OptionalTrace -> string -> ndeep: int -> bool -> int * int -> AccessorDomain -> TypeRelations.CalledMeth list -> bool -> TType option -> TypeRelations.CalledMeth option * OperationResult -val UnifyUniqueOverloading : ConstraintSolverEnv -> int * int -> string -> AccessorDomain -> TypeRelations.CalledMeth list -> TType -> OperationResult +val ResolveOverloading : ConstraintSolverEnv -> OptionalTrace -> string -> ndeep: int -> bool -> int * int -> AccessorDomain -> CalledMeth list -> bool -> TType option -> CalledMeth option * OperationResult +val UnifyUniqueOverloading : ConstraintSolverEnv -> int * int -> string -> AccessorDomain -> CalledMeth list -> TType -> OperationResult val EliminateConstraintsForGeneralizedTypars : ConstraintSolverEnv -> OptionalTrace -> Typars -> unit val CheckDeclaredTypars : DisplayEnv -> ConstraintSolverState -> range -> Typars -> Typars -> unit diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj index 3312403732b..407bc789856 100644 --- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj +++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -12,6 +12,8 @@ FSharp.Build true {702A7979-BCF9-4C41-853E-3ADFC9897890} + $(OtherFlags) --targetprofile:netcore + true @@ -32,6 +34,7 @@ Utilities/CompilerLocationUtils.fs + @@ -49,7 +52,7 @@ Content - + @@ -57,13 +60,14 @@ + + {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core - diff --git a/src/fsharp/FSharp.Build/Fsc.fs b/src/fsharp/FSharp.Build/Fsc.fs index 69c01ba3e09..122fd082a28 100644 --- a/src/fsharp/FSharp.Build/Fsc.fs +++ b/src/fsharp/FSharp.Build/Fsc.fs @@ -17,6 +17,10 @@ open Internal.Utilities do() +#if FX_RESHAPED_REFLECTION +open Microsoft.FSharp.Core.ReflectionAdapters +#endif + type FscCommandLineBuilder() = // In addition to generating a command-line that will be handed to cmd.exe, we also generate // an array of individual arguments. The former needs to be quoted (and cmd.exe will strip the @@ -347,18 +351,14 @@ type [ - base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) + | null -> base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) | _ -> let sources = sources|>Array.map(fun i->i.ItemSpec) - let baseCall = fun (dummy : int) -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) - // We are using a Converter rather than a "unit->int" because it is too hard to - // figure out how to pass an F# function object via reflection. - let baseCallDelegate = new System.Converter(baseCall) + let baseCallDelegate = new Func(fun () -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) ) try let ret = (host.GetType()).InvokeMember("Compile", BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.InvokeMethod ||| BindingFlags.Instance, null, host, - [| box baseCallDelegate; box (capturedArguments |> List.toArray); box (capturedFilenames |> List.toArray) |], + [| baseCallDelegate; box (capturedArguments |> List.toArray); box (capturedFilenames |> List.toArray) |], System.Globalization.CultureInfo.InvariantCulture) unbox ret with @@ -368,7 +368,7 @@ type [ System.Diagnostics.Debug.Assert(false, "HostObject received by Fsc task did not have a Compile method or the compile method threw an exception. "+(e.ToString())) reraise() - + override fsc.GenerateCommandLineCommands() = let builder = new FscCommandLineBuilder() diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.targets index cdaaf9563a8..b81b7dedf99 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.targets @@ -201,14 +201,15 @@ this file. - + ============================================================ + --> diff --git a/src/fsharp/FSharp.Build/project.json b/src/fsharp/FSharp.Build/project.json new file mode 100644 index 00000000000..6aeadada7ed --- /dev/null +++ b/src/fsharp/FSharp.Build/project.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "Microsoft.Build": "0.1.0-preview-00022", + "Microsoft.Build.Framework": "0.1.0-preview-00022", + "Microsoft.Build.Tasks.Core": "0.1.0-preview-00022", + "Microsoft.Build.Utilities.Core": "0.1.0-preview-00022", + "Microsoft.NETCore.Platforms": "1.0.1-rc2-23911", + "Microsoft.Win32.Registry": { + "version": "4.0.0-rc2-23923", + "exclude": "Compile" + }, + "System.AppContext": "4.1.0-rc2-23911", + "System.Diagnostics.Tools": "4.0.1-rc2-23911", + }, + "frameworks": { + "dnxcore50": { + "imports": "portable-net45+win8" + } + } +} \ No newline at end of file diff --git a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj index a01b57f9932..9731adc082c 100644 --- a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj +++ b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj @@ -323,6 +323,15 @@ infos.fs + + Logic\AccessibilityLogic.fs + + + Logic\AttributeChecking.fs + + + Logic\InfoReader.fs + NicePrint.fs @@ -341,6 +350,15 @@ TypeRelations.fs + + Logic\SignatureConformance.fs + + + Logic\MethodOverrides.fs + + + MethodCalls.fs + PatternMatchCompilation.fsi @@ -443,13 +461,13 @@ - + - ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.3.20160301.3\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.0.0-rc-60301\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll ..\..\..\packages\Microsoft.DiaSymReader.1.0.7\lib\portable-net45+win8\Microsoft.DiaSymReader.dll ..\..\..\packages\System.Reflection.Metadata.1.3.0-beta-23816\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\..\..\packages\System.Collections.Immutable.1.2.0-rc3-23805\lib\portable-net45+win8+wp8+wpa81 diff --git a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj index d6cfc802eae..c66d8802668 100644 --- a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj +++ b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj @@ -24,8 +24,6 @@ $(OtherFlags) --targetprofile:netcore - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl @@ -371,6 +369,15 @@ Logic\infos.fs + + Logic\AccessibilityLogic.fs + + + Logic\AttributeChecking.fs + + + Logic\InfoReader.fs + Logic\NicePrint.fs @@ -389,6 +396,15 @@ Logic\TypeRelations.fs + + Logic\SignatureConformance.fs + + + Logic\MethodOverrides.fs + + + Logic\MethodCalls.fs + Logic\PatternMatchCompilation.fsi @@ -512,6 +528,8 @@ FSharp.Core + + diff --git a/src/fsharp/FSharp.Core/FSharp.Core.fsproj b/src/fsharp/FSharp.Core/FSharp.Core.fsproj index ce716d8c430..2300e09f2c2 100644 --- a/src/fsharp/FSharp.Core/FSharp.Core.fsproj +++ b/src/fsharp/FSharp.Core/FSharp.Core.fsproj @@ -16,6 +16,7 @@ 0x05000000 true true + true $(OtherFlags) --warnon:1182 --compiling-fslib --optimize --maxerrors:20 --extraoptimizationloops:1 $(OtherFlags) --compiling-fslib-20:"$(SystemRoot)\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll" $(OtherFlags) --compiling-fslib-40 diff --git a/src/fsharp/FSharp.Core/printf.fs b/src/fsharp/FSharp.Core/printf.fs index 1e175192de1..6dfb7cfa3a4 100644 --- a/src/fsharp/FSharp.Core/printf.fs +++ b/src/fsharp/FSharp.Core/printf.fs @@ -42,11 +42,10 @@ module internal PrintfImpl = open Microsoft.FSharp.Core.Operators open Microsoft.FSharp.Collections open LanguagePrimitives.IntrinsicOperators -#if FX_RESHAPED_REFLECTION +#if FX_RESHAPED_REFLECTION open Microsoft.FSharp.Core.PrimReflectionAdapters open Microsoft.FSharp.Core.ReflectionAdapters - #endif open System.IO diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index e3aa019fc9b..5f1c72cf2f6 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -359,6 +359,15 @@ Logic\infos.fs + + Logic\AccessibilityLogic.fs + + + Logic\AttributeChecking.fs + + + Logic\InfoReader.fs + Logic\NicePrint.fs @@ -377,6 +386,15 @@ Logic\TypeRelations.fs + + Logic\SignatureConformance.fs + + + Logic\MethodOverrides.fs + + + Logic\MethodCalls.fs + Logic\PatternMatchCompilation.fsi diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index f682746abc9..ef53a03fc3e 100644 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -7,12 +7,12 @@ module internal Microsoft.FSharp.Compiler.FindUnsolved open Internal.Utilities + +open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler - open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Ast diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs new file mode 100644 index 00000000000..237c54ad208 --- /dev/null +++ b/src/fsharp/InfoReader.fs @@ -0,0 +1,727 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + +/// Select members from a type by name, searching the type hierarchy if needed +module internal Microsoft.FSharp.Compiler.InfoReader + +open Internal.Utilities + +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.AttributeChecking +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.TcGlobals + +/// Use the given function to select some of the member values from the members of an F# type +let private SelectImmediateMemberVals g optFilter f (tcref:TyconRef) = + let chooser (vref:ValRef) = + match vref.MemberInfo with + // The 'when' condition is a workaround for the fact that values providing + // override and interface implementations are published in inferred module types + // These cannot be selected directly via the "." notation. + // However, it certainly is useful to be able to publish these values, as we can in theory + // optimize code to make direct calls to these methods. + | Some membInfo when not (ValRefIsExplicitImpl g vref) -> + f membInfo vref + | _ -> + None + + match optFilter with + | None -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.chooseRange chooser + | Some nm -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.find nm |> List.choose chooser + +/// Check whether a name matches an optional filter +let private checkFilter optFilter (nm:string) = match optFilter with None -> true | Some n2 -> nm = n2 + +/// Try to select an F# value when querying members, and if so return a MethInfo that wraps the F# value. +let TrySelectMemberVal g optFilter typ pri _membInfo (vref:ValRef) = + if checkFilter optFilter vref.LogicalName then + Some(FSMeth(g,typ,vref,pri)) + else + None + +/// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter +/// parameter is an optional name to restrict the set of properties returned. +let GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ = + let minfos = + + match metadataOfTy g typ with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let st = info.ProvidedType + let meths = + match optFilter with + | Some name -> st.PApplyArray ((fun st -> st.GetMethods() |> Array.filter (fun mi -> mi.Name = name) ), "GetMethods", m) + | None -> st.PApplyArray ((fun st -> st.GetMethods()), "GetMethods", m) + [ for mi in meths -> ProvidedMeth(amap,mi.Coerce(m),None,m) ] +#endif + | ILTypeMetadata (_,tdef) -> + let mdefs = tdef.Methods + let mdefs = (match optFilter with None -> mdefs.AsList | Some nm -> mdefs.FindByName nm) + mdefs |> List.map (fun mdef -> MethInfo.CreateILMeth(amap, m, typ, mdef)) + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + if not (isAppTy g typ) then [] + else SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter typ None) (tcrefOfAppTy g typ) + let minfos = minfos |> List.filter (IsMethInfoAccessible amap m ad) + minfos + +/// A helper type to help collect properties. +/// +/// Join up getters and setters which are not associated in the F# data structure +type PropertyCollector(g,amap,m,typ,optFilter,ad) = + + let hashIdentity = + Microsoft.FSharp.Collections.HashIdentity.FromFunctions + (fun (pinfo:PropInfo) -> hash pinfo.PropertyName) + (fun pinfo1 pinfo2 -> + pinfo1.IsStatic = pinfo2.IsStatic && + PropInfosEquivByNameAndPartialSig EraseNone g amap m pinfo1 pinfo2 && + pinfo1.IsDefiniteFSharpOverride = pinfo2.IsDefiniteFSharpOverride ) + let props = new System.Collections.Generic.Dictionary(hashIdentity) + let add pinfo = + if props.ContainsKey(pinfo) then + match props.[pinfo], pinfo with + | FSProp (_,typ,Some vref1,_), FSProp (_,_,_,Some vref2) + | FSProp (_,typ,_,Some vref2), FSProp (_,_,Some vref1,_) -> + let pinfo = FSProp (g,typ,Some vref1,Some vref2) + props.[pinfo] <- pinfo + | _ -> + // This assert fires while editing bad code. We will give a warning later in check.fs + //assert ("unexpected case"= "") + () + else + props.[pinfo] <- pinfo + + member x.Collect(membInfo:ValMemberInfo,vref:ValRef) = + match membInfo.MemberFlags.MemberKind with + | MemberKind.PropertyGet -> + let pinfo = FSProp(g,typ,Some vref,None) + if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then + add pinfo + | MemberKind.PropertySet -> + let pinfo = FSProp(g,typ,None,Some vref) + if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then + add pinfo + | _ -> + () + + member x.Close() = [ for KeyValue(_,pinfo) in props -> pinfo ] + +/// Query the immediate properties of an F# type, not taking into account inherited properties. The optFilter +/// parameter is an optional name to restrict the set of properties returned. +let GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ = + let pinfos = + + match metadataOfTy g typ with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let st = info.ProvidedType + let matchingProps = + match optFilter with + | Some name -> + match st.PApply((fun st -> st.GetProperty name), m) with + | Tainted.Null -> [||] + | pi -> [|pi|] + | None -> + st.PApplyArray((fun st -> st.GetProperties()), "GetProperties", m) + matchingProps + |> Seq.map(fun pi -> ProvidedProp(amap,pi,m)) + |> List.ofSeq +#endif + | ILTypeMetadata (_,tdef) -> + let tinfo = ILTypeInfo.FromType g typ + let pdefs = tdef.Properties + let pdefs = match optFilter with None -> pdefs.AsList | Some nm -> pdefs.LookupByName nm + pdefs |> List.map (fun pd -> ILProp(g,ILPropInfo(tinfo,pd))) + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + + if not (isAppTy g typ) then [] + else + let propCollector = new PropertyCollector(g,amap,m,typ,optFilter,ad) + SelectImmediateMemberVals g None + (fun membInfo vref -> propCollector.Collect(membInfo,vref); None) + (tcrefOfAppTy g typ) |> ignore + propCollector.Close() + + let pinfos = pinfos |> List.filter (IsPropInfoAccessible g amap m ad) + pinfos + + +/// Sets of methods up the hierarchy, ignoring duplicates by name and sig. +/// Used to collect sets of virtual methods, protected methods, protected +/// properties etc. +type HierarchyItem = + | MethodItem of MethInfo list list + | PropertyItem of PropInfo list list + | RecdFieldItem of RecdFieldInfo + | EventItem of EventInfo list + | ILFieldItem of ILFieldInfo list + +/// An InfoReader is an object to help us read and cache infos. +/// We create one of these for each file we typecheck. +type InfoReader(g:TcGlobals, amap:Import.ImportMap) = + + /// Get the declared IL fields of a type, not including inherited fields + let GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ = + let infos = + match metadataOfTy g typ with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let st = info.ProvidedType + match optFilter with + | None -> + [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields" , m) -> ProvidedField(amap,fi,m) ] + | Some name -> + match st.PApply ((fun st -> st.GetField name), m) with + | Tainted.Null -> [] + | fi -> [ ProvidedField(amap,fi,m) ] +#endif + | ILTypeMetadata (_,tdef) -> + let tinfo = ILTypeInfo.FromType g typ + let fdefs = tdef.Fields + let fdefs = match optFilter with None -> fdefs.AsList | Some nm -> fdefs.LookupByName nm + fdefs |> List.map (fun pd -> ILFieldInfo(tinfo,pd)) + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + [] + let infos = infos |> List.filter (IsILFieldInfoAccessible g amap m ad) + infos + + /// Get the declared events of a type, not including inherited events + let ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ = + let infos = + match metadataOfTy g typ with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let st = info.ProvidedType + match optFilter with + | None -> + [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents" , m) -> ProvidedEvent(amap,ei,m) ] + | Some name -> + match st.PApply ((fun st -> st.GetEvent name), m) with + | Tainted.Null -> [] + | ei -> [ ProvidedEvent(amap,ei,m) ] +#endif + | ILTypeMetadata (_,tdef) -> + let tinfo = ILTypeInfo.FromType g typ + let edefs = tdef.Events + let edefs = match optFilter with None -> edefs.AsList | Some nm -> edefs.LookupByName nm + [ for edef in edefs do + let einfo = ILEventInfo(tinfo,edef) + if IsILEventInfoAccessible g amap m ad einfo then + yield ILEvent(g,einfo) ] + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + [] + infos + + /// Make a reference to a record or class field + let MakeRecdFieldInfo g typ (tcref:TyconRef) fspec = + RecdFieldInfo(argsOfAppTy g typ,tcref.MakeNestedRecdFieldRef fspec) + + /// Get the F#-declared record fields or class 'val' fields of a type + let GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,_ad) _m typ = + match tryDestAppTy g typ with + | None -> [] + | Some tcref -> + // Note;secret fields are not allowed in lookups here, as we're only looking + // up user-visible fields in name resolution. + match optFilter with + | Some nm -> + match tcref.GetFieldByName nm with + | Some rfield when not rfield.IsCompilerGenerated -> [MakeRecdFieldInfo g typ tcref rfield] + | _ -> [] + | None -> + [ for fdef in tcref.AllFieldsArray do + if not fdef.IsCompilerGenerated then + yield MakeRecdFieldInfo g typ tcref fdef ] + + + /// The primitive reader for the method info sets up a hierarchy + let GetIntrinsicMethodSetsUncached ((optFilter,ad,allowMultiIntfInst),m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ :: acc) g amap m allowMultiIntfInst typ [] + + /// The primitive reader for the property info sets up a hierarchy + let GetIntrinsicPropertySetsUncached ((optFilter,ad,allowMultiIntfInst),m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ :: acc) g amap m allowMultiIntfInst typ [] + + let GetIntrinsicILFieldInfosUncached ((optFilter,ad),m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] + + let GetIntrinsicEventInfosUncached ((optFilter,ad),m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] + + let GetIntrinsicRecdOrClassFieldInfosUncached ((optFilter,ad),m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] + + let GetEntireTypeHierachyUncached (allowMultiIntfInst,m,typ) = + FoldEntireHierarchyOfType (fun typ acc -> typ :: acc) g amap m allowMultiIntfInst typ [] + + let GetPrimaryTypeHierachyUncached (allowMultiIntfInst,m,typ) = + FoldPrimaryHierarchyOfType (fun typ acc -> typ :: acc) g amap m allowMultiIntfInst typ [] + + /// The primitive reader for the named items up a hierarchy + let GetIntrinsicNamedItemsUncached ((nm,ad),m,typ) = + if nm = ".ctor" then None else // '.ctor' lookups only ever happen via constructor syntax + let optFilter = Some nm + FoldPrimaryHierarchyOfType (fun typ acc -> + let minfos = GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ + let pinfos = GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ + let finfos = GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ + let einfos = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ + let rfinfos = GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m typ + match acc with + | Some(MethodItem(inheritedMethSets)) when nonNil minfos -> Some(MethodItem (minfos::inheritedMethSets)) + | _ when nonNil minfos -> Some(MethodItem ([minfos])) + | Some(PropertyItem(inheritedPropSets)) when nonNil pinfos -> Some(PropertyItem(pinfos::inheritedPropSets)) + | _ when nonNil pinfos -> Some(PropertyItem([pinfos])) + | _ when nonNil finfos -> Some(ILFieldItem(finfos)) + | _ when nonNil einfos -> Some(EventItem(einfos)) + | _ when nonNil rfinfos -> + match rfinfos with + | [single] -> Some(RecdFieldItem(single)) + | _ -> failwith "Unexpected multiple fields with the same name" // Because an explicit name (i.e., nm) was supplied, there will be only one element at most. + | _ -> acc) + g amap m + AllowMultiIntfInstantiations.Yes + typ + None + + /// Make a cache for function 'f' keyed by type (plus some additional 'flags') that only + /// caches computations for monomorphic types. + + let MakeInfoCache f (flagsEq : System.Collections.Generic.IEqualityComparer<_>) = + new MemoizationTable<_,_> + (compute=f, + // Only cache closed, monomorphic types (closed = all members for the type + // have been processed). Generic type instantiations could be processed if we had + // a decent hash function for these. + canMemoize=(fun (_flags,(_:range),typ) -> + match stripTyEqns g typ with + | TType_app(tcref,[]) -> tcref.TypeContents.tcaug_closed + | _ -> false), + + keyComparer= + { new System.Collections.Generic.IEqualityComparer<_> with + member x.Equals((flags1,_,typ1),(flags2,_,typ2)) = + // Ignoring the ranges - that's OK. + flagsEq.Equals(flags1,flags2) && + match stripTyEqns g typ1, stripTyEqns g typ2 with + | TType_app(tcref1,[]),TType_app(tcref2,[]) -> tyconRefEq g tcref1 tcref2 + | _ -> false + member x.GetHashCode((flags,_,typ)) = + // Ignoring the ranges - that's OK. + flagsEq.GetHashCode flags + + (match stripTyEqns g typ with + | TType_app(tcref,[]) -> hash tcref.LogicalName + | _ -> 0) }) + + + let hashFlags0 = + { new System.Collections.Generic.IEqualityComparer<_> with + member x.GetHashCode((filter: string option, ad: AccessorDomain, _allowMultiIntfInst1)) = hash filter + AccessorDomain.CustomGetHashCode ad + member x.Equals((filter1, ad1, allowMultiIntfInst1), (filter2,ad2, allowMultiIntfInst2)) = + (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) && allowMultiIntfInst1 = allowMultiIntfInst2 } + + let hashFlags1 = + { new System.Collections.Generic.IEqualityComparer<_> with + member x.GetHashCode((filter: string option,ad: AccessorDomain)) = hash filter + AccessorDomain.CustomGetHashCode ad + member x.Equals((filter1,ad1), (filter2,ad2)) = (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) } + + let hashFlags2 = + { new System.Collections.Generic.IEqualityComparer<_> with + member x.GetHashCode((nm: string,ad: AccessorDomain)) = hash nm + AccessorDomain.CustomGetHashCode ad + member x.Equals((nm1,ad1), (nm2,ad2)) = (nm1 = nm2) && AccessorDomain.CustomEquals(g,ad1,ad2) } + + let methodInfoCache = MakeInfoCache GetIntrinsicMethodSetsUncached hashFlags0 + let propertyInfoCache = MakeInfoCache GetIntrinsicPropertySetsUncached hashFlags0 + let recdOrClassFieldInfoCache = MakeInfoCache GetIntrinsicRecdOrClassFieldInfosUncached hashFlags1 + let ilFieldInfoCache = MakeInfoCache GetIntrinsicILFieldInfosUncached hashFlags1 + let eventInfoCache = MakeInfoCache GetIntrinsicEventInfosUncached hashFlags1 + let namedItemsCache = MakeInfoCache GetIntrinsicNamedItemsUncached hashFlags2 + + let entireTypeHierarchyCache = MakeInfoCache GetEntireTypeHierachyUncached HashIdentity.Structural + let primaryTypeHierarchyCache = MakeInfoCache GetPrimaryTypeHierachyUncached HashIdentity.Structural + + member x.g = g + member x.amap = amap + + /// Read the raw method sets of a type, including inherited ones. Cache the result for monomorphic types + member x.GetRawIntrinsicMethodSetsOfType (optFilter,ad,allowMultiIntfInst,m,typ) = + methodInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,typ)) + + /// Read the raw property sets of a type, including inherited ones. Cache the result for monomorphic types + member x.GetRawIntrinsicPropertySetsOfType (optFilter,ad,allowMultiIntfInst,m,typ) = + propertyInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,typ)) + + /// Read the record or class fields of a type, including inherited ones. Cache the result for monomorphic types. + member x.GetRecordOrClassFieldsOfType (optFilter,ad,m,typ) = + recdOrClassFieldInfoCache.Apply(((optFilter,ad),m,typ)) + + /// Read the IL fields of a type, including inherited ones. Cache the result for monomorphic types. + member x.GetILFieldInfosOfType (optFilter,ad,m,typ) = + ilFieldInfoCache.Apply(((optFilter,ad),m,typ)) + + member x.GetImmediateIntrinsicEventsOfType (optFilter,ad,m,typ) = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ + + /// Read the events of a type, including inherited ones. Cache the result for monomorphic types. + member x.GetEventInfosOfType (optFilter,ad,m,typ) = + eventInfoCache.Apply(((optFilter,ad),m,typ)) + + /// Try and find a record or class field for a type. + member x.TryFindRecdOrClassFieldInfoOfType (nm,m,typ) = + match recdOrClassFieldInfoCache.Apply((Some nm,AccessibleFromSomewhere),m,typ) with + | [] -> None + | [single] -> Some single + | flds -> + // multiple fields with the same name can come from different classes, + // so filter them by the given type name + match tryDestAppTy g typ with + | None -> None + | Some tcref -> + match flds |> List.filter (fun rfinfo -> tyconRefEq g tcref rfinfo.TyconRef) with + | [] -> None + | [single] -> Some single + | _ -> failwith "unexpected multiple fields with same name" // Because it should have been already reported as duplicate fields + + /// Try and find an item with the given name in a type. + member x.TryFindNamedItemOfType (nm,ad,m,typ) = + namedItemsCache.Apply(((nm,ad),m,typ)) + + /// Get the super-types of a type, including interface types. + member x.GetEntireTypeHierachy (allowMultiIntfInst,m,typ) = + entireTypeHierarchyCache.Apply((allowMultiIntfInst,m,typ)) + + /// Get the super-types of a type, excluding interface types. + member x.GetPrimaryTypeHierachy (allowMultiIntfInst,m,typ) = + primaryTypeHierarchyCache.Apply((allowMultiIntfInst,m,typ)) + + +//------------------------------------------------------------------------- +// Constructor infos + + +/// Get the declared constructors of any F# type +let GetIntrinsicConstructorInfosOfType (infoReader:InfoReader) m ty = + let g = infoReader.g + let amap = infoReader.amap + if isAppTy g ty then + match metadataOfTy g ty with +#if EXTENSIONTYPING + | ProvidedTypeMetadata info -> + let st = info.ProvidedType + [ for ci in st.PApplyArray((fun st -> st.GetConstructors()), "GetConstructors", m) do + yield ProvidedMeth(amap,ci.Coerce(m),None,m) ] +#endif + | ILTypeMetadata _ -> + let tinfo = ILTypeInfo.FromType g ty + tinfo.RawMetadata.Methods.FindByName ".ctor" + |> List.filter (fun md -> match md.mdKind with MethodKind.Ctor -> true | _ -> false) + |> List.map (fun mdef -> MethInfo.CreateILMeth (amap, m, ty, mdef)) + + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> + let tcref = tcrefOfAppTy g ty + tcref.MembersOfFSharpTyconByName + |> NameMultiMap.find ".ctor" + |> List.choose(fun vref -> + match vref.MemberInfo with + | Some membInfo when (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) -> Some vref + | _ -> None) + |> List.map (fun x -> FSMeth(g,ty,x,None)) + else [] + +//------------------------------------------------------------------------- +// Collecting methods and properties taking into account hiding rules in the hierarchy + + +/// Indicates if we prefer overrides or abstract slots. +type FindMemberFlag = + /// Prefer items toward the top of the hierarchy, which we do if the items are virtual + /// but not when resolving base calls. + | IgnoreOverrides + /// Get overrides instead of abstract slots when measuring whether a class/interface implements all its required slots. + | PreferOverrides + +/// The input list is sorted from most-derived to least-derived type, so any System.Object methods +/// are at the end of the list. Return a filtered list where prior/subsequent members matching by name and +/// that are in the same equivalence class have been removed. We keep a name-indexed table to +/// be more efficient when we check to see if we've already seen a particular named method. +type private IndexedList<'T>(itemLists: 'T list list, itemsByName: NameMultiMap<'T>) = + + /// Get the item sets + member x.Items = itemLists + + /// Get the items with a particular name + member x.ItemsWithName(nm) = NameMultiMap.find nm itemsByName + + /// Add new items, extracting the names using the given function. + member x.AddItems(items,nmf) = IndexedList<'T>(items::itemLists,List.foldBack (fun x acc -> NameMultiMap.add (nmf x) x acc) items itemsByName ) + + /// Get an empty set of items + static member Empty = IndexedList<'T>([],NameMultiMap.empty) + + /// Filter a set of new items to add according to the content of the list. Only keep an item + /// if it passes 'keepTest' for all matching items already in the list. + member x.FilterNewItems keepTest nmf itemsToAdd = + // Have we already seen an item with the same name and that is in the same equivalence class? + // If so, ignore this one. Note we can check against the original incoming 'ilist' because we are assuming that + // none the elements of 'itemsToAdd' are equivalent. + itemsToAdd |> List.filter (fun item -> List.forall (keepTest item) (x.ItemsWithName(nmf item))) + +/// Add all the items to the IndexedList, preferring the ones in the super-types. This is used to hide methods +/// in super classes and/or hide overrides of methods in subclasses. +/// +/// Assume no items in 'items' are equivalent according to 'equivTest'. This is valid because each step in a +/// .NET class hierarchy introduces a consistent set of methods, none of which hide each other within the +/// given set. This is an important optimization because it means we don't have filter for equivalence between the +/// large overload sets introduced by methods like System.WriteLine. +/// +/// Assume items can be given names by 'nmf', where two items with different names are +/// not equivalent. + +let private FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf keepTest itemLists = + let rec loop itemLists = + match itemLists with + | [] -> IndexedList.Empty + | items :: itemsInSuperTypes -> + let ilist = loop itemsInSuperTypes + let itemsToAdd = ilist.FilterNewItems keepTest nmf items + ilist.AddItems(itemsToAdd,nmf) + (loop itemLists).Items + +/// Add all the items to the IndexedList, preferring the ones in the sub-types. +let private FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf keepTest itemLists = + let rec loop itemLists (indexedItemsInSubTypes:IndexedList<_>) = + match itemLists with + | [] -> List.rev indexedItemsInSubTypes.Items + | items :: itemsInSuperTypes -> + let itemsToAdd = items |> List.filter (fun item -> keepTest item (indexedItemsInSubTypes.ItemsWithName(nmf item))) + let ilist = indexedItemsInSubTypes.AddItems(itemsToAdd,nmf) + loop itemsInSuperTypes ilist + + loop itemLists IndexedList.Empty + +let private ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes nmf equivTest itemLists = + FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 items -> not (items |> List.exists (fun item2 -> equivTest item1 item2))) itemLists + +/// Filter the overrides of methods or properties, either keeping the overrides or keeping the dispatch slots. +let private FilterOverrides findFlag (isVirt:'a->bool,isNewSlot,isDefiniteOverride,isFinal,equivSigs,nmf:'a->string) items = + let equivVirts x y = isVirt x && isVirt y && equivSigs x y + + match findFlag with + | PreferOverrides -> + items + // For each F#-declared override, get rid of any equivalent abstract member in the same type + // This is because F# abstract members with default overrides give rise to two members with the + // same logical signature in the same type, e.g. + // type ClassType1() = + // abstract VirtualMethod1: string -> int + // default x.VirtualMethod1(s) = 3 + + |> List.map (fun items -> + let definiteOverrides = items |> List.filter isDefiniteOverride + items |> List.filter (fun item -> (isDefiniteOverride item || not (List.exists (equivVirts item) definiteOverrides)))) + + // only keep virtuals that are not signature-equivalent to virtuals in subtypes + |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes nmf equivVirts + | IgnoreOverrides -> + let equivNewSlots x y = isNewSlot x && isNewSlot y && equivSigs x y + items + // Remove any F#-declared overrides. THese may occur in the same type as the abstract member (unlike with .NET metadata) + // Include any 'newslot' declared methods. + |> List.map (List.filter (fun x -> not (isDefiniteOverride x))) + + // Remove any virtuals that are signature-equivalent to virtuals in subtypes, except for newslots + // That is, keep if it's + /// (a) not virtual + // (b) is a new slot or + // (c) not equivalent + // We keep virtual finals around for error detection later on + |> FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf (fun newItem priorItem -> + (isVirt newItem && isFinal newItem) || not (isVirt newItem) || isNewSlot newItem || not (equivVirts newItem priorItem) ) + + // Remove any abstract slots in supertypes that are (a) hidden by another newslot and (b) implemented + // We leave unimplemented ones around to give errors, e.g. for + // [] + // type PA() = + // abstract M : int -> unit + // + // [] + // type PB<'a>() = + // inherit PA() + // abstract M : 'a -> unit + // + // [] + // type PC() = + // inherit PB() + // // Here, PA.M and PB.M have the same signature, so PA.M is unimplementable. + // // REVIEW: in future we may give a friendly error at this point + // + // type PD() = + // inherit PC() + // override this.M(x:int) = () + + |> FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 superTypeItems -> + not (isNewSlot item1 && + superTypeItems |> List.exists (equivNewSlots item1) && + superTypeItems |> List.exists (fun item2 -> isDefiniteOverride item1 && equivVirts item1 item2))) + + +/// Filter the overrides of methods, either keeping the overrides or keeping the dispatch slots. +let private FilterOverridesOfMethInfos findFlag g amap m minfos = + FilterOverrides findFlag ((fun (minfo:MethInfo) -> minfo.IsVirtual),(fun minfo -> minfo.IsNewSlot),(fun minfo -> minfo.IsDefiniteFSharpOverride),(fun minfo -> minfo.IsFinal),MethInfosEquivByNameAndSig EraseNone true g amap m,(fun minfo -> minfo.LogicalName)) minfos + +/// Filter the overrides of properties, either keeping the overrides or keeping the dispatch slots. +let private FilterOverridesOfPropInfos findFlag g amap m props = + FilterOverrides findFlag ((fun (pinfo:PropInfo) -> pinfo.IsVirtualProperty),(fun pinfo -> pinfo.IsNewSlot),(fun pinfo -> pinfo.IsDefiniteFSharpOverride),(fun _ -> false),PropInfosEquivByNameAndSig EraseNone g amap m, (fun pinfo -> pinfo.PropertyName)) props + +/// Exclude methods from super types which have the same signature as a method in a more specific type. +let ExcludeHiddenOfMethInfos g amap m (minfos:MethInfo list list) = + minfos + |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes + (fun minfo -> minfo.LogicalName) + (fun m1 m2 -> + // only hide those truly from super classes + not (tyconRefEq g (tcrefOfAppTy g m1.EnclosingType) (tcrefOfAppTy g m2.EnclosingType)) && + MethInfosEquivByNameAndPartialSig EraseNone true g amap m m1 m2) + + |> List.concat + +/// Exclude properties from super types which have the same name as a property in a more specific type. +let ExcludeHiddenOfPropInfos g amap m pinfos = + pinfos + |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo:PropInfo) -> pinfo.PropertyName) (PropInfosEquivByNameAndPartialSig EraseNone g amap m) + |> List.concat + +/// Get the sets of intrinsic methods in the hierarchy (not including extension methods) +let GetIntrinsicMethInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m typ = + infoReader.GetRawIntrinsicMethodSetsOfType(optFilter,ad,allowMultiIntfInst,m,typ) + |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m + +/// Get the sets intrinsic properties in the hierarchy (not including extension properties) +let GetIntrinsicPropInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m typ = + infoReader.GetRawIntrinsicPropertySetsOfType(optFilter,ad,allowMultiIntfInst,m,typ) + |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m + +/// Get the flattened list of intrinsic methods in the hierarchy +let GetIntrinsicMethInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ = + GetIntrinsicMethInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ |> List.concat + +/// Get the flattened list of intrinsic properties in the hierarchy +let GetIntrinsicPropInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ = + GetIntrinsicPropInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ |> List.concat + +/// Perform type-directed name resolution of a particular named member in an F# type +let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm,ad) findFlag m typ = + match infoReader.TryFindNamedItemOfType(nm, ad, m, typ) with + | Some item -> + match item with + | PropertyItem psets -> Some(PropertyItem (psets |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m)) + | MethodItem msets -> Some(MethodItem (msets |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m)) + | _ -> Some(item) + | None -> None + +/// Try to detect the existence of a method on a type. +/// Used for +/// -- getting the GetEnumerator, get_Current, MoveNext methods for enumerable types +/// -- getting the Dispose method when resolving the 'use' construct +/// -- getting the various methods used to desugar the computation expression syntax +let TryFindIntrinsicMethInfo infoReader m ad nm ty = + GetIntrinsicMethInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty + +/// Try to find a particular named property on a type. Only used to ensure that local 'let' definitions and property names +/// are distinct, a somewhat adhoc check in tc.fs. +let TryFindPropInfo infoReader m ad nm ty = + GetIntrinsicPropInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty + +//------------------------------------------------------------------------- +// Helpers related to delegates and events - these use method searching hence are in this file +//------------------------------------------------------------------------- + +/// The Invoke MethInfo, the function argument types, the function return type +/// and the overall F# function type for the function type associated with a .NET delegate type +[] +type SigOfFunctionForDelegate = SigOfFunctionForDelegate of MethInfo * TType list * TType * TType + +/// Given a delegate type work out the minfo, argument types, return type +/// and F# function type by looking at the Invoke signature of the delegate. +let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = + let g = infoReader.g + let amap = infoReader.amap + let invokeMethInfo = + match GetIntrinsicMethInfosOfType infoReader (Some "Invoke",ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m delty with + | [h] -> h + | [] -> error(Error(FSComp.SR.noInvokeMethodsFound (),m)) + | h :: _ -> warning(InternalError(FSComp.SR.moreThanOneInvokeMethodFound (),m)); h + + let minst = [] // a delegate's Invoke method is never generic + let compiledViewOfDelArgTys = + match invokeMethInfo.GetParamTypes(amap, m, minst) with + | [args] -> args + | _ -> error(Error(FSComp.SR.delegatesNotAllowedToHaveCurriedSignatures (),m)) + let fsharpViewOfDelArgTys = + match compiledViewOfDelArgTys with + | [] -> [g.unit_ty] + | _ -> compiledViewOfDelArgTys + let delRetTy = invokeMethInfo.GetFSharpReturnTy(amap, m, minst) + CheckMethInfoAttributes g m None invokeMethInfo |> CommitOperationResult + let fty = mkIteratedFunTy fsharpViewOfDelArgTys delRetTy + SigOfFunctionForDelegate(invokeMethInfo,compiledViewOfDelArgTys,delRetTy,fty) + +/// Try and interpret a delegate type as a "standard" .NET delegate type associated with an event, with a "sender" parameter. +let TryDestStandardDelegateTyp (infoReader:InfoReader) m ad delTy = + let g = infoReader.g + let (SigOfFunctionForDelegate(_,compiledViewOfDelArgTys,delRetTy,_)) = GetSigOfFunctionForDelegate infoReader delTy m ad + match compiledViewOfDelArgTys with + | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkTupledTy g argTys,delRetTy) + | _ -> None + + +/// Indicates if an event info is associated with a delegate type that is a "standard" .NET delegate type +/// with a sender parameter. +// +/// In the F# design, we take advantage of the following idiom to simplify away the bogus "object" parameter of the +/// of the "Add" methods associated with events. If you want to access it you +/// can use AddHandler instead. + +/// The .NET Framework guidelines indicate that the delegate type used for +/// an event should take two parameters, an "object source" parameter +/// indicating the source of the event, and an "e" parameter that +/// encapsulates any additional information about the event. The type of +/// the "e" parameter should derive from the EventArgs class. For events +/// that do not use any additional information, the .NET Framework has +/// already defined an appropriate delegate type: EventHandler. +/// (from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkEventsTutorial.asp) +let IsStandardEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = + let dty = einfo.GetDelegateType(infoReader.amap,m) + match TryDestStandardDelegateTyp infoReader m ad dty with + | Some _ -> true + | None -> false + +/// Get the (perhaps tupled) argument type accepted by an event +let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = + let amap = infoReader.amap + let dty = einfo.GetDelegateType(amap,m) + match TryDestStandardDelegateTyp infoReader m ad dty with + | Some(argtys,_) -> argtys + | None -> error(nonStandardEventError einfo.EventName m) + +/// Get the type of the event when looked at as if it is a property +/// Used when displaying the property in Intellisense +let PropTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = + let g = infoReader.g + let amap = infoReader.amap + let delTy = einfo.GetDelegateType(amap,m) + let argsTy = ArgsTypOfEventInfo infoReader m ad einfo + mkIEventType g delTy argsTy + + diff --git a/src/fsharp/LowerCallsAndSeqs.fs b/src/fsharp/LowerCallsAndSeqs.fs index 9d6ea75debf..571997f761f 100644 --- a/src/fsharp/LowerCallsAndSeqs.fs +++ b/src/fsharp/LowerCallsAndSeqs.fs @@ -4,21 +4,24 @@ module internal Microsoft.FSharp.Compiler.LowerCallsAndSeqs open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Infos -open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.InfoReader +open Microsoft.FSharp.Compiler.MethodCalls //---------------------------------------------------------------------------- // Eta-expansion of calls to top-level-methods diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs new file mode 100644 index 00000000000..14c41717483 --- /dev/null +++ b/src/fsharp/MethodCalls.fs @@ -0,0 +1,1212 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Logic associated with resolving method calls. +module internal Microsoft.FSharp.Compiler.MethodCalls + +open Internal.Utilities +open System.Text + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler.InfoReader +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.Tastops.DebugPrint +open Microsoft.FSharp.Compiler.TcGlobals +open Microsoft.FSharp.Compiler.TypeRelations + +#if EXTENSIONTYPING +open Microsoft.FSharp.Compiler.ExtensionTyping +#endif + + + +//------------------------------------------------------------------------- +// Sets of methods involved in overload resolution and trait constraint +// satisfaction. +//------------------------------------------------------------------------- + +/// In the following, 'T gets instantiated to: +/// 1. the expression being supplied for an argument +/// 2. "unit", when simply checking for the existence of an overload that satisfies +/// a signature, or when finding the corresponding witness. +/// Note the parametricity helps ensure that overload resolution doesn't depend on the +/// expression on the callside (though it is in some circumstances allowed +/// to depend on some type information inferred syntactically from that +/// expression, e.g. a lambda expression may be converted to a delegate as +/// an adhoc conversion. +/// +/// The bool indicates if named using a '?' +type CallerArg<'T> = + /// CallerArg(ty, range, isOpt, exprInfo) + | CallerArg of TType * range * bool * 'T + member x.Type = (let (CallerArg(ty,_,_,_)) = x in ty) + member x.Range = (let (CallerArg(_,m,_,_)) = x in m) + member x.IsOptional = (let (CallerArg(_,_,isOpt,_)) = x in isOpt) + member x.Expr = (let (CallerArg(_,_,_,expr)) = x in expr) + +/// Represents the information about an argument in the method being called +type CalledArg = + { Position: (int * int) + IsParamArray : bool + OptArgInfo : OptionalArgInfo + CallerInfoInfo : CallerInfoInfo + IsOutArg: bool + ReflArgInfo: ReflectedArgInfo + NameOpt: Ident option + CalledArgumentType : TType } + +let CalledArg(pos,isParamArray,optArgInfo,callerInfoInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = + { Position=pos + IsParamArray=isParamArray + OptArgInfo =optArgInfo + CallerInfoInfo = callerInfoInfo + IsOutArg=isOutArg + ReflArgInfo=reflArgInfo + NameOpt=nameOpt + CalledArgumentType = calledArgTy } + +/// Represents a match between a caller argument and a called argument, arising from either +/// a named argument or an unnamed argument. +type AssignedCalledArg<'T> = + { /// The identifier for a named argument, if any + NamedArgIdOpt : Ident option + /// The called argument in the method + CalledArg: CalledArg + /// The argument on the caller side + CallerArg: CallerArg<'T> } + member x.Position = x.CalledArg.Position + +/// Represents the possibilities for a named-setter argument (a property, field , or a record field setter) +type AssignedItemSetterTarget = + | AssignedPropSetter of PropInfo * MethInfo * TypeInst (* the MethInfo is a non-indexer setter property *) + | AssignedILFieldSetter of ILFieldInfo + | AssignedRecdFieldSetter of RecdFieldInfo + +/// Represents the resolution of a caller argument as a named-setter argument +type AssignedItemSetter<'T> = AssignedItemSetter of Ident * AssignedItemSetterTarget * CallerArg<'T> + +type CallerNamedArg<'T> = + | CallerNamedArg of Ident * CallerArg<'T> + member x.Ident = (let (CallerNamedArg(id,_)) = x in id) + member x.Name = x.Ident.idText + member x.CallerArg = (let (CallerNamedArg(_,a)) = x in a) + +//------------------------------------------------------------------------- +// Callsite conversions +//------------------------------------------------------------------------- + +// F# supports three adhoc conversions at method callsites (note C# supports more, though ones +// such as implicit conversions interact badly with type inference). +// +// 1. The use of "(fun x y -> ...)" when a delegate it expected. This is not part of +// the ":>" coercion relationship or inference constraint problem as +// such, but is a special rule applied only to method arguments. +// +// The function AdjustCalledArgType detects this case based on types and needs to know that the type being applied +// is a function type. +// +// 2. The use of "(fun x y -> ...)" when Expression it expected. This is similar to above. +// +// 3. Two ways to pass a value where a byref is expected. The first (default) +// is to use a reference cell, and the interior address is taken automatically +// The second is an explicit use of the "address-of" operator "&e". Here we detect the second case, +// and record the presence of the sytnax "&e" in the pre-inferred actual type for the method argument. +// The function AdjustCalledArgType detects this and refuses to apply the default byref-to-ref transformation. +// +// The function AdjustCalledArgType also adjusts for optional arguments. +let AdjustCalledArgType (infoReader:InfoReader) isConstraint (calledArg: CalledArg) (callerArg: CallerArg<_>) = + let g = infoReader.g + // #424218 - when overload resolution is part of constraint solving - do not perform type-directed conversions + let calledArgTy = calledArg.CalledArgumentType + let callerArgTy = callerArg.Type + let m = callerArg.Range + if isConstraint then calledArgTy else + // If the called method argument is a byref type, then the caller may provide a byref or ref + if isByrefTy g calledArgTy then + if isByrefTy g callerArgTy then + calledArgTy + else + mkRefCellTy g (destByrefTy g calledArgTy) + else + // If the called method argument is a delegate type, then the caller may provide a function + let calledArgTy = + let adjustDelegateTy calledTy = + let (SigOfFunctionForDelegate(_,delArgTys,_,fty)) = GetSigOfFunctionForDelegate infoReader calledTy m AccessibleFromSomeFSharpCode + let delArgTys = (if isNil delArgTys then [g.unit_ty] else delArgTys) + if (fst (stripFunTy g callerArgTy)).Length = delArgTys.Length + then fty + else calledArgTy + + if isDelegateTy g calledArgTy && isFunTy g callerArgTy then + adjustDelegateTy calledArgTy + + elif isLinqExpressionTy g calledArgTy && isFunTy g callerArgTy then + let origArgTy = calledArgTy + let calledArgTy = destLinqExpressionTy g calledArgTy + if isDelegateTy g calledArgTy then + adjustDelegateTy calledArgTy + else + // BUG 435170: called arg is Expr<'t> where 't is not delegate - such conversion is not legal -> return original type + origArgTy + + elif calledArg.ReflArgInfo.AutoQuote && isQuotedExprTy g calledArgTy && not (isQuotedExprTy g callerArgTy) then + destQuotedExprTy g calledArgTy + + else calledArgTy + + // Adjust the called argument type to take into account whether the caller's argument is M(?arg=Some(3)) or M(arg=1) + // If the called method argument is optional with type Option, then the caller may provide a T, unless their argument is propogating-optional (i.e. isOptCallerArg) + let calledArgTy = + match calledArg.OptArgInfo with + | NotOptional -> calledArgTy + | CalleeSide when not callerArg.IsOptional && isOptionTy g calledArgTy -> destOptionTy g calledArgTy + | CalleeSide | CallerSide _ -> calledArgTy + calledArgTy + + +//------------------------------------------------------------------------- +// CalledMeth +//------------------------------------------------------------------------- + +type CalledMethArgSet<'T> = + { /// The called arguments corresponding to "unnamed" arguments + UnnamedCalledArgs : CalledArg list + /// Any unnamed caller arguments not otherwise assigned + UnnamedCallerArgs : CallerArg<'T> list + /// The called "ParamArray" argument, if any + ParamArrayCalledArgOpt : CalledArg option + /// Any unnamed caller arguments assigned to a "param array" argument + ParamArrayCallerArgs : CallerArg<'T> list + /// Named args + AssignedNamedArgs: AssignedCalledArg<'T> list } + member x.NumUnnamedCallerArgs = x.UnnamedCallerArgs.Length + member x.NumAssignedNamedArgs = x.AssignedNamedArgs.Length + member x.NumUnnamedCalledArgs = x.UnnamedCalledArgs.Length + + +let MakeCalledArgs amap m (minfo:MethInfo) minst = + // Mark up the arguments with their position, so we can sort them back into order later + let paramDatas = minfo.GetParamDatas(amap, m, minst) + paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,callerInfoFlags,nmOpt,reflArgInfo,typeOfCalledArg)) -> + { Position=(i,j) + IsParamArray=isParamArrayArg + OptArgInfo=optArgInfo + CallerInfoInfo = callerInfoFlags + IsOutArg=isOutArg + ReflArgInfo=reflArgInfo + NameOpt=nmOpt + CalledArgumentType=typeOfCalledArg }) + +/// Represents the syntactic matching between a caller of a method and the called method. +/// +/// The constructor takes all the information about the caller and called side of a method, match up named arguments, property setters etc., +/// and returns a CalledMeth object for further analysis. +type CalledMeth<'T> + (infoReader:InfoReader, + nameEnv: NameResolutionEnv option, + isCheckingAttributeCall, + freshenMethInfo,// a function to help generate fresh type variables the property setters methods in generic classes + m, + ad, // the access domain of the place where the call is taking place + minfo:MethInfo, // the method we're attempting to call + calledTyArgs, // the 'called type arguments', i.e. the fresh generic instantiation of the method we're attempting to call + callerTyArgs: TType list, // the 'caller type arguments', i.e. user-given generic instantiation of the method we're attempting to call + pinfoOpt: PropInfo option, // the property related to the method we're attempting to call, if any + callerObjArgTys: TType list, // the types of the actual object argument, if any + curriedCallerArgs: (CallerArg<'T> list * CallerNamedArg<'T> list) list, // the data about any arguments supplied by the caller + allowParamArgs:bool, // do we allow the use of a param args method in its "expanded" form? + allowOutAndOptArgs: bool, // do we allow the use of the transformation that converts out arguments as tuple returns? + tyargsOpt : TType option) // method parameters + = + let g = infoReader.g + let methodRetTy = minfo.GetFSharpReturnTy(infoReader.amap, m, calledTyArgs) + + let fullCurriedCalledArgs = MakeCalledArgs infoReader.amap m minfo calledTyArgs + do assert (fullCurriedCalledArgs.Length = fullCurriedCalledArgs.Length) + + let argSetInfos = + (curriedCallerArgs, fullCurriedCalledArgs) ||> List.map2 (fun (unnamedCallerArgs,namedCallerArgs) fullCalledArgs -> + // Find the arguments not given by name + let unnamedCalledArgs = + fullCalledArgs |> List.filter (fun calledArg -> + match calledArg.NameOpt with + | Some nm -> namedCallerArgs |> List.forall (fun (CallerNamedArg(nm2,_e)) -> nm.idText <> nm2.idText) + | None -> true) + + // See if any of them are 'out' arguments being returned as part of a return tuple + let unnamedCalledArgs, unnamedCalledOptArgs, unnamedCalledOutArgs = + let nUnnamedCallerArgs = unnamedCallerArgs.Length + if allowOutAndOptArgs && nUnnamedCallerArgs < unnamedCalledArgs.Length then + let unnamedCalledArgsTrimmed,unnamedCalledOptOrOutArgs = List.chop nUnnamedCallerArgs unnamedCalledArgs + + // Check if all optional/out arguments are byref-out args + if unnamedCalledOptOrOutArgs |> List.forall (fun x -> x.IsOutArg && isByrefTy g x.CalledArgumentType) then + unnamedCalledArgsTrimmed,[],unnamedCalledOptOrOutArgs + // Check if all optional/out arguments are optional args + elif unnamedCalledOptOrOutArgs |> List.forall (fun x -> x.OptArgInfo.IsOptional) then + unnamedCalledArgsTrimmed,unnamedCalledOptOrOutArgs,[] + // Otherwise drop them on the floor + else + unnamedCalledArgs,[],[] + else + unnamedCalledArgs,[],[] + + let (unnamedCallerArgs,paramArrayCallerArgs),unnamedCalledArgs,paramArrayCalledArgOpt = + let minArgs = unnamedCalledArgs.Length - 1 + let supportsParamArgs = + allowParamArgs && + minArgs >= 0 && + unnamedCalledArgs |> List.last |> (fun calledArg -> calledArg.IsParamArray && isArray1DTy g calledArg.CalledArgumentType) + + if supportsParamArgs && unnamedCallerArgs.Length >= minArgs then + let a,b = List.frontAndBack unnamedCalledArgs + List.chop minArgs unnamedCallerArgs, a, Some(b) + else + (unnamedCallerArgs, []),unnamedCalledArgs, None + + let assignedNamedArgs = + fullCalledArgs |> List.choose (fun calledArg -> + match calledArg.NameOpt with + | Some nm -> + namedCallerArgs |> List.tryPick (fun (CallerNamedArg(nm2,callerArg)) -> + if nm.idText = nm2.idText then Some { NamedArgIdOpt = Some nm2; CallerArg=callerArg; CalledArg=calledArg } + else None) + | _ -> None) + + let unassignedNamedItem = + namedCallerArgs |> List.filter (fun (CallerNamedArg(nm,_e)) -> + fullCalledArgs |> List.forall (fun calledArg -> + match calledArg.NameOpt with + | Some nm2 -> nm.idText <> nm2.idText + | None -> true)) + + let attributeAssignedNamedItems,unassignedNamedItem = + if isCheckingAttributeCall then + // the assignment of names to properties is substantially for attribute specifications + // permits bindings of names to non-mutable fields and properties, so we do that using the old + // reliable code for this later on. + unassignedNamedItem,[] + else + [],unassignedNamedItem + + let assignedNamedProps,unassignedNamedItem = + let returnedObjTy = if minfo.IsConstructor then minfo.EnclosingType else methodRetTy + unassignedNamedItem |> List.splitChoose (fun (CallerNamedArg(id,e) as arg) -> + let nm = id.idText + let pinfos = GetIntrinsicPropInfoSetsOfType infoReader (Some(nm),ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides id.idRange returnedObjTy + let pinfos = pinfos |> ExcludeHiddenOfPropInfos g infoReader.amap m + match pinfos with + | [pinfo] when pinfo.HasSetter && not pinfo.IsIndexer -> + let pminfo = pinfo.SetterMethod + let pminst = freshenMethInfo m pminfo + Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e)) + | _ -> + let epinfos = + match nameEnv with + | Some(ne) -> ExtensionPropInfosOfTypeInScope infoReader ne (Some(nm), ad) m returnedObjTy + | _ -> [] + match epinfos with + | [pinfo] when pinfo.HasSetter && not pinfo.IsIndexer -> + let pminfo = pinfo.SetterMethod + let pminst = match minfo with + | MethInfo.FSMeth(_,TType.TType_app(_,types),_,_) -> types + | _ -> freshenMethInfo m pminfo + + let pminst = match tyargsOpt with + | Some(TType.TType_app(_, types)) -> types + | _ -> pminst + Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e)) + | _ -> + match infoReader.GetILFieldInfosOfType(Some(nm),ad,m,returnedObjTy) with + | finfo :: _ -> + Choice1Of2(AssignedItemSetter(id,AssignedILFieldSetter(finfo), e)) + | _ -> + match infoReader.TryFindRecdOrClassFieldInfoOfType(nm,m,returnedObjTy) with + | Some rfinfo -> + Choice1Of2(AssignedItemSetter(id,AssignedRecdFieldSetter(rfinfo), e)) + | None -> + Choice2Of2(arg)) + + let names = namedCallerArgs |> List.map (fun (CallerNamedArg(nm,_)) -> nm.idText) + + if (List.noRepeats String.order names).Length <> namedCallerArgs.Length then + errorR(Error(FSComp.SR.typrelNamedArgumentHasBeenAssignedMoreThenOnce(),m)) + + let argSet = { UnnamedCalledArgs=unnamedCalledArgs; UnnamedCallerArgs=unnamedCallerArgs; ParamArrayCalledArgOpt=paramArrayCalledArgOpt; ParamArrayCallerArgs=paramArrayCallerArgs; AssignedNamedArgs=assignedNamedArgs } + + (argSet,assignedNamedProps,unassignedNamedItem,attributeAssignedNamedItems,unnamedCalledOptArgs,unnamedCalledOutArgs)) + + let argSets = argSetInfos |> List.map (fun (x,_,_,_,_,_) -> x) + let assignedNamedProps = argSetInfos |> List.collect (fun (_,x,_,_,_,_) -> x) + let unassignedNamedItems = argSetInfos |> List.collect (fun (_,_,x,_,_,_) -> x) + let attributeAssignedNamedItems = argSetInfos |> List.collect (fun (_,_,_,x,_,_) -> x) + let unnamedCalledOptArgs = argSetInfos |> List.collect (fun (_,_,_,_,x,_) -> x) + let unnamedCalledOutArgs = argSetInfos |> List.collect (fun (_,_,_,_,_,x) -> x) + + member x.infoReader = infoReader + member x.amap = infoReader.amap + + /// the method we're attempting to call + member x.Method=minfo + /// the instantiation of the method we're attempting to call + member x.CalledTyArgs=calledTyArgs + /// the formal instantiation of the method we're attempting to call + member x.CallerTyArgs=callerTyArgs + /// The types of the actual object arguments, if any + member x.CallerObjArgTys=callerObjArgTys + /// The argument analysis for each set of curried arguments + member x.ArgSets=argSets + /// return type + member x.ReturnType=methodRetTy + /// named setters + member x.AssignedItemSetters=assignedNamedProps + /// the property related to the method we're attempting to call, if any + member x.AssociatedPropertyInfo=pinfoOpt + /// unassigned args + member x.UnassignedNamedArgs=unassignedNamedItems + /// args assigned to specify values for attribute fields and properties (these are not necessarily "property sets") + member x.AttributeAssignedNamedArgs=attributeAssignedNamedItems + /// unnamed called optional args: pass defaults for these + member x.UnnamedCalledOptArgs=unnamedCalledOptArgs + /// unnamed called out args: return these as part of the return tuple + member x.UnnamedCalledOutArgs=unnamedCalledOutArgs + + static member GetMethod (x:CalledMeth<'T>) = x.Method + + member x.NumArgSets = x.ArgSets.Length + + member x.HasOptArgs = nonNil x.UnnamedCalledOptArgs + member x.HasOutArgs = nonNil x.UnnamedCalledOutArgs + member x.UsesParamArrayConversion = x.ArgSets |> List.exists (fun argSet -> argSet.ParamArrayCalledArgOpt.IsSome) + member x.ParamArrayCalledArgOpt = x.ArgSets |> List.tryPick (fun argSet -> argSet.ParamArrayCalledArgOpt) + member x.ParamArrayCallerArgs = x.ArgSets |> List.tryPick (fun argSet -> if isSome argSet.ParamArrayCalledArgOpt then Some argSet.ParamArrayCallerArgs else None ) + member x.ParamArrayElementType = + assert (x.UsesParamArrayConversion) + x.ParamArrayCalledArgOpt.Value.CalledArgumentType |> destArrayTy x.amap.g + member x.NumAssignedProps = x.AssignedItemSetters.Length + member x.CalledObjArgTys(m) = x.Method.GetObjArgTypes(x.amap, m, x.CalledTyArgs) + member x.NumCalledTyArgs = x.CalledTyArgs.Length + member x.NumCallerTyArgs = x.CallerTyArgs.Length + + member x.AssignsAllNamedArgs = isNil x.UnassignedNamedArgs + + member x.HasCorrectArity = + (x.NumCalledTyArgs = x.NumCallerTyArgs) && + x.ArgSets |> List.forall (fun argSet -> argSet.NumUnnamedCalledArgs = argSet.NumUnnamedCallerArgs) + + member x.HasCorrectGenericArity = + (x.NumCalledTyArgs = x.NumCallerTyArgs) + + member x.IsAccessible(m,ad) = + IsMethInfoAccessible x.amap m ad x.Method + + member x.HasCorrectObjArgs(m) = + x.CalledObjArgTys(m).Length = x.CallerObjArgTys.Length + + member x.IsCandidate(m,ad) = + x.IsAccessible(m,ad) && + x.HasCorrectArity && + x.HasCorrectObjArgs(m) && + x.AssignsAllNamedArgs + + member x.AssignedUnnamedArgs = + // We use Seq.map2 to tolerate there being mismatched caller/called args + x.ArgSets |> List.map (fun argSet -> + (argSet.UnnamedCalledArgs, argSet.UnnamedCallerArgs) ||> Seq.map2 (fun calledArg callerArg -> + { NamedArgIdOpt=None; CalledArg=calledArg; CallerArg=callerArg }) |> Seq.toList) + + member x.AssignedNamedArgs = + x.ArgSets |> List.map (fun argSet -> argSet.AssignedNamedArgs) + + member x.AllUnnamedCalledArgs = x.ArgSets |> List.collect (fun x -> x.UnnamedCalledArgs) + member x.TotalNumUnnamedCalledArgs = x.ArgSets |> List.sumBy (fun x -> x.NumUnnamedCalledArgs) + member x.TotalNumUnnamedCallerArgs = x.ArgSets |> List.sumBy (fun x -> x.NumUnnamedCallerArgs) + member x.TotalNumAssignedNamedArgs = x.ArgSets |> List.sumBy (fun x -> x.NumAssignedNamedArgs) + +let NamesOfCalledArgs (calledArgs: CalledArg list) = + calledArgs |> List.choose (fun x -> x.NameOpt) + +//------------------------------------------------------------------------- +// Helpers dealing with propagating type information in method overload resolution +//------------------------------------------------------------------------- + +type ArgumentAnalysis = + | NoInfo + | ArgDoesNotMatch + | CallerLambdaHasArgTypes of TType list + | CalledArgMatchesType of TType + +let InferLambdaArgsForLambdaPropagation origRhsExpr = + let rec loop e = + match e with + | SynExpr.Lambda(_,_,_,rest,_) -> 1 + loop rest + | SynExpr.MatchLambda _ -> 1 + | _ -> 0 + loop origRhsExpr + +let ExamineArgumentForLambdaPropagation (infoReader:InfoReader) (arg: AssignedCalledArg) = + let g = infoReader.g + // Find the explicit lambda arguments of the caller. Ignore parentheses. + let argExpr = match arg.CallerArg.Expr with SynExpr.Paren(x,_,_,_) -> x | x -> x + let countOfCallerLambdaArg = InferLambdaArgsForLambdaPropagation argExpr + // Adjust for Expression<_>, Func<_,_>, ... + let adjustedCalledArgTy = AdjustCalledArgType infoReader false arg.CalledArg arg.CallerArg + if countOfCallerLambdaArg > 0 then + // Decompose the explicit function type of the target + let calledLambdaArgTys,_calledLambdaRetTy = Tastops.stripFunTy g adjustedCalledArgTy + if calledLambdaArgTys.Length >= countOfCallerLambdaArg then + // success + CallerLambdaHasArgTypes calledLambdaArgTys + elif isDelegateTy g (if isLinqExpressionTy g adjustedCalledArgTy then destLinqExpressionTy g adjustedCalledArgTy else adjustedCalledArgTy) then + ArgDoesNotMatch // delegate arity mismatch + else + NoInfo // not a function type on the called side - no information + else CalledArgMatchesType(adjustedCalledArgTy) // not a lambda on the caller side - push information from caller to called + +let ExamineMethodForLambdaPropagation(x:CalledMeth) = + let unnamedInfo = x.AssignedUnnamedArgs |> List.mapSquared (ExamineArgumentForLambdaPropagation x.infoReader) + let namedInfo = x.AssignedNamedArgs |> List.mapSquared (fun arg -> (arg.NamedArgIdOpt.Value, ExamineArgumentForLambdaPropagation x.infoReader arg)) + if unnamedInfo |> List.existsSquared (function CallerLambdaHasArgTypes _ -> true | _ -> false) || + namedInfo |> List.existsSquared (function (_,CallerLambdaHasArgTypes _) -> true | _ -> false) then + Some (unnamedInfo, namedInfo) + else + None + +//------------------------------------------------------------------------- +// Additional helpers for building method calls and doing TAST generation +//------------------------------------------------------------------------- + +/// Is this a 'base' call (in the sense of C#) +let IsBaseCall objArgs = + match objArgs with + | [Expr.Val(v,_,_)] when v.BaseOrThisInfo = BaseVal -> true + | _ -> false + +/// Compute whether we insert a 'coerce' on the 'this' pointer for an object model call +/// For example, when calling an interface method on a struct, or a method on a constrained +/// variable type. +let ComputeConstrainedCallInfo g amap m (objArgs,minfo:MethInfo) = + match objArgs with + | [objArgExpr] when not minfo.IsExtensionMember -> + let methObjTy = minfo.EnclosingType + let objArgTy = tyOfExpr g objArgExpr + if TypeDefinitelySubsumesTypeNoCoercion 0 g amap m methObjTy objArgTy + // Constrained calls to class types can only ever be needed for the three class types that + // are base types of value types + || (isClassTy g methObjTy && + (not (typeEquiv g methObjTy g.system_Object_typ || + typeEquiv g methObjTy g.system_Value_typ || + typeEquiv g methObjTy g.system_Enum_typ))) then + None + else + // The object argument is a value type or variable type and the target method is an interface or System.Object + // type. A .NET 2.0 generic constrained call is required + Some objArgTy + | _ -> + None + + +/// Adjust the 'this' pointer before making a call +/// Take the address of a struct, and coerce to an interface/base/constraint type if necessary +let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = + let ccallInfo = ComputeConstrainedCallInfo g amap m (objArgs,minfo) + let mustTakeAddress = + (minfo.IsStruct && not minfo.IsExtensionMember) // don't take the address of a struct when passing to an extension member + || + (match ccallInfo with + | Some _ -> true + | None -> false) + let wrap,objArgs = + match objArgs with + | [objArgExpr] -> + let objArgTy = tyOfExpr g objArgExpr + let wrap,objArgExpr' = mkExprAddrOfExpr g mustTakeAddress (isSome ccallInfo) isMutable objArgExpr None m + + // Extension members and calls to class constraints may need a coercion for their object argument + let objArgExpr' = + if isNone ccallInfo && // minfo.IsExtensionMember && minfo.IsStruct && + not (TypeDefinitelySubsumesTypeNoCoercion 0 g amap m minfo.EnclosingType objArgTy) then + mkCoerceExpr(objArgExpr',minfo.EnclosingType,m,objArgTy) + else + objArgExpr' + + wrap,[objArgExpr'] + + | _ -> + (fun x -> x), objArgs + let e,ety = f ccallInfo objArgs + wrap e,ety + +//------------------------------------------------------------------------- +// Build method calls. +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +// Build calls +//------------------------------------------------------------------------- + + +/// Build an expression node that is a call to a .NET method. +let BuildILMethInfoCall g amap m isProp (minfo:ILMethInfo) valUseFlags minst direct args = + let valu = isStructTy g minfo.ApparentEnclosingType + let ctor = minfo.IsConstructor + if minfo.IsClassConstructor then + error (InternalError (minfo.ILName+": cannot call a class constructor",m)) + let useCallvirt = + not valu && not direct && minfo.IsVirtual + let isProtected = minfo.IsProtectedAccessibility + let ilMethRef = minfo.ILMethodRef + let newobj = ctor && (match valUseFlags with NormalValUse -> true | _ -> false) + let exprTy = if ctor then minfo.ApparentEnclosingType else minfo.GetFSharpReturnTy(amap, m, minst) + let retTy = (if not ctor && (ilMethRef.ReturnType = ILType.Void) then [] else [exprTy]) + let isDllImport = minfo.IsDllImport g + Expr.Op(TOp.ILCall(useCallvirt,isProtected,valu,newobj,valUseFlags,isProp,isDllImport,ilMethRef,minfo.DeclaringTypeInst,minst,retTy),[],args,m), + exprTy + +/// Build a call to the System.Object constructor taking no arguments, +let BuildObjCtorCall g m = + let ilMethRef = (mkILCtorMethSpecForTy(g.ilg.typ_Object,[])).MethodRef + Expr.Op(TOp.ILCall(false,false,false,false,CtorValUsedAsSuperInit,false,true,ilMethRef,[],[],[g.obj_ty]),[],[],m) + + +/// Build a call to an F# method. +/// +/// Consume the arguments in chunks and build applications. This copes with various F# calling signatures +/// all of which ultimately become 'methods'. +/// +/// QUERY: this looks overly complex considering that we are doing a fundamentally simple +/// thing here. +let BuildFSharpMethodApp g m (vref: ValRef) vexp vexprty (args: Exprs) = + let arities = (arityOfVal vref.Deref).AritiesOfArgs + + let args3,(leftover,retTy) = + ((args,vexprty), arities) ||> List.mapFold (fun (args,fty) arity -> + match arity,args with + | (0|1),[] when typeEquiv g (domainOfFunTy g fty) g.unit_ty -> mkUnit g m, (args, rangeOfFunTy g fty) + | 0,(arg::argst)-> + warning(InternalError(sprintf "Unexpected zero arity, args = %s" (Layout.showL (Layout.sepListL (Layout.rightL ";") (List.map exprL args))),m)); + arg, (argst, rangeOfFunTy g fty) + | 1,(arg :: argst) -> arg, (argst, rangeOfFunTy g fty) + | 1,[] -> error(InternalError("expected additional arguments here",m)) + | _ -> + if args.Length < arity then error(InternalError("internal error in getting arguments, n = "+string arity+", #args = "+string args.Length,m)); + let tupargs,argst = List.chop arity args + let tuptys = tupargs |> List.map (tyOfExpr g) + (mkTupled g m tupargs tuptys), + (argst, rangeOfFunTy g fty) ) + if not leftover.IsEmpty then error(InternalError("Unexpected "+string(leftover.Length)+" remaining arguments in method application",m)) + mkApps g ((vexp,vexprty),[],args3,m), + retTy + +/// Build a call to an F# method. +let BuildFSharpMethodCall g m (typ,vref:ValRef) valUseFlags minst args = + let vexp = Expr.Val (vref,valUseFlags,m) + let vexpty = vref.Type + let tpsorig,tau = vref.TypeScheme + let vtinst = argsOfAppTy g typ @ minst + if tpsorig.Length <> vtinst.Length then error(InternalError("BuildFSharpMethodCall: unexpected List.length mismatch",m)) + let expr = mkTyAppExpr m (vexp,vexpty) vtinst + let exprty = instType (mkTyparInst tpsorig vtinst) tau + BuildFSharpMethodApp g m vref expr exprty args + + +/// Make a call to a method info. Used by the optimizer and code generator to build +/// calls to the type-directed solutions to member constraints. +let MakeMethInfoCall amap m minfo minst args = + let valUseFlags = NormalValUse // correct unless if we allow wild trait constraints like "T has a ctor and can be used as a parent class" + match minfo with + | ILMeth(g,ilminfo,_) -> + let direct = not minfo.IsVirtual + let isProp = false // not necessarily correct, but this is only used post-creflect where this flag is irrelevant + BuildILMethInfoCall g amap m isProp ilminfo valUseFlags minst direct args |> fst + | FSMeth(g,typ,vref,_) -> + BuildFSharpMethodCall g m (typ,vref) valUseFlags minst args |> fst + | DefaultStructCtor(_,typ) -> + mkDefault (m,typ) +#if EXTENSIONTYPING + | ProvidedMeth(amap,mi,_,m) -> + let isProp = false // not necessarily correct, but this is only used post-creflect where this flag is irrelevant + let ilMethodRef = Import.ImportProvidedMethodBaseAsILMethodRef amap m mi + let isConstructor = mi.PUntaint((fun c -> c.IsConstructor), m) + let valu = mi.PUntaint((fun c -> c.DeclaringType.IsValueType), m) + let actualTypeInst = [] // GENERIC TYPE PROVIDERS: for generics, we would have something here + let actualMethInst = [] // GENERIC TYPE PROVIDERS: for generics, we would have something here + let ilReturnTys = Option.toList (minfo.GetCompiledReturnTy(amap, m, [])) // GENERIC TYPE PROVIDERS: for generics, we would have more here + // REVIEW: Should we allow protected calls? + Expr.Op(TOp.ILCall(false,false, valu, isConstructor,valUseFlags,isProp,false,ilMethodRef,actualTypeInst,actualMethInst, ilReturnTys),[],args,m) + +#endif + +#if EXTENSIONTYPING +// This imports a provided method, and checks if it is a known compiler intrinsic like "1 + 2" +let TryImportProvidedMethodBaseAsLibraryIntrinsic (amap:Import.ImportMap, m:range, mbase: Tainted) = + let methodName = mbase.PUntaint((fun x -> x.Name),m) + let declaringType = Import.ImportProvidedType amap m (mbase.PApply((fun x -> x.DeclaringType),m)) + if isAppTy amap.g declaringType then + let declaringEntity = tcrefOfAppTy amap.g declaringType + if not declaringEntity.IsLocalRef && ccuEq declaringEntity.nlr.Ccu amap.g.fslibCcu then + match amap.g.knownIntrinsics.TryGetValue ((declaringEntity.LogicalName, methodName)) with + | true,vref -> Some vref + | _ -> + match amap.g.knownFSharpCoreModules.TryGetValue(declaringEntity.LogicalName) with + | true,modRef -> + match modRef.ModuleOrNamespaceType.AllValsByLogicalName |> Seq.tryPick (fun (KeyValue(_,v)) -> if v.CompiledName = methodName then Some v else None) with + | Some v -> Some (mkNestedValRef modRef v) + | None -> None + | _ -> None + else + None + else + None +#endif + + +/// Build an expression that calls a given method info. +/// This is called after overload resolution, and also to call other +/// methods such as 'setters' for properties. +// tcVal: used to convert an F# value into an expression. See tc.fs. +// isProp: is it a property get? +// minst: the instantiation to apply for a generic method +// objArgs: the 'this' argument, if any +// args: the arguments, if any +let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objArgs args = + + let direct = IsBaseCall objArgs + + TakeObjAddrForMethodCall g amap minfo isMutable m objArgs (fun ccallInfo objArgs -> + let allArgs = (objArgs @ args) + let valUseFlags = + if (direct && (match valUseFlags with NormalValUse -> true | _ -> false)) then + VSlotDirectCall + else + match ccallInfo with + | Some ty -> + // printfn "possible constrained call to '%s' at %A" minfo.LogicalName m + PossibleConstrainedCall ty + | None -> + valUseFlags + + match minfo with +#if EXTENSIONTYPING + // By this time this is an erased method info, e.g. one returned from an expression + // REVIEW: copied from tastops, which doesn't allow protected methods + | ProvidedMeth (amap,providedMeth,_,_) -> + // TODO: there is a fair bit of duplication here with mk_il_minfo_call. We should be able to merge these + + /// Build an expression node that is a call to a extension method in a generated assembly + let enclTy = minfo.EnclosingType + // prohibit calls to methods that are declared in specific array types (Get,Set,Address) + // these calls are provided by the runtime and should not be called from the user code + if isArrayTy g enclTy then + let tpe = TypeProviderError(FSComp.SR.tcRuntimeSuppliedMethodCannotBeUsedInUserCode(minfo.DisplayName), providedMeth.TypeProviderDesignation, m) + error (tpe) + let valu = isStructTy g enclTy + let isCtor = minfo.IsConstructor + if minfo.IsClassConstructor then + error (InternalError (minfo.LogicalName ^": cannot call a class constructor",m)) + let useCallvirt = not valu && not direct && minfo.IsVirtual + let isProtected = minfo.IsProtectedAccessiblity + let exprTy = if isCtor then enclTy else minfo.GetFSharpReturnTy(amap, m, minst) + match TryImportProvidedMethodBaseAsLibraryIntrinsic (amap, m, providedMeth) with + | Some fsValRef -> + //reraise() calls are converted to TOp.Reraise in the type checker. So if a provided expression includes a reraise call + // we must put it in that form here. + if valRefEq amap.g fsValRef amap.g.reraise_vref then + mkReraise m exprTy, exprTy + else + let vexp, vexpty = tcVal fsValRef valUseFlags (minfo.DeclaringTypeInst @ minst) m + BuildFSharpMethodApp g m fsValRef vexp vexpty allArgs + | None -> + let ilMethRef = Import.ImportProvidedMethodBaseAsILMethodRef amap m providedMeth + let isNewObj = isCtor && (match valUseFlags with NormalValUse -> true | _ -> false) + let actualTypeInst = + if isTupleTy g enclTy then argsOfAppTy g (mkCompiledTupleTy g (destTupleTy g enclTy)) // provided expressions can include method calls that get properties of tuple types + elif isFunTy g enclTy then [ domainOfFunTy g enclTy; rangeOfFunTy g enclTy ] // provided expressions can call Invoke + else minfo.DeclaringTypeInst + let actualMethInst = minst + let retTy = (if not isCtor && (ilMethRef.ReturnType = ILType.Void) then [] else [exprTy]) + let noTailCall = false + let expr = Expr.Op(TOp.ILCall(useCallvirt,isProtected,valu,isNewObj,valUseFlags,isProp,noTailCall,ilMethRef,actualTypeInst,actualMethInst, retTy),[],allArgs,m) + expr,exprTy + +#endif + + // Build a call to a .NET method + | ILMeth(_,ilMethInfo,_) -> + BuildILMethInfoCall g amap m isProp ilMethInfo valUseFlags minst direct allArgs + + // Build a call to an F# method + | FSMeth(_, _, vref, _) -> + + // Go see if this is a use of a recursive definition... Note we know the value instantiation + // we want to use so we pass that in order not to create a new one. + let vexp, vexpty = tcVal vref valUseFlags (minfo.DeclaringTypeInst @ minst) m + BuildFSharpMethodApp g m vref vexp vexpty allArgs + + // Build a 'call' to a struct default constructor + | DefaultStructCtor (g,typ) -> + if not (TypeHasDefaultValue g m typ) then + errorR(Error(FSComp.SR.tcDefaultStructConstructorCall(),m)) + mkDefault (m,typ), typ) + +//------------------------------------------------------------------------- +// Build delegate constructions (lambdas/functions to delegates) +//------------------------------------------------------------------------- + +/// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites +let BuildNewDelegateExpr (eventInfoOpt:EventInfo option, g, amap, delegateTy, invokeMethInfo:MethInfo, delArgTys, f, fty, m) = + let slotsig = invokeMethInfo.GetSlotSig(amap, m) + let delArgVals,expr = + let topValInfo = ValReprInfo([],List.replicate (List.length delArgTys) ValReprInfo.unnamedTopArg, ValReprInfo.unnamedRetVal) + + // Try to pull apart an explicit lambda and use it directly + // Don't do this in the case where we're adjusting the arguments of a function used to build a .NET-compatible event handler + let lambdaContents = + if isSome eventInfoOpt then + None + else + tryDestTopLambda g amap topValInfo (f, fty) + match lambdaContents with + | None -> + + if List.exists (isByrefTy g) delArgTys then + error(Error(FSComp.SR.tcFunctionRequiresExplicitLambda(List.length delArgTys),m)) + + let delArgVals = delArgTys |> List.map (fun argty -> fst (mkCompGenLocal m "delegateArg" argty)) + let expr = + let args = + match eventInfoOpt with + | Some einfo -> + match delArgVals with + | [] -> error(nonStandardEventError einfo.EventName m) + | h :: _ when not (isObjTy g h.Type) -> error(nonStandardEventError einfo.EventName m) + | h :: t -> [exprForVal m h; mkTupledVars g m t] + | None -> + if isNil delArgTys then [mkUnit g m] else List.map (exprForVal m) delArgVals + mkApps g ((f,fty),[],args,m) + delArgVals,expr + + | Some _ -> + if isNil delArgTys then [], mkApps g ((f,fty),[],[mkUnit g m],m) + else + let _,_,_,vsl,body,_ = IteratedAdjustArityOfLambda g amap topValInfo f + List.concat vsl, body + + let meth = TObjExprMethod(slotsig, [], [], [delArgVals], expr, m) + mkObjExpr(delegateTy,None,BuildObjCtorCall g m,[meth],[],m) + +let CoerceFromFSharpFuncToDelegate g amap infoReader ad callerArgTy m callerArgExpr delegateTy = + let (SigOfFunctionForDelegate(invokeMethInfo,delArgTys,_,_)) = GetSigOfFunctionForDelegate infoReader delegateTy m ad + BuildNewDelegateExpr (None, g, amap, delegateTy, invokeMethInfo, delArgTys, callerArgExpr, callerArgTy, m) + + +//------------------------------------------------------------------------- +// Import provided expressions +//------------------------------------------------------------------------- + + +#if EXTENSIONTYPING +// This file is not a great place for this functionality to sit, it's here because of BuildMethodCall +module ProvidedMethodCalls = + + let private convertConstExpr g amap m (constant : Tainted) = + let (obj,objTy) = constant.PApply2(id,m) + let ty = Import.ImportProvidedType amap m objTy + let normTy = normalizeEnumTy g ty + obj.PUntaint((fun v -> + let fail() = raise <| TypeProviderError(FSComp.SR.etUnsupportedConstantType(v.GetType().ToString()), constant.TypeProviderDesignation, m) + try + match v with + | null -> mkNull m ty + | _ when typeEquiv g normTy g.bool_ty -> Expr.Const(Const.Bool(v :?> bool), m, ty) + | _ when typeEquiv g normTy g.sbyte_ty -> Expr.Const(Const.SByte(v :?> sbyte), m, ty) + | _ when typeEquiv g normTy g.byte_ty -> Expr.Const(Const.Byte(v :?> byte), m, ty) + | _ when typeEquiv g normTy g.int16_ty -> Expr.Const(Const.Int16(v :?> int16), m, ty) + | _ when typeEquiv g normTy g.uint16_ty -> Expr.Const(Const.UInt16(v :?> uint16), m, ty) + | _ when typeEquiv g normTy g.int32_ty -> Expr.Const(Const.Int32(v :?> int32), m, ty) + | _ when typeEquiv g normTy g.uint32_ty -> Expr.Const(Const.UInt32(v :?> uint32), m, ty) + | _ when typeEquiv g normTy g.int64_ty -> Expr.Const(Const.Int64(v :?> int64), m, ty) + | _ when typeEquiv g normTy g.uint64_ty -> Expr.Const(Const.UInt64(v :?> uint64), m, ty) + | _ when typeEquiv g normTy g.nativeint_ty -> Expr.Const(Const.IntPtr(v :?> int64), m, ty) + | _ when typeEquiv g normTy g.unativeint_ty -> Expr.Const(Const.UIntPtr(v :?> uint64), m, ty) + | _ when typeEquiv g normTy g.float32_ty -> Expr.Const(Const.Single(v :?> float32), m, ty) + | _ when typeEquiv g normTy g.float_ty -> Expr.Const(Const.Double(v :?> float), m, ty) + | _ when typeEquiv g normTy g.char_ty -> Expr.Const(Const.Char(v :?> char), m, ty) + | _ when typeEquiv g normTy g.string_ty -> Expr.Const(Const.String(v :?> string), m, ty) + | _ when typeEquiv g normTy g.decimal_ty -> Expr.Const(Const.Decimal(v :?> decimal), m, ty) + | _ when typeEquiv g normTy g.unit_ty -> Expr.Const(Const.Unit, m, ty) + | _ -> fail() + with _ -> + fail() + ), range=m) + + /// Erasure over System.Type. + /// + /// This is a reimplementation of the logic of provided-type erasure, working entirely over (tainted, provided) System.Type + /// values. This is used when preparing ParameterInfo objects to give to the provider in GetInvokerExpression. + /// These ParameterInfo have erased ParameterType - giving the provider an erased type makes it considerably easier + /// to implement a correct GetInvokerExpression. + /// + /// Ideally we would implement this operation by converting to an F# TType using ImportSystemType, and then erasing, and then converting + /// back to System.Type. However, there is currently no way to get from an arbitrary F# TType (even the TType for + /// System.Object) to a System.Type to give to the type provider. + let eraseSystemType (amap,m,inputType) = + let rec loop (st:Tainted) = + if st.PUntaint((fun st -> st.IsGenericParameter),m) then st + elif st.PUntaint((fun st -> st.IsArray),m) then + let et = st.PApply((fun st -> st.GetElementType()),m) + let rank = st.PUntaint((fun st -> st.GetArrayRank()),m) + (loop et).PApply((fun st -> ProvidedType.CreateNoContext(if rank = 1 then st.RawSystemType.MakeArrayType() else st.RawSystemType.MakeArrayType(rank))),m) + elif st.PUntaint((fun st -> st.IsByRef),m) then + let et = st.PApply((fun st -> st.GetElementType()),m) + (loop et).PApply((fun st -> ProvidedType.CreateNoContext(st.RawSystemType.MakeByRefType())),m) + elif st.PUntaint((fun st -> st.IsPointer),m) then + let et = st.PApply((fun st -> st.GetElementType()),m) + (loop et).PApply((fun st -> ProvidedType.CreateNoContext(st.RawSystemType.MakePointerType())),m) + else + let isGeneric = st.PUntaint((fun st -> st.IsGenericType),m) + let headType = if isGeneric then st.PApply((fun st -> st.GetGenericTypeDefinition()),m) else st + // We import in order to use IsProvidedErasedTycon, to make sure we at least don't reinvent that + let headTypeAsFSharpType = Import.ImportProvidedNamedType amap m headType + if headTypeAsFSharpType.IsProvidedErasedTycon then + let baseType = + st.PApply((fun st -> + match st.BaseType with + | null -> ProvidedType.CreateNoContext(typeof) // it might be an interface + | st -> st),m) + loop baseType + else + if isGeneric then + let genericArgs = st.PApplyArray((fun st -> st.GetGenericArguments()),"GetGenericArguments",m) + let typars = headTypeAsFSharpType.Typars(m) + // Drop the generic arguments that don't correspond to type arguments, i.e. are units-of-measure + let genericArgs = + [| for (genericArg,tp) in Seq.zip genericArgs typars do + if tp.Kind = TyparKind.Type then + yield genericArg |] + + if genericArgs.Length = 0 then + headType + else + let erasedArgTys = genericArgs |> Array.map loop + headType.PApply((fun st -> + let erasedArgTys = erasedArgTys |> Array.map (fun a -> a.PUntaintNoFailure (fun x -> x.RawSystemType)) + ProvidedType.CreateNoContext(st.RawSystemType.MakeGenericType erasedArgTys)),m) + else + st + loop inputType + + let convertProvidedExpressionToExprAndWitness tcVal (thisArg:Expr option, + allArgs:Exprs, + paramVars:Tainted[], + g,amap,mut,isProp,isSuperInit,m, + expr:Tainted) = + let varConv = + [ for (v,e) in Seq.zip (paramVars |> Seq.map (fun x -> x.PUntaint(id,m))) (Option.toList thisArg @ allArgs) do + yield (v,(None,e)) ] + |> Dictionary.ofList + + let rec exprToExprAndWitness top (ea:Tainted) = + let fail() = error(Error(FSComp.SR.etUnsupportedProvidedExpression(ea.PUntaint((fun etree -> etree.UnderlyingExpressionString), m)),m)) + match ea with + | Tainted.Null -> error(Error(FSComp.SR.etNullProvidedExpression(ea.TypeProviderDesignation),m)) + | _ -> + match ea.PApplyOption((function ProvidedTypeAsExpr x -> Some x | _ -> None), m) with + | Some info -> + let (expr,targetTy) = info.PApply2(id,m) + let srcExpr = exprToExpr expr + let targetTy = Import.ImportProvidedType amap m (targetTy.PApply(id,m)) + let sourceTy = Import.ImportProvidedType amap m (expr.PApply((fun e -> e.Type),m)) + let te = mkCoerceIfNeeded g targetTy sourceTy srcExpr + None, (te, tyOfExpr g te) + | None -> + match ea.PApplyOption((function ProvidedTypeTestExpr x -> Some x | _ -> None), m) with + | Some info -> + let (expr,targetTy) = info.PApply2(id,m) + let srcExpr = exprToExpr expr + let targetTy = Import.ImportProvidedType amap m (targetTy.PApply(id,m)) + let te = mkCallTypeTest g m targetTy srcExpr + None, (te, tyOfExpr g te) + | None -> + match ea.PApplyOption((function ProvidedIfThenElseExpr x -> Some x | _ -> None), m) with + | Some info -> + let test,thenBranch,elseBranch = info.PApply3(id,m) + let testExpr = exprToExpr test + let ifTrueExpr = exprToExpr thenBranch + let ifFalseExpr = exprToExpr elseBranch + let te = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m (tyOfExpr g ifTrueExpr) testExpr ifTrueExpr ifFalseExpr + None, (te, tyOfExpr g te) + | None -> + match ea.PApplyOption((function ProvidedVarExpr x -> Some x | _ -> None), m) with + | Some info -> + let _,vTe = varToExpr info + None, (vTe, tyOfExpr g vTe) + | None -> + match ea.PApplyOption((function ProvidedConstantExpr x -> Some x | _ -> None), m) with + | Some info -> + let ce = convertConstExpr g amap m info + None, (ce, tyOfExpr g ce) + | None -> + match ea.PApplyOption((function ProvidedNewTupleExpr x -> Some x | _ -> None), m) with + | Some info -> + let elems = info.PApplyArray(id, "GetInvokerExpresson",m) + let elemsT = elems |> Array.map exprToExpr |> Array.toList + let exprT = mkTupledNoTypes g m elemsT + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedNewArrayExpr x -> Some x | _ -> None), m) with + | Some info -> + let ty,elems = info.PApply2(id,m) + let tyT = Import.ImportProvidedType amap m ty + let elems = elems.PApplyArray(id, "GetInvokerExpresson",m) + let elemsT = elems |> Array.map exprToExpr |> Array.toList + let exprT = Expr.Op(TOp.Array, [tyT],elemsT,m) + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedTupleGetExpr x -> Some x | _ -> None), m) with + | Some info -> + let inp,n = info.PApply2(id, m) + let inpT = inp |> exprToExpr + // if type of expression is erased type then we need convert it to the underlying base type + let typeOfExpr = + let t = tyOfExpr g inpT + stripTyEqnsWrtErasure EraseMeasures g t + let tysT = tryDestTupleTy g typeOfExpr + let exprT = mkTupleFieldGet (inpT, tysT, n.PUntaint(id,m), m) + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedLambdaExpr x -> Some x | _ -> None), m) with + | Some info -> + let v,b = info.PApply2(id, m) + let vT = addVar v + let bT = exprToExpr b + removeVar v + let exprT = mkLambda m vT (bT, tyOfExpr g bT) + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedLetExpr x -> Some x | _ -> None), m) with + | Some info -> + let v,e,b = info.PApply3(id, m) + let eT = exprToExpr e + let vT = addVar v + let bT = exprToExpr b + removeVar v + let exprT = mkCompGenLet m vT eT bT + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedVarSetExpr x -> Some x | _ -> None), m) with + | Some info -> + let v,e = info.PApply2(id, m) + let eT = exprToExpr e + let vTopt,_ = varToExpr v + match vTopt with + | None -> + fail() + | Some vT -> + let exprT = mkValSet m (mkLocalValRef vT) eT + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedWhileLoopExpr x -> Some x | _ -> None), m) with + | Some info -> + let guardExpr,bodyExpr = info.PApply2(id, m) + let guardExprT = exprToExpr guardExpr + let bodyExprT = exprToExpr bodyExpr + let exprT = mkWhile g (SequencePointInfoForWhileLoop.NoSequencePointAtWhileLoop,SpecialWhileLoopMarker.NoSpecialWhileLoopMarker, guardExprT, bodyExprT, m) + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedForIntegerRangeLoopExpr x -> Some x | _ -> None), m) with + | Some info -> + let v,e1,e2,e3 = info.PApply4(id, m) + let e1T = exprToExpr e1 + let e2T = exprToExpr e2 + let vT = addVar v + let e3T = exprToExpr e3 + removeVar v + let exprT = mkFastForLoop g (SequencePointInfoForForLoop.NoSequencePointAtForLoop,m,vT,e1T,true,e2T,e3T) + None, (exprT, tyOfExpr g exprT) + | None -> + match ea.PApplyOption((function ProvidedNewDelegateExpr x -> Some x | _ -> None), m) with + | Some info -> + let delegateTy,boundVars,delegateBodyExpr = info.PApply3(id, m) + let delegateTyT = Import.ImportProvidedType amap m delegateTy + let vs = boundVars.PApplyArray(id, "GetInvokerExpresson",m) |> Array.toList + let vsT = List.map addVar vs + let delegateBodyExprT = exprToExpr delegateBodyExpr + List.iter removeVar vs + let lambdaExpr = mkLambdas m [] vsT (delegateBodyExprT, tyOfExpr g delegateBodyExprT) + let lambdaExprTy = tyOfExpr g lambdaExpr + let infoReader = InfoReader(g, amap) + let exprT = CoerceFromFSharpFuncToDelegate g amap infoReader AccessorDomain.AccessibleFromSomewhere lambdaExprTy m lambdaExpr delegateTyT + None, (exprT, tyOfExpr g exprT) + | None -> +#if PROVIDED_ADDRESS_OF + match ea.PApplyOption((function ProvidedAddressOfExpr x -> Some x | _ -> None), m) with + | Some e -> + let eT = exprToExpr e + let wrap,ce = mkExprAddrOfExpr g true false DefinitelyMutates eT None m + let ce = wrap ce + None, (ce, tyOfExpr g ce) + | None -> +#endif + match ea.PApplyOption((function ProvidedDefaultExpr x -> Some x | _ -> None), m) with + | Some pty -> + let ty = Import.ImportProvidedType amap m pty + let ce = mkDefault (m, ty) + None, (ce, tyOfExpr g ce) + | None -> + match ea.PApplyOption((function ProvidedCallExpr c -> Some c | _ -> None), m) with + | Some info -> + methodCallToExpr top ea info + | None -> + match ea.PApplyOption((function ProvidedSequentialExpr c -> Some c | _ -> None), m) with + | Some info -> + let e1,e2 = info.PApply2(id, m) + let e1T = exprToExpr e1 + let e2T = exprToExpr e2 + let ce = mkCompGenSequential m e1T e2T + None, (ce, tyOfExpr g ce) + | None -> + match ea.PApplyOption((function ProvidedTryFinallyExpr c -> Some c | _ -> None), m) with + | Some info -> + let e1,e2 = info.PApply2(id, m) + let e1T = exprToExpr e1 + let e2T = exprToExpr e2 + let ce = mkTryFinally g (e1T,e2T,m,tyOfExpr g e1T,SequencePointInfoForTry.NoSequencePointAtTry,SequencePointInfoForFinally.NoSequencePointAtFinally) + None, (ce, tyOfExpr g ce) + | None -> + match ea.PApplyOption((function ProvidedTryWithExpr c -> Some c | _ -> None), m) with + | Some info -> + let bT = exprToExpr (info.PApply((fun (x,_,_,_,_) -> x), m)) + let v1 = info.PApply((fun (_,x,_,_,_) -> x), m) + let v1T = addVar v1 + let e1T = exprToExpr (info.PApply((fun (_,_,x,_,_) -> x), m)) + removeVar v1 + let v2 = info.PApply((fun (_,_,_,x,_) -> x), m) + let v2T = addVar v2 + let e2T = exprToExpr (info.PApply((fun (_,_,_,_,x) -> x), m)) + removeVar v2 + let ce = mkTryWith g (bT,v1T,e1T,v2T,e2T,m,tyOfExpr g bT,SequencePointInfoForTry.NoSequencePointAtTry,SequencePointInfoForWith.NoSequencePointAtWith) + None, (ce, tyOfExpr g ce) + | None -> + match ea.PApplyOption((function ProvidedNewObjectExpr c -> Some c | _ -> None), m) with + | Some info -> + None, ctorCallToExpr info + | None -> + fail() + + + and ctorCallToExpr (ne:Tainted<_>) = + let (ctor,args) = ne.PApply2(id,m) + let targetMethInfo = ProvidedMeth(amap,ctor.PApply((fun ne -> upcast ne),m),None,m) + let objArgs = [] + let arguments = [ for ea in args.PApplyArray(id, "GetInvokerExpresson", m) -> exprToExpr ea ] + let callExpr = BuildMethodCall tcVal g amap Mutates.PossiblyMutates m false targetMethInfo isSuperInit [] objArgs arguments + callExpr + + and addVar (v:Tainted) = + let nm = v.PUntaint ((fun v -> v.Name),m) + let mut = v.PUntaint ((fun v -> v.IsMutable),m) + let vRaw = v.PUntaint (id,m) + let tyT = Import.ImportProvidedType amap m (v.PApply ((fun v -> v.Type),m)) + let vT,vTe = if mut then mkMutableCompGenLocal m nm tyT else mkCompGenLocal m nm tyT + varConv.[vRaw] <- (Some vT,vTe) + vT + + and removeVar (v:Tainted) = + let vRaw = v.PUntaint (id,m) + varConv.Remove vRaw |> ignore + + and methodCallToExpr top _origExpr (mce:Tainted<_>) = + let (objOpt,meth,args) = mce.PApply3(id,m) + let targetMethInfo = ProvidedMeth(amap,meth.PApply((fun mce -> upcast mce), m),None,m) + let objArgs = + match objOpt.PApplyOption(id, m) with + | None -> [] + | Some objExpr -> [exprToExpr objExpr] + + let arguments = [ for ea in args.PApplyArray(id, "GetInvokerExpresson", m) -> exprToExpr ea ] + let genericArguments = + if meth.PUntaint((fun m -> m.IsGenericMethod), m) then + meth.PApplyArray((fun m -> m.GetGenericArguments()), "GetGenericArguments", m) + else + [| |] + let replacementGenericArguments = genericArguments |> Array.map (fun t->Import.ImportProvidedType amap m t) |> List.ofArray + + let mut = if top then mut else PossiblyMutates + let isSuperInit = if top then isSuperInit else ValUseFlag.NormalValUse + let isProp = if top then isProp else false + let callExpr = BuildMethodCall tcVal g amap mut m isProp targetMethInfo isSuperInit replacementGenericArguments objArgs arguments + Some meth, callExpr + + and varToExpr (pe:Tainted) = + // sub in the appropriate argument + // REVIEW: "thisArg" pointer should be first, if present + let vRaw = pe.PUntaint(id,m) + if not (varConv.ContainsKey vRaw) then + let typeProviderDesignation = ExtensionTyping.DisplayNameOfTypeProvider (pe.TypeProvider, m) + error(NumberedError(FSComp.SR.etIncorrectParameterExpression(typeProviderDesignation,vRaw.Name), m)) + varConv.[vRaw] + + and exprToExpr expr = + let _, (resExpr, _) = exprToExprAndWitness false expr + resExpr + + exprToExprAndWitness true expr + + + // fill in parameter holes in the expression + let TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi:Tainted, objArgs, allArgs, m) = + let parameters = + mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) + let paramTys = + parameters + |> Array.map (fun p -> p.PApply((fun st -> st.ParameterType),m)) + let erasedParamTys = + paramTys + |> Array.map (fun pty -> eraseSystemType (amap,m,pty)) + let paramVars = + erasedParamTys + |> Array.mapi (fun i erasedParamTy -> erasedParamTy.PApply((fun ty -> ProvidedVar.Fresh("arg" + i.ToString(),ty)),m)) + + + // encode "this" as the first ParameterExpression, if applicable + let thisArg, paramVars = + match objArgs with + | [objArg] -> + let erasedThisTy = eraseSystemType (amap,m,mi.PApply((fun mi -> mi.DeclaringType),m)) + let thisVar = erasedThisTy.PApply((fun ty -> ProvidedVar.Fresh("this", ty)), m) + Some objArg , Array.append [| thisVar |] paramVars + | [] -> None , paramVars + | _ -> failwith "multiple objArgs?" + + let ea = mi.PApplyWithProvider((fun (methodInfo,provider) -> ExtensionTyping.GetInvokerExpression(provider, methodInfo, [| for p in paramVars -> p.PUntaintNoFailure id |])), m) + + convertProvidedExpressionToExprAndWitness tcVal (thisArg,allArgs,paramVars,g,amap,mut,isProp,isSuperInit,m,ea) + + + let BuildInvokerExpressionForProvidedMethodCall tcVal (g, amap, mi:Tainted, objArgs, mut, isProp, isSuperInit, allArgs, m) = + try + let methInfoOpt, (expr, retTy) = TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi, objArgs, allArgs, m) + + let exprty = GetCompiledReturnTyOfProvidedMethodInfo amap m mi |> GetFSharpViewOfReturnType g + let expr = mkCoerceIfNeeded g exprty retTy expr + methInfoOpt, expr, exprty + with + | :? TypeProviderError as tpe -> + let typeName = mi.PUntaint((fun mb -> mb.DeclaringType.FullName), m) + let methName = mi.PUntaint((fun mb -> mb.Name), m) + raise( tpe.WithContext(typeName, methName) ) // loses original stack trace +#endif diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs new file mode 100644 index 00000000000..6b46480c4f1 --- /dev/null +++ b/src/fsharp/MethodOverrides.fs @@ -0,0 +1,712 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Primary logic related to method overrides. +module internal Microsoft.FSharp.Compiler.MethodOverrides + +open Internal.Utilities +open System.Text + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.InfoReader +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.Tastops.DebugPrint +open Microsoft.FSharp.Compiler.TcGlobals +open Microsoft.FSharp.Compiler.TypeRelations + +//------------------------------------------------------------------------- +// Completeness of classes +//------------------------------------------------------------------------- + +type OverrideCanImplement = + | CanImplementAnyInterfaceSlot + | CanImplementAnyClassHierarchySlot + | CanImplementAnySlot + | CanImplementNoSlots + +/// The overall information about a method implementation in a class or object expression +type OverrideInfo = + | Override of OverrideCanImplement * TyconRef * Ident * (Typars * TyparInst) * TType list list * TType option * bool * bool + member x.CanImplement = let (Override(a,_,_,_,_,_,_,_)) = x in a + member x.BoundingTyconRef = let (Override(_,ty,_,_,_,_,_,_)) = x in ty + member x.LogicalName = let (Override(_,_,id,_,_,_,_,_)) = x in id.idText + member x.Range = let (Override(_,_,id,_,_,_,_,_)) = x in id.idRange + member x.IsFakeEventProperty = let (Override(_,_,_,_,_,_,b,_)) = x in b + member x.ArgTypes = let (Override(_,_,_,_,b,_,_,_)) = x in b + member x.ReturnType = let (Override(_,_,_,_,_,b,_,_)) = x in b + member x.IsCompilerGenerated = let (Override(_,_,_,_,_,_,_,b)) = x in b + +// If the bool is true then the slot is optional, i.e. is an interface slot +// which does not _have_ to be implemented, because an inherited implementation +// is available. +type RequiredSlot = RequiredSlot of MethInfo * (* isOptional: *) bool + +type SlotImplSet = SlotImplSet of RequiredSlot list * NameMultiMap * OverrideInfo list * PropInfo list + +exception TypeIsImplicitlyAbstract of range +exception OverrideDoesntOverride of DisplayEnv * OverrideInfo * MethInfo option * TcGlobals * Import.ImportMap * range + +module DispatchSlotChecking = + + /// Print the signature of an override to a buffer as part of an error message + let PrintOverrideToBuffer denv os (Override(_,_,id,(mtps,memberToParentInst),argTys,retTy,_,_)) = + let denv = { denv with showTyparBinding = true } + let retTy = (retTy |> GetFSharpViewOfReturnType denv.g) + let argInfos = + match argTys with + | [] -> [[(denv.g.unit_ty,ValReprInfo.unnamedTopArg1)]] + | _ -> argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) + Layout.bufferL os (NicePrint.layoutMemberSig denv (memberToParentInst,id.idText,mtps, argInfos, retTy)) + + /// Print the signature of a MethInfo to a buffer as part of an error message + let PrintMethInfoSigToBuffer g amap m denv os minfo = + let denv = { denv with showTyparBinding = true } + let (CompiledSig(argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo + let retTy = (retTy |> GetFSharpViewOfReturnType g) + let argInfos = argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) + let nm = minfo.LogicalName + Layout.bufferL os (NicePrint.layoutMemberSig denv (ttpinst,nm,fmtps, argInfos, retTy)) + + /// Format the signature of an override as a string as part of an error message + let FormatOverride denv d = bufs (fun buf -> PrintOverrideToBuffer denv buf d) + + /// Format the signature of a MethInfo as a string as part of an error message + let FormatMethInfoSig g amap m denv d = bufs (fun buf -> PrintMethInfoSigToBuffer g amap m denv buf d) + + /// Get the override info for an existing (inherited) method being used to implement a dispatch slot. + let GetInheritedMemberOverrideInfo g amap m parentType (minfo:MethInfo) = + let nm = minfo.LogicalName + let (CompiledSig (argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo + + let isFakeEventProperty = minfo.IsFSharpEventPropertyMethod + Override(parentType,tcrefOfAppTy g minfo.EnclosingType,mkSynId m nm, (fmtps,ttpinst),argTys,retTy,isFakeEventProperty,false) + + /// Get the override info for a value being used to implement a dispatch slot. + let GetTypeMemberOverrideInfo g reqdTy (overrideBy:ValRef) = + let _,argInfos,retTy,_ = GetTypeOfMemberInMemberForm g overrideBy + let nm = overrideBy.LogicalName + + let argTys = argInfos |> List.mapSquared fst + + let memberMethodTypars,memberToParentInst,argTys,retTy = + match PartitionValRefTypars g overrideBy with + | Some(_,_,memberMethodTypars,memberToParentInst,_tinst) -> + let argTys = argTys |> List.mapSquared (instType memberToParentInst) + let retTy = retTy |> Option.map (instType memberToParentInst) + memberMethodTypars, memberToParentInst,argTys, retTy + | None -> + error(Error(FSComp.SR.typrelMethodIsOverconstrained(),overrideBy.Range)) + let implKind = + if ValRefIsExplicitImpl g overrideBy then + + let belongsToReqdTy = + match overrideBy.MemberInfo.Value.ImplementedSlotSigs with + | [] -> false + | ss :: _ -> isInterfaceTy g ss.ImplementedType && typeEquiv g reqdTy ss.ImplementedType + if belongsToReqdTy then + CanImplementAnyInterfaceSlot + else + CanImplementNoSlots + else if overrideBy.IsDispatchSlotMember then + CanImplementNoSlots + // abstract slots can only implement interface slots + //CanImplementAnyInterfaceSlot <<----- Change to this to enable implicit interface implementation + + else + CanImplementAnyClassHierarchySlot + //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation + + let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) + Override(implKind,overrideBy.MemberApparentParent, mkSynId overrideBy.Range nm, (memberMethodTypars,memberToParentInst),argTys,retTy,isFakeEventProperty, overrideBy.IsCompilerGenerated) + + /// Get the override information for an object expression method being used to implement dispatch slots + let GetObjectExprOverrideInfo g amap (implty, id:Ident, memberFlags, ty, arityInfo, bindingAttribs, rhsExpr) = + // Dissect the type + let tps, argInfos, retTy, _ = GetMemberTypeInMemberForm g memberFlags arityInfo ty id.idRange + let argTys = argInfos |> List.mapSquared fst + // Dissect the implementation + let _, ctorThisValOpt, baseValOpt, vsl, rhsExpr,_ = destTopLambda g amap arityInfo (rhsExpr,ty) + assert ctorThisValOpt.IsNone + + // Drop 'this' + match vsl with + | [thisv]::vs -> + // Check for empty variable list from a () arg + let vs = if vs.Length = 1 && argInfos.IsEmpty then [] else vs + let implKind = + if isInterfaceTy g implty then + CanImplementAnyInterfaceSlot + else + CanImplementAnyClassHierarchySlot + //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation + let isFakeEventProperty = CompileAsEvent g bindingAttribs + let overrideByInfo = Override(implKind, tcrefOfAppTy g implty, id, (tps,[]), argTys, retTy, isFakeEventProperty, false) + overrideByInfo, (baseValOpt, thisv, vs, bindingAttribs, rhsExpr) + | _ -> + error(InternalError("Unexpected shape for object expression override",id.idRange)) + + /// Check if an override matches a dispatch slot by name + let IsNameMatch (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = + (overrideBy.LogicalName = dispatchSlot.LogicalName) + + /// Check if an override matches a dispatch slot by name + let IsImplMatch g (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = + // If the override is listed as only relevant to one type, and we're matching it against an abstract slot of an interface type, + // then check that interface type is the right type. + (match overrideBy.CanImplement with + | CanImplementNoSlots -> false + | CanImplementAnySlot -> true + | CanImplementAnyClassHierarchySlot -> not (isInterfaceTy g dispatchSlot.EnclosingType) + //| CanImplementSpecificInterfaceSlot parentTy -> isInterfaceTy g dispatchSlot.EnclosingType && typeEquiv g parentTy dispatchSlot.EnclosingType + | CanImplementAnyInterfaceSlot -> isInterfaceTy g dispatchSlot.EnclosingType) + + /// Check if the kinds of type parameters match between a dispatch slot and an override. + let IsTyparKindMatch g amap m (dispatchSlot:MethInfo) (Override(_,_,_,(mtps,_),_,_,_,_)) = + let (CompiledSig(_,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot + List.lengthsEqAndForall2 (fun (tp1:Typar) (tp2:Typar) -> tp1.Kind = tp2.Kind) mtps fvmtps + + /// Check if an override is a partial match for the requirements for a dispatch slot + let IsPartialMatch g amap m (dispatchSlot:MethInfo) (Override(_,_,_,(mtps,_),argTys,_retTy,_,_) as overrideBy) = + IsNameMatch dispatchSlot overrideBy && + let (CompiledSig (vargtys,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot + mtps.Length = fvmtps.Length && + IsTyparKindMatch g amap m dispatchSlot overrideBy && + argTys.Length = vargtys.Length && + IsImplMatch g dispatchSlot overrideBy + + /// Compute the reverse of a type parameter renaming. + let ReverseTyparRenaming g tinst = + tinst |> List.map (fun (tp,ty) -> (destTyparTy g ty, mkTyparTy tp)) + + /// Compose two instantiations of type parameters. + let ComposeTyparInsts inst1 inst2 = + inst1 |> List.map (map2Of2 (instType inst2)) + + /// Check if an override exactly matches the requirements for a dispatch slot + let IsExactMatch g amap m dispatchSlot (Override(_,_,_,(mtps,mtpinst),argTys,retTy,_,_) as overrideBy) = + IsPartialMatch g amap m dispatchSlot overrideBy && + let (CompiledSig (vargtys,vrty,fvmtps,ttpinst)) = CompiledSigOfMeth g amap m dispatchSlot + + // Compare the types. CompiledSigOfMeth, GetObjectExprOverrideInfo and GetTypeMemberOverrideInfo have already + // applied all relevant substitutions except the renamings from fvtmps <-> mtps + + let aenv = TypeEquivEnv.FromEquivTypars fvmtps mtps + + List.forall2 (List.lengthsEqAndForall2 (typeAEquiv g aenv)) vargtys argTys && + returnTypesAEquiv g aenv vrty retTy && + + // Comparing the method typars and their constraints is much trickier since the substitutions have not been applied + // to the constraints of these babies. This is partly because constraints are directly attached to typars so it's + // difficult to apply substitutions to them unless we separate them off at some point, which we don't as yet. + // + // Given C + // D + // dispatchSlot : C.M(...) + // overrideBy: parent: D value: ! (...) + // + // where X[dtps] indicates that X may involve free type variables dtps + // + // we have + // ttpinst maps ctps --> ctys[dtps] + // mtpinst maps ttps --> dtps + // + // compare fvtmps[ctps] and mtps[ttps] by + // fvtmps[ctps] @ ttpinst -- gives fvtmps[dtps] + // fvtmps[dtps] @ rev(mtpinst) -- gives fvtmps[ttps] + // + // Now fvtmps[ttps] and mtpinst[ttps] are comparable, i.e. have constraints w.r.t. the same set of type variables + // + // i.e. Compose the substitutions ttpinst and rev(mtpinst) + + let ttpinst = + // check we can reverse - in some error recovery situations we can't + if mtpinst |> List.exists (snd >> isTyparTy g >> not) then ttpinst + else ComposeTyparInsts ttpinst (ReverseTyparRenaming g mtpinst) + + // Compare under the composed substitutions + let aenv = TypeEquivEnv.FromTyparInst ttpinst + + typarsAEquiv g aenv fvmtps mtps + + /// Check if an override implements a dispatch slot + let OverrideImplementsDispatchSlot g amap m dispatchSlot availPriorOverride = + IsExactMatch g amap m dispatchSlot availPriorOverride && + // The override has to actually be in some subtype of the dispatch slot + ExistsHeadTypeInEntireHierarchy g amap m (generalizedTyconRef availPriorOverride.BoundingTyconRef) (tcrefOfAppTy g dispatchSlot.EnclosingType) + + /// Check if a dispatch slot is already implemented + let DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed (dispatchSlot: MethInfo) = + availPriorOverridesKeyed + |> NameMultiMap.find dispatchSlot.LogicalName + |> List.exists (OverrideImplementsDispatchSlot g amap m dispatchSlot) + + + /// Check all dispatch slots are implemented by some override. + let CheckDispatchSlotsAreImplemented (denv,g,amap,m, + nenv,sink:TcResultsSink, + isOverallTyAbstract, + reqdTy, + dispatchSlots:RequiredSlot list, + availPriorOverrides:OverrideInfo list, + overrides:OverrideInfo list) = + + let isReqdTyInterface = isInterfaceTy g reqdTy + let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) + let res = ref true + let fail exn = (res := false ; if showMissingMethodsAndRaiseErrors then errorR exn) + + // Index the availPriorOverrides and overrides by name + let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) + let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) + + dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot,isOptional)) -> + + match NameMultiMap.find dispatchSlot.LogicalName overridesKeyed + |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with + | [ovd] -> + if not ovd.IsCompilerGenerated then + let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None) + CallNameResolutionSink sink (ovd.Range,nenv,item,item,ItemOccurence.Implemented,denv,AccessorDomain.AccessibleFromSomewhere) + sink |> ignore + () + | [] -> + if not isOptional && + // Check that no available prior override implements this dispatch slot + not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot) then + // error reporting path + let (CompiledSig (vargtys,_vrty,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot + let noimpl() = if isReqdTyInterface then fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + else fail(Error(FSComp.SR.typrelNoImplementationGiven(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with + | [] -> + match overrides |> List.filter (fun overrideBy -> IsNameMatch dispatchSlot overrideBy && + IsImplMatch g dispatchSlot overrideBy) with + | [] -> + noimpl() + | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> + let error_msg = + if argTys.Length <> vargtys.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + elif mtps.Length <> fvmtps.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + else FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot) + fail(Error(error_msg, overrideBy.Range)) + | overrideBy :: _ -> + errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) + + | [ overrideBy ] -> + + match dispatchSlots |> List.filter (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with + | [] -> + // Error will be reported below in CheckOverridesAreAllUsedOnce + () + | _ -> + noimpl() + + | _ -> + fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) + | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot),m))) + !res + + /// Check all implementations implement some dispatch slot. + let CheckOverridesAreAllUsedOnce(denv, g, amap, isObjExpr, reqdTy, + dispatchSlotsKeyed: NameMultiMap, + availPriorOverrides: OverrideInfo list, + overrides: OverrideInfo list) = + let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) + for overrideBy in overrides do + if not overrideBy.IsFakeEventProperty then + let m = overrideBy.Range + let relevantVirts = NameMultiMap.find overrideBy.LogicalName dispatchSlotsKeyed + let relevantVirts = relevantVirts |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) + + match relevantVirts |> List.filter (fun dispatchSlot -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with + | [] -> + // This is all error reporting + match relevantVirts |> List.filter (fun dispatchSlot -> IsPartialMatch g amap m dispatchSlot overrideBy) with + | [dispatchSlot] -> + errorR(OverrideDoesntOverride(denv,overrideBy,Some dispatchSlot,g,amap,m)) + | _ -> + match relevantVirts |> List.filter (fun dispatchSlot -> IsNameMatch dispatchSlot overrideBy) with + | [dispatchSlot] -> + errorR(OverrideDoesntOverride(denv, overrideBy, Some dispatchSlot, g, amap, m)) + | _ -> + errorR(OverrideDoesntOverride(denv,overrideBy,None,g,amap,m)) + + + | [dispatchSlot] -> + if dispatchSlot.IsFinal && (isObjExpr || not (typeEquiv g reqdTy dispatchSlot.EnclosingType)) then + errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo amap m denv dispatchSlot),m)) + | dispatchSlots -> + match dispatchSlots |> List.filter (fun dispatchSlot -> + isInterfaceTy g dispatchSlot.EnclosingType || + not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot)) with + | h1 :: h2 :: _ -> + errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo amap m denv h1), (NicePrint.stringOfMethInfo amap m denv h2)),m)) + | _ -> + // dispatch slots are ordered from the derived classes to base + // so we can check the topmost dispatch slot if it is final + match dispatchSlots with + | meth::_ when meth.IsFinal -> errorR(Error(FSComp.SR.tcCannotOverrideSealedMethod((sprintf "%s::%s" (meth.EnclosingType.ToString()) (meth.LogicalName))), m)) + | _ -> () + + + + /// Get the slots of a type that can or must be implemented. This depends + /// partly on the full set of interface types that are being implemented + /// simultaneously, e.g. + /// { new C with interface I2 = ... interface I3 = ... } + /// allReqdTys = {C;I2;I3} + /// + /// allReqdTys can include one class/record/union type. + let GetSlotImplSets (infoReader:InfoReader) denv isObjExpr allReqdTys = + + let g = infoReader.g + let amap = infoReader.amap + + let availImpliedInterfaces : TType list = + [ for (reqdTy,m) in allReqdTys do + if not (isInterfaceTy g reqdTy) then + let baseTyOpt = if isObjExpr then Some reqdTy else GetSuperTypeOfType g amap m reqdTy + match baseTyOpt with + | None -> () + | Some baseTy -> yield! AllInterfacesOfType g amap m AllowMultiIntfInstantiations.Yes baseTy ] + + // For each implemented type, get a list containing the transitive closure of + // interface types implied by the type. This includes the implemented type itself if the implemented type + // is an interface type. + let intfSets = + allReqdTys |> List.mapi (fun i (reqdTy,m) -> + let interfaces = AllInterfacesOfType g amap m AllowMultiIntfInstantiations.Yes reqdTy + let impliedTys = (if isInterfaceTy g reqdTy then interfaces else reqdTy :: interfaces) + (i, reqdTy, impliedTys,m)) + + // For each implemented type, reduce its list of implied interfaces by subtracting out those implied + // by another implemented interface type. + // + // REVIEW: Note complexity O(ity*jty) + let reqdTyInfos = + intfSets |> List.map (fun (i,reqdTy,impliedTys,m) -> + let reduced = + (impliedTys,intfSets) ||> List.fold (fun acc (j,jty,impliedTys2,m) -> + if i <> j && TypeFeasiblySubsumesType 0 g amap m jty CanCoerce reqdTy + then ListSet.subtract (TypesFeasiblyEquiv 0 g amap m) acc impliedTys2 + else acc ) + (i, reqdTy, m, reduced)) + + // Check that, for each implemented type, at least one implemented type is implied. This is enough to capture + // duplicates. + for (_i, reqdTy, m, impliedTys) in reqdTyInfos do + if isInterfaceTy g reqdTy && isNil impliedTys then + errorR(Error(FSComp.SR.typrelDuplicateInterface(),m)) + + // Check that no interface type is implied twice + // + // Note complexity O(reqdTy*reqdTy) + for (i, _reqdTy, reqdTyRange, impliedTys) in reqdTyInfos do + for (j,_,_,impliedTys2) in reqdTyInfos do + if i > j then + let overlap = ListSet.intersect (TypesFeasiblyEquiv 0 g amap reqdTyRange) impliedTys impliedTys2 + overlap |> List.iter (fun overlappingTy -> + if nonNil(GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange overlappingTy |> List.filter (fun minfo -> minfo.IsVirtual)) then + errorR(Error(FSComp.SR.typrelNeedExplicitImplementation(NicePrint.minimalStringOfType denv (List.head overlap)),reqdTyRange))) + + // Get the SlotImplSet for each implemented type + // This contains the list of required members and the list of available members + [ for (_,reqdTy,reqdTyRange,impliedTys) in reqdTyInfos do + + // Build a set of the implied interface types, for quicker lookup, by nominal type + let isImpliedInterfaceTable = + impliedTys + |> List.filter (isInterfaceTy g) + |> List.map (fun ty -> tcrefOfAppTy g ty, ()) + |> TyconRefMap.OfList + + // Is a member an abstract slot of one of the implied interface types? + let isImpliedInterfaceType ty = + isImpliedInterfaceTable.ContainsKey (tcrefOfAppTy g ty) && + impliedTys |> List.exists (TypesFeasiblyEquiv 0 g amap reqdTyRange ty) + + //let isSlotImpl (minfo:MethInfo) = + // not minfo.IsAbstract && minfo.IsVirtual + + // Compute the abstract slots that require implementations + let dispatchSlots = + [ if isInterfaceTy g reqdTy then + for impliedTy in impliedTys do + // Check if the interface has an inherited implementation + // If so, you do not have to implement all the methods - each + // specific method is "optionally" implemented. + let isOptional = + ListSet.contains (typeEquiv g) impliedTy availImpliedInterfaces + for reqdSlot in GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange impliedTy do + yield RequiredSlot(reqdSlot, isOptional) + else + + // In the normal case, the requirements for a class are precisely all the abstract slots up the whole hierarchy. + // So here we get and yield all of those. + for minfo in reqdTy |> GetIntrinsicMethInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange do + if minfo.IsDispatchSlot then + yield RequiredSlot(minfo,(*isOptional=*)false) ] + + + // Compute the methods that are available to implement abstract slots from the base class + // + // This is used in CheckDispatchSlotsAreImplemented when we think a dispatch slot may not + // have been implemented. + let availPriorOverrides : OverrideInfo list = + if isInterfaceTy g reqdTy then + [] + else + let reqdTy = + let baseTyOpt = if isObjExpr then Some reqdTy else GetSuperTypeOfType g amap reqdTyRange reqdTy + match baseTyOpt with + | None -> reqdTy + | Some baseTy -> baseTy + [ // Get any class hierarchy methods on this type + // + // NOTE: What we have below is an over-approximation that will get too many methods + // and not always correctly relate them to the slots they implement. For example, + // we may get an override from a base class and believe it implements a fresh, new abstract + // slot in a subclass. + for minfos in infoReader.GetRawIntrinsicMethodSetsOfType(None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes,reqdTyRange,reqdTy) do + for minfo in minfos do + if not minfo.IsAbstract then + yield GetInheritedMemberOverrideInfo g amap reqdTyRange CanImplementAnyClassHierarchySlot minfo ] + + // We also collect up the properties. This is used for abstract slot inference when overriding properties + let isRelevantRequiredProperty (x:PropInfo) = + (x.IsVirtualProperty && not (isInterfaceTy g reqdTy)) || + isImpliedInterfaceType x.EnclosingType + + let reqdProperties = + GetIntrinsicPropInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange reqdTy + |> List.filter isRelevantRequiredProperty + + let dispatchSlotsKeyed = dispatchSlots |> NameMultiMap.initBy (fun (RequiredSlot(v,_)) -> v.LogicalName) + yield SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, reqdProperties) ] + + + /// Check that a type definition implements all its required interfaces after processing all declarations + /// within a file. + let CheckImplementationRelationAtEndOfInferenceScope (infoReader :InfoReader,denv,nenv,sink,tycon:Tycon,isImplementation) = + + let g = infoReader.g + let amap = infoReader.amap + + let tcaug = tycon.TypeContents + let interfaces = tycon.ImmediateInterfacesOfFSharpTycon |> List.map (fun (ity,_compgen,m) -> (ity,m)) + + let overallTy = generalizedTyconRef (mkLocalTyconRef tycon) + + let allReqdTys = (overallTy,tycon.Range) :: interfaces + + // Get all the members that are immediately part of this type + // Include the auto-generated members + let allImmediateMembers = tycon.MembersOfFSharpTyconSorted @ tycon.AllGeneratedValues + + // Get all the members we have to implement, organized by each type we explicitly implement + let slotImplSets = GetSlotImplSets infoReader denv false allReqdTys + + let allImpls = List.zip allReqdTys slotImplSets + + // Find the methods relevant to implementing the abstract slots listed under the reqdType being checked. + let allImmediateMembersThatMightImplementDispatchSlots = + allImmediateMembers |> List.filter (fun overrideBy -> + overrideBy.IsInstanceMember && // exclude static + overrideBy.IsVirtualMember && // exclude non virtual (e.g. keep override/default). [4469] + not overrideBy.IsDispatchSlotMember) + + let mustOverrideSomething reqdTy (overrideBy:ValRef) = + let memberInfo = overrideBy.MemberInfo.Value + not (overrideBy.IsFSharpEventProperty(g)) && + memberInfo.MemberFlags.IsOverrideOrExplicitImpl && + + match memberInfo.ImplementedSlotSigs with + | [] -> + // Are we looking at the implementation of the class hierarchy? If so include all the override members + not (isInterfaceTy g reqdTy) + | ss -> + ss |> List.forall (fun ss -> + let ty = ss.ImplementedType + if isInterfaceTy g ty then + // Is this a method impl listed under the reqdTy? + typeEquiv g ty reqdTy + else + not (isInterfaceTy g reqdTy) ) + + + // We check all the abstracts related to the class hierarchy and then check each interface implementation + for ((reqdTy,m),slotImplSet) in allImpls do + let (SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides,_)) = slotImplSet + try + + // Now extract the information about each overriding method relevant to this SlotImplSet + let allImmediateMembersThatMightImplementDispatchSlots = + allImmediateMembersThatMightImplementDispatchSlots + |> List.map (fun overrideBy -> overrideBy,GetTypeMemberOverrideInfo g reqdTy overrideBy) + + // Now check the implementation + // We don't give missing method errors for abstract classes + + if isImplementation && not (isInterfaceTy g overallTy) then + let overrides = allImmediateMembersThatMightImplementDispatchSlots |> List.map snd + let allCorrect = CheckDispatchSlotsAreImplemented (denv,g,amap,m,nenv,sink,tcaug.tcaug_abstract,reqdTy,dispatchSlots,availPriorOverrides,overrides) + + // Tell the user to mark the thing abstract if it was missing implementations + if not allCorrect && not tcaug.tcaug_abstract && not (isInterfaceTy g reqdTy) then + errorR(TypeIsImplicitlyAbstract(m)) + + let overridesToCheck = + allImmediateMembersThatMightImplementDispatchSlots + |> List.filter (fst >> mustOverrideSomething reqdTy) + |> List.map snd + + CheckOverridesAreAllUsedOnce (denv, g, amap, false, reqdTy, dispatchSlotsKeyed, availPriorOverrides, overridesToCheck) + + with e -> errorRecovery e m + + // Now record the full slotsigs of the abstract members implemented by each override. + // This is used to generate IL MethodImpls in the code generator. + allImmediateMembersThatMightImplementDispatchSlots |> List.iter (fun overrideBy -> + + let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) + let overriden = + if isFakeEventProperty then + let slotsigs = overrideBy.MemberInfo.Value.ImplementedSlotSigs + slotsigs |> List.map (ReparentSlotSigToUseMethodTypars g overrideBy.Range overrideBy) + else + [ for ((reqdTy,m),(SlotImplSet(_dispatchSlots,dispatchSlotsKeyed,_,_))) in allImpls do + let overrideByInfo = GetTypeMemberOverrideInfo g reqdTy overrideBy + let overridenForThisSlotImplSet = + [ for (RequiredSlot(dispatchSlot,_)) in NameMultiMap.find overrideByInfo.LogicalName dispatchSlotsKeyed do + if OverrideImplementsDispatchSlot g amap m dispatchSlot overrideByInfo then + if tyconRefEq g overrideByInfo.BoundingTyconRef (tcrefOfAppTy g dispatchSlot.EnclosingType) then + match dispatchSlot.ArbitraryValRef with + | Some virtMember -> + if virtMember.MemberInfo.Value.IsImplemented then errorR(Error(FSComp.SR.tcDefaultImplementationAlreadyExists(),overrideByInfo.Range)) + virtMember.MemberInfo.Value.IsImplemented <- true + | None -> () // not an F# slot + + // Get the slotsig of the overridden method + let slotsig = dispatchSlot.GetSlotSig(amap, m) + + // The slotsig from the overridden method is in terms of the type parameters on the parent type of the overriding method, + // Modify map the slotsig so it is in terms of the type parameters for the overriding method + let slotsig = ReparentSlotSigToUseMethodTypars g m overrideBy slotsig + + // Record the slotsig via mutation + yield slotsig ] + //if mustOverrideSomething reqdTy overrideBy then + // assert nonNil overridenForThisSlotImplSet + yield! overridenForThisSlotImplSet ] + + overrideBy.MemberInfo.Value.ImplementedSlotSigs <- overriden) + + + +//------------------------------------------------------------------------- +// "Type Completion" inference and a few other checks at the end of the inference scope +//------------------------------------------------------------------------- + + +/// "Type Completion" inference and a few other checks at the end of the inference scope +let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, sink, isImplementation, denv) (tycon:Tycon) = + + let g = infoReader.g + let amap = infoReader.amap + + let tcaug = tycon.TypeContents + tcaug.tcaug_closed <- true + + // Note you only have to explicitly implement 'System.IComparable' to customize structural comparison AND equality on F# types + if isImplementation && +#if EXTENSIONTYPING + not tycon.IsProvidedGeneratedTycon && +#endif + isNone tycon.GeneratedCompareToValues && + tycon.HasInterface g g.mk_IComparable_ty && + not (tycon.HasOverride g "Equals" [g.obj_ty]) && + not tycon.IsFSharpInterfaceTycon + then + (* Warn when we're doing this for class types *) + if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals g tycon then + warning(Error(FSComp.SR.typrelTypeImplementsIComparableShouldOverrideObjectEquals(tycon.DisplayName),tycon.Range)) + else + warning(Error(FSComp.SR.typrelTypeImplementsIComparableDefaultObjectEqualsProvided(tycon.DisplayName),tycon.Range)) + + AugmentWithHashCompare.CheckAugmentationAttribs isImplementation g amap tycon + // Check some conditions about generic comparison and hashing. We can only check this condition after we've done the augmentation + if isImplementation +#if EXTENSIONTYPING + && not tycon.IsProvidedGeneratedTycon +#endif + then + let tcaug = tycon.TypeContents + let m = tycon.Range + let hasExplicitObjectGetHashCode = tycon.HasOverride g "GetHashCode" [] + let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty] + + if (isSome tycon.GeneratedHashAndEqualsWithComparerValues) && + (hasExplicitObjectGetHashCode || hasExplicitObjectEqualsOverride) then + errorR(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCodeOrEquals(tycon.DisplayName),m)) + + if not hasExplicitObjectEqualsOverride && hasExplicitObjectGetHashCode then + warning(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCode(tycon.DisplayName),m)) + + if hasExplicitObjectEqualsOverride && not hasExplicitObjectGetHashCode then + warning(Error(FSComp.SR.typrelExplicitImplementationOfEquals(tycon.DisplayName),m)) + + + // remember these values to ensure we don't generate these methods during codegen + tcaug.SetHasObjectGetHashCode hasExplicitObjectGetHashCode + + if not tycon.IsHiddenReprTycon + && not tycon.IsTypeAbbrev + && not tycon.IsMeasureableReprTycon + && not tycon.IsAsmReprTycon + && not tycon.IsFSharpInterfaceTycon + && not tycon.IsFSharpDelegateTycon then + + DispatchSlotChecking.CheckImplementationRelationAtEndOfInferenceScope (infoReader,denv,nenv,sink,tycon,isImplementation) + +/// Get the methods relevant to determining if a uniquely-identified-override exists based on the syntactic information +/// at the member signature prior to type inference. This is used to pre-assign type information if it does +let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,valSynData) = + let minfos = + match typToSearchForAbstractMembers with + | _,Some(SlotImplSet(_, dispatchSlotsKeyed,_,_)) -> + NameMultiMap.find memberName.idText dispatchSlotsKeyed |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) + | ty, None -> + GetIntrinsicMethInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty + let dispatchSlots = minfos |> List.filter (fun minfo -> minfo.IsDispatchSlot) + let topValSynArities = SynInfo.AritiesOfArgs valSynData + let topValSynArities = if topValSynArities.Length > 0 then topValSynArities.Tail else topValSynArities + let dispatchSlotsArityMatch = dispatchSlots |> List.filter (fun minfo -> minfo.NumArgs = topValSynArities) + dispatchSlots,dispatchSlotsArityMatch + +/// Get the properties relevant to determining if a uniquely-identified-override exists based on the syntactic information +/// at the member signature prior to type inference. This is used to pre-assign type information if it does +let GetAbstractPropInfosForSynPropertyDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,_k,_valSynData) = + let pinfos = + match typToSearchForAbstractMembers with + | _,Some(SlotImplSet(_,_,_,reqdProps)) -> + reqdProps |> List.filter (fun pinfo -> pinfo.PropertyName = memberName.idText) + | ty, None -> + GetIntrinsicPropInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty + + let dispatchSlots = pinfos |> List.filter (fun pinfo -> pinfo.IsVirtualProperty) + dispatchSlots + diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 89408ce27da..8c5b65ebd89 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -24,8 +24,9 @@ open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library.ResultOrException open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.IL // Abstract IL open Microsoft.FSharp.Compiler.Infos -open Microsoft.FSharp.Compiler.Infos.AccessibilityLogic -open Microsoft.FSharp.Compiler.Infos.AttributeChecking +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.AttributeChecking +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.PrettyNaming open System.Collections.Generic diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 02a629728ea..ccad006c207 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -3,18 +3,18 @@ module internal Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Import +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.PrettyNaming - - /// A NameResolver is a context for name resolution. It primarily holds an InfoReader. type NameResolver = new : g:TcGlobals * amap:ImportMap * infoReader:InfoReader * instantiationGenerator:(range -> Typars -> TypeInst) -> NameResolver @@ -410,4 +410,4 @@ type ResolveCompletionTargets = | SettablePropertiesAndFields /// Resolve a (possibly incomplete) long identifier to a set of possible resolutions, qualified by type. -val ResolveCompletionsInType : NameResolver -> NameResolutionEnv -> ResolveCompletionTargets -> Range.range -> Infos.AccessorDomain -> bool -> TType -> Item list +val ResolveCompletionsInType : NameResolver -> NameResolutionEnv -> ResolveCompletionTargets -> Range.range -> AccessorDomain -> bool -> TType -> Item list diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index a9b829834c6..28c0570250f 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -10,11 +10,11 @@ module internal Microsoft.FSharp.Compiler.NicePrint open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Rational open Microsoft.FSharp.Compiler.Ast @@ -23,17 +23,20 @@ open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.AbstractIL.IL (* Abstract IL *) open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.InfoReader +open Microsoft.FSharp.Compiler.AttributeChecking +open Microsoft.FSharp.Compiler.Layout +open Microsoft.FSharp.Compiler.PrettyNaming + open Microsoft.FSharp.Core.Printf + #if EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping open Microsoft.FSharp.Core.CompilerServices #endif -open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.PrettyNaming [] module internal PrintUtilities = @@ -1448,8 +1451,8 @@ module private TastDefinitionPrinting = match valRef with | None -> true | Some(vr) -> - (denv.showObsoleteMembers || not (Infos.AttributeChecking.CheckFSharpAttributesForObsolete denv.g vr.Attribs)) && - (denv.showHiddenMembers || not (Infos.AttributeChecking.CheckFSharpAttributesForHidden denv.g vr.Attribs)) + (denv.showObsoleteMembers || not (CheckFSharpAttributesForObsolete denv.g vr.Attribs)) && + (denv.showHiddenMembers || not (CheckFSharpAttributesForHidden denv.g vr.Attribs)) let ctors = GetIntrinsicConstructorInfosOfType infoReader m ty @@ -1582,8 +1585,8 @@ module private TastDefinitionPrinting = // Don't print individual methods forming interface implementations - these are currently never exported not (isInterfaceTy denv.g oty) | [] -> true) - |> List.filter (fun v -> denv.showObsoleteMembers || not (Infos.AttributeChecking.CheckFSharpAttributesForObsolete denv.g v.Attribs)) - |> List.filter (fun v -> denv.showHiddenMembers || not (Infos.AttributeChecking.CheckFSharpAttributesForHidden denv.g v.Attribs)) + |> List.filter (fun v -> denv.showObsoleteMembers || not (CheckFSharpAttributesForObsolete denv.g v.Attribs)) + |> List.filter (fun v -> denv.showHiddenMembers || not (CheckFSharpAttributesForHidden denv.g v.Attribs)) // sort let sortKey (v:ValRef) = (not v.IsConstructor, // constructors before others v.Id.idText, // sort by name diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 1130f7d1868..0bb9b2dfe87 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -11,28 +11,27 @@ module internal Microsoft.FSharp.Compiler.Optimizer open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX -open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.AbstractIL.IL -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics - -open Microsoft.FSharp.Compiler.TastPickle +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.PrettyNaming open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.TastPickle open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.TypeChecker open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.TypeRelations -open Microsoft.FSharp.Compiler.Infos open System.Collections.Generic diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 4d0f15a4ab9..bf05aca6eaa 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -13,18 +13,20 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics -open Microsoft.FSharp.Compiler.Range + +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.AbstractIL.IL -open Microsoft.FSharp.Compiler.TypeRelations open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.InfoReader +open Microsoft.FSharp.Compiler.TypeRelations diff --git a/src/fsharp/PostInferenceChecks.fsi b/src/fsharp/PostInferenceChecks.fsi index 834cd92b6ac..d6a58bd9cb9 100644 --- a/src/fsharp/PostInferenceChecks.fsi +++ b/src/fsharp/PostInferenceChecks.fsi @@ -6,6 +6,7 @@ module internal Microsoft.FSharp.Compiler.PostTypeCheckSemanticChecks open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.TcGlobals +open Microsoft.FSharp.Compiler.InfoReader val testFlagMemberBody : bool ref -val CheckTopImpl : TcGlobals * Import.ImportMap * bool * Infos.InfoReader * Tast.CompilationPath list * Tast.CcuThunk * Tastops.DisplayEnv * Tast.ModuleOrNamespaceExprWithSig * Tast.Attribs * bool -> bool +val CheckTopImpl : TcGlobals * Import.ImportMap * bool * InfoReader * Tast.CompilationPath list * Tast.CcuThunk * Tastops.DisplayEnv * Tast.ModuleOrNamespaceExprWithSig * Tast.Attribs * bool -> bool diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs new file mode 100644 index 00000000000..28db41d7146 --- /dev/null +++ b/src/fsharp/SignatureConformance.fs @@ -0,0 +1,638 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Primary relations on types and signatures, with the exception of +/// constraint solving and method overload resolution. +module internal Microsoft.FSharp.Compiler.SignatureConformance + +open Internal.Utilities +open System.Text + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.Tastops +open Microsoft.FSharp.Compiler.Tastops.DebugPrint +open Microsoft.FSharp.Compiler.TcGlobals +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.TypeRelations + +#if EXTENSIONTYPING +open Microsoft.FSharp.Compiler.ExtensionTyping +#endif + + +exception RequiredButNotSpecified of DisplayEnv * Tast.ModuleOrNamespaceRef * string * (StringBuilder -> unit) * range +exception ValueNotContained of DisplayEnv * Tast.ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) +exception ConstrNotContained of DisplayEnv * UnionCase * UnionCase * (string * string -> string) +exception ExnconstrNotContained of DisplayEnv * Tycon * Tycon * (string * string -> string) +exception FieldNotContained of DisplayEnv * RecdField * RecdField * (string * string -> string) +exception InterfaceNotRevealed of DisplayEnv * TType * range + + +// Use a type to capture the constant, common parameters +type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = + + // Build a remap that maps tcrefs in the signature to tcrefs in the implementation + // Used when checking attributes. + let sigToImplRemap = + let remap = Remap.Empty + let remap = (remapInfo.mrpiEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) + let remap = (remapInfo.mrpiVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) + remap + + // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) + // + // (a) Start with lists AImpl and ASig containing the attributes in the implementation and signature, in declaration order + // (b) Each attribute in AImpl is checked against the available attributes in ASig. + // a. If an attribute is found in ASig which is an exact match (after evaluating attribute arguments), then the attribute in the implementation is ignored, the attribute is removed from ASig, and checking continues + // b. If an attribute is found in ASig that has the same attribute type, then a warning is given and the attribute in the implementation is ignored + // c. Otherwise, the attribute in the implementation is kept + // (c) The attributes appearing in the compiled element are the compiled forms of the attributes from the signature and the kept attributes from the implementation + let checkAttribs _aenv (implAttribs:Attribs) (sigAttribs:Attribs) fixup = + + // Remap the signature attributes to make them look as if they were declared in + // the implementation. This allows us to compare them and propagate them to the implementation + // if needed. + let sigAttribs = sigAttribs |> List.map (remapAttrib g sigToImplRemap) + + // Helper to check for equality of evaluated attribute expressions + let attribExprEq (AttribExpr(_,e1)) (AttribExpr(_,e2)) = EvaledAttribExprEquality g e1 e2 + + // Helper to check for equality of evaluated named attribute arguments + let attribNamedArgEq (AttribNamedArg(nm1,ty1,isProp1,e1)) (AttribNamedArg(nm2,ty2,isProp2,e2)) = + (nm1 = nm2) && + typeEquiv g ty1 ty2 && + (isProp1 = isProp2) && + attribExprEq e1 e2 + + let attribsEq attrib1 attrib2 = + let (Attrib(implTcref,_,implArgs,implNamedArgs,_,_,_implRange)) = attrib1 + let (Attrib(signTcref,_,signArgs,signNamedArgs,_,_,_signRange)) = attrib2 + tyconRefEq g signTcref implTcref && + (implArgs,signArgs) ||> List.lengthsEqAndForall2 attribExprEq && + (implNamedArgs, signNamedArgs) ||> List.lengthsEqAndForall2 attribNamedArgEq + + let attribsHaveSameTycon attrib1 attrib2 = + let (Attrib(implTcref,_,_,_,_,_,_)) = attrib1 + let (Attrib(signTcref,_,_,_,_,_,_)) = attrib2 + tyconRefEq g signTcref implTcref + + // For each implementation attribute, only keep if it is not mentioned in the signature. + // Emit a warning if it is mentioned in the signature and the arguments to the attributes are + // not identical. + let rec check keptImplAttribsRev implAttribs sigAttribs = + match implAttribs with + | [] -> keptImplAttribsRev |> List.rev + | implAttrib :: remainingImplAttribs -> + + // Look for an attribute in the signature that matches precisely. If so, remove it + let lookForMatchingAttrib = sigAttribs |> List.tryRemove (attribsEq implAttrib) + match lookForMatchingAttrib with + | Some (_, remainingSigAttribs) -> check keptImplAttribsRev remainingImplAttribs remainingSigAttribs + | None -> + + // Look for an attribute in the signature that has the same type. If so, give a warning + let existsSimilarAttrib = sigAttribs |> List.exists (attribsHaveSameTycon implAttrib) + + if existsSimilarAttrib then + let (Attrib(implTcref,_,_,_,_,_,implRange)) = implAttrib + warning(Error(FSComp.SR.tcAttribArgsDiffer(implTcref.DisplayName), implRange)) + check keptImplAttribsRev remainingImplAttribs sigAttribs + else + check (implAttrib :: keptImplAttribsRev) remainingImplAttribs sigAttribs + + let keptImplAttribs = check [] implAttribs sigAttribs + + fixup (sigAttribs @ keptImplAttribs) + true + + let rec checkTypars m (aenv: TypeEquivEnv) (implTypars:Typars) (sigTypars:Typars) = + if implTypars.Length <> sigTypars.Length then + errorR (Error(FSComp.SR.typrelSigImplNotCompatibleParamCountsDiffer(),m)) + false + else + let aenv = aenv.BindEquivTypars implTypars sigTypars + (implTypars,sigTypars) ||> List.forall2 (fun implTypar sigTypar -> + let m = sigTypar.Range + if implTypar.StaticReq <> sigTypar.StaticReq then + errorR (Error(FSComp.SR.typrelSigImplNotCompatibleCompileTimeRequirementsDiffer(), m)) + + // Adjust the actual type parameter name to look like the signature + implTypar.SetIdent (mkSynId implTypar.Range sigTypar.Id.idText) + + // Mark it as "not compiler generated", now that we've got a good name for it + implTypar.SetCompilerGenerated false + + // Check the constraints in the implementation are present in the signature + implTypar.Constraints |> List.forall (fun implTyparCx -> + match implTyparCx with + // defaults can be dropped in the signature + | TyparConstraint.DefaultsTo(_,_acty,_) -> true + | _ -> + if not (List.exists (typarConstraintsAEquiv g aenv implTyparCx) sigTypar.Constraints) + then (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDiffer(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (implTypar,implTyparCx))),m)); false) + else true) && + + // Check the constraints in the signature are present in the implementation + sigTypar.Constraints |> List.forall (fun sigTyparCx -> + match sigTyparCx with + // defaults can be present in the signature and not in the implementation because they are erased + | TyparConstraint.DefaultsTo(_,_acty,_) -> true + // 'comparison' and 'equality' constraints can be present in the signature and not in the implementation because they are erased + | TyparConstraint.SupportsComparison _ -> true + | TyparConstraint.SupportsEquality _ -> true + | _ -> + if not (List.exists (fun implTyparCx -> typarConstraintsAEquiv g aenv implTyparCx sigTyparCx) implTypar.Constraints) then + (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDifferRemove(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (sigTypar,sigTyparCx))),m)); false) + else + true) && + (not checkingSig || checkAttribs aenv implTypar.Attribs sigTypar.Attribs (fun attribs -> implTypar.Data.typar_attribs <- attribs))) + + and checkTypeDef (aenv: TypeEquivEnv) (implTycon:Tycon) (sigTycon:Tycon) = + let m = implTycon.Range + // Propagate defn location information from implementation to signature . + sigTycon.SetOtherRange (implTycon.Range, true) + implTycon.SetOtherRange (sigTycon.Range, false) + let err f = Error(f(implTycon.TypeOrMeasureKind.ToString()), m) + if implTycon.LogicalName <> sigTycon.LogicalName then (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer)); false) else + if implTycon.CompiledName <> sigTycon.CompiledName then (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer)); false) else + checkExnInfo (fun f -> ExnconstrNotContained(denv,implTycon,sigTycon,f)) aenv implTycon.ExceptionInfo sigTycon.ExceptionInfo && + let implTypars = implTycon.Typars m + let sigTypars = sigTycon.Typars m + if implTypars.Length <> sigTypars.Length then + errorR (err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer)) + false + elif isLessAccessible implTycon.Accessibility sigTycon.Accessibility then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer)) + false + else + let aenv = aenv.BindEquivTypars implTypars sigTypars + + let aintfs = implTycon.ImmediateInterfaceTypesOfFSharpTycon + let fintfs = sigTycon.ImmediateInterfaceTypesOfFSharpTycon + let aintfsUser = implTycon.TypeContents.tcaug_interfaces |> List.filter (fun (_,compgen,_) -> not compgen) |> List.map p13 + let flatten tys = + tys + |> List.collect (AllSuperTypesOfType g amap m AllowMultiIntfInstantiations.Yes) + |> ListSet.setify (typeEquiv g) + |> List.filter (isInterfaceTy g) + let aintfs = flatten aintfs + let aintfsUser = flatten aintfsUser + let fintfs = flatten fintfs + + let unimpl = ListSet.subtract (fun fity aity -> typeAEquiv g aenv aity fity) fintfs aintfs + (unimpl |> List.forall (fun ity -> errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(x, NicePrint.minimalStringOfType denv ity))); false)) && + let hidden = ListSet.subtract (typeAEquiv g aenv) aintfsUser fintfs + hidden |> List.iter (fun ity -> (if implTycon.IsFSharpInterfaceTycon then error else warning) (InterfaceNotRevealed(denv,ity,implTycon.Range))) + + let aNull = IsUnionTypeWithNullAsTrueValue g implTycon + let fNull = IsUnionTypeWithNullAsTrueValue g sigTycon + if aNull && not fNull then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull)) + elif fNull && not aNull then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull)) + + let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) + let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) + if aNull2 && not fNull2 then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2)) + elif fNull2 && not aNull2 then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2)) + + let aSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef implTycon)) + let fSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef sigTycon)) + if aSealed && not fSealed then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed)) + if not aSealed && fSealed then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed)) + + let aPartial = isAbstractTycon implTycon + let fPartial = isAbstractTycon sigTycon + if aPartial && not fPartial then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract)) + + if not aPartial && fPartial then + errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract)) + + if not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then + errorR (err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes)) + + checkTypars m aenv implTypars sigTypars && + checkTypeRepr err aenv implTycon.TypeReprInfo sigTycon.TypeReprInfo && + checkTypeAbbrev err aenv implTycon.TypeOrMeasureKind sigTycon.TypeOrMeasureKind implTycon.TypeAbbrev sigTycon.TypeAbbrev && + checkAttribs aenv implTycon.Attribs sigTycon.Attribs (fun attribs -> implTycon.Data.entity_attribs <- attribs) && + checkModuleOrNamespaceContents implTycon.Range aenv (mkLocalEntityRef implTycon) sigTycon.ModuleOrNamespaceType + + and checkValInfo aenv err (implVal : Val) (sigVal : Val) = + let id = implVal.Id + match implVal.ValReprInfo, sigVal.ValReprInfo with + | _,None -> true + | None, Some _ -> err(FSComp.SR.ValueNotContainedMutabilityArityNotInferred) + | Some (ValReprInfo (implTyparNames,implArgInfos,implRetInfo) as implValInfo), Some (ValReprInfo (sigTyparNames,sigArgInfos,sigRetInfo) as sigValInfo) -> + let ntps = implTyparNames.Length + let mtps = sigTyparNames.Length + if ntps <> mtps then + err(fun(x, y, z) -> FSComp.SR.ValueNotContainedMutabilityGenericParametersDiffer(x, y, z, string mtps, string ntps)) + elif implValInfo.KindsOfTypars <> sigValInfo.KindsOfTypars then + err(FSComp.SR.ValueNotContainedMutabilityGenericParametersAreDifferentKinds) + elif not (sigArgInfos.Length <= implArgInfos.Length && List.forall2 (fun x y -> List.length x <= List.length y) sigArgInfos (fst (List.chop sigArgInfos.Length implArgInfos))) then + err(fun(x, y, z) -> FSComp.SR.ValueNotContainedMutabilityAritiesDiffer(x, y, z, id.idText, string sigArgInfos.Length, id.idText, id.idText)) + else + let implArgInfos = implArgInfos |> List.take sigArgInfos.Length + let implArgInfos = (implArgInfos, sigArgInfos) ||> List.map2 (fun l1 l2 -> l1 |> List.take l2.Length) + // Propagate some information signature to implementation. + + // Check the attributes on each argument, and update the ValReprInfo for + // the value to reflect the information in the signature. + // This ensures that the compiled form of the value matches the signature rather than + // the implementation. This also propagates argument names from signature to implementation + let res = + (implArgInfos,sigArgInfos) ||> List.forall2 (List.forall2 (fun implArgInfo sigArgInfo -> + checkAttribs aenv implArgInfo.Attribs sigArgInfo.Attribs (fun attribs -> + implArgInfo.Name <- sigArgInfo.Name + implArgInfo.Attribs <- attribs))) && + + checkAttribs aenv implRetInfo.Attribs sigRetInfo.Attribs (fun attribs -> + implRetInfo.Name <- sigRetInfo.Name + implRetInfo.Attribs <- attribs) + + implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames,implArgInfos,implRetInfo))) + res + + and checkVal implModRef (aenv:TypeEquivEnv) (implVal:Val) (sigVal:Val) = + + // Propagate defn location information from implementation to signature . + sigVal.SetOtherRange (implVal.Range, true) + implVal.SetOtherRange (sigVal.Range, false) + + let mk_err denv f = ValueNotContained(denv,implModRef,implVal,sigVal,f) + let err denv f = errorR(mk_err denv f); false + let m = implVal.Range + if implVal.IsMutable <> sigVal.IsMutable then (err denv FSComp.SR.ValueNotContainedMutabilityAttributesDiffer) + elif implVal.LogicalName <> sigVal.LogicalName then (err denv FSComp.SR.ValueNotContainedMutabilityNamesDiffer) + elif implVal.CompiledName <> sigVal.CompiledName then (err denv FSComp.SR.ValueNotContainedMutabilityCompiledNamesDiffer) + elif implVal.DisplayName <> sigVal.DisplayName then (err denv FSComp.SR.ValueNotContainedMutabilityDisplayNamesDiffer) + elif isLessAccessible implVal.Accessibility sigVal.Accessibility then (err denv FSComp.SR.ValueNotContainedMutabilityAccessibilityMore) + elif implVal.MustInline <> sigVal.MustInline then (err denv FSComp.SR.ValueNotContainedMutabilityInlineFlagsDiffer) + elif implVal.LiteralValue <> sigVal.LiteralValue then (err denv FSComp.SR.ValueNotContainedMutabilityLiteralConstantValuesDiffer) + elif implVal.IsTypeFunction <> sigVal.IsTypeFunction then (err denv FSComp.SR.ValueNotContainedMutabilityOneIsTypeFunction) + else + let implTypars,atau = implVal.TypeScheme + let sigTypars,ftau = sigVal.TypeScheme + if implTypars.Length <> sigTypars.Length then (err {denv with showTyparBinding=true} FSComp.SR.ValueNotContainedMutabilityParameterCountsDiffer) else + let aenv = aenv.BindEquivTypars implTypars sigTypars + checkTypars m aenv implTypars sigTypars && + if not (typeAEquiv g aenv atau ftau) then err denv (FSComp.SR.ValueNotContainedMutabilityTypesDiffer) + elif not (checkValInfo aenv (err denv) implVal sigVal) then false + elif not (implVal.IsExtensionMember = sigVal.IsExtensionMember) then err denv (FSComp.SR.ValueNotContainedMutabilityExtensionsDiffer) + elif not (checkMemberDatasConform (err denv) (implVal.Attribs, implVal,implVal.MemberInfo) (sigVal.Attribs,sigVal,sigVal.MemberInfo)) then false + else checkAttribs aenv implVal.Attribs sigVal.Attribs (fun attribs -> implVal.Data.val_attribs <- attribs) + + + and checkExnInfo err aenv implTypeRepr sigTypeRepr = + match implTypeRepr,sigTypeRepr with + | TExnAsmRepr _, TExnFresh _ -> + (errorR (err FSComp.SR.ExceptionDefsNotCompatibleHiddenBySignature); false) + | TExnAsmRepr tcr1, TExnAsmRepr tcr2 -> + if tcr1 <> tcr2 then (errorR (err FSComp.SR.ExceptionDefsNotCompatibleDotNetRepresentationsDiffer); false) else true + | TExnAbbrevRepr _, TExnFresh _ -> + (errorR (err FSComp.SR.ExceptionDefsNotCompatibleAbbreviationHiddenBySignature); false) + | TExnAbbrevRepr ecr1, TExnAbbrevRepr ecr2 -> + if not (tcrefAEquiv g aenv ecr1 ecr2) then + (errorR (err FSComp.SR.ExceptionDefsNotCompatibleSignaturesDiffer); false) + else true + | TExnFresh r1, TExnFresh r2-> checkRecordFieldsForExn g denv err aenv r1 r2 + | TExnNone,TExnNone -> true + | _ -> + (errorR (err FSComp.SR.ExceptionDefsNotCompatibleExceptionDeclarationsDiffer); false) + + and checkUnionCase aenv implUnionCase sigUnionCase = + let err f = errorR(ConstrNotContained(denv,implUnionCase,sigUnionCase,f));false + sigUnionCase.OtherRangeOpt <- Some (implUnionCase.Range, true) + implUnionCase.OtherRangeOpt <- Some (sigUnionCase.Range, false) + if implUnionCase.Id.idText <> sigUnionCase.Id.idText then err FSComp.SR.ModuleContainsConstructorButNamesDiffer + elif implUnionCase.RecdFields.Length <> sigUnionCase.RecdFields.Length then err FSComp.SR.ModuleContainsConstructorButDataFieldsDiffer + elif not (List.forall2 (checkField aenv) implUnionCase.RecdFields sigUnionCase.RecdFields) then err FSComp.SR.ModuleContainsConstructorButTypesOfFieldsDiffer + elif isLessAccessible implUnionCase.Accessibility sigUnionCase.Accessibility then err FSComp.SR.ModuleContainsConstructorButAccessibilityDiffers + else checkAttribs aenv implUnionCase.Attribs sigUnionCase.Attribs (fun attribs -> implUnionCase.Attribs <- attribs) + + and checkField aenv implField sigField = + let err f = errorR(FieldNotContained(denv,implField,sigField,f)); false + sigField.rfield_other_range <- Some (implField.Range, true) + implField.rfield_other_range <- Some (sigField.Range, false) + if implField.rfield_id.idText <> sigField.rfield_id.idText then err FSComp.SR.FieldNotContainedNamesDiffer + elif isLessAccessible implField.Accessibility sigField.Accessibility then err FSComp.SR.FieldNotContainedAccessibilitiesDiffer + elif implField.IsStatic <> sigField.IsStatic then err FSComp.SR.FieldNotContainedStaticsDiffer + elif implField.IsMutable <> sigField.IsMutable then err FSComp.SR.FieldNotContainedMutablesDiffer + elif implField.LiteralValue <> sigField.LiteralValue then err FSComp.SR.FieldNotContainedLiteralsDiffer + elif not (typeAEquiv g aenv implField.FormalType sigField.FormalType) then err FSComp.SR.FieldNotContainedTypesDiffer + else + checkAttribs aenv implField.FieldAttribs sigField.FieldAttribs (fun attribs -> implField.rfield_fattribs <- attribs) && + checkAttribs aenv implField.PropertyAttribs sigField.PropertyAttribs (fun attribs -> implField.rfield_pattribs <- attribs) + + and checkMemberDatasConform err (_implAttrs,implVal,implMemberInfo) (_sigAttrs, sigVal,sigMemberInfo) = + match implMemberInfo,sigMemberInfo with + | None,None -> true + | Some implMembInfo, Some sigMembInfo -> + if not (implVal.CompiledName = sigVal.CompiledName) then + err(FSComp.SR.ValueNotContainedMutabilityDotNetNamesDiffer) + elif not (implMembInfo.MemberFlags.IsInstance = sigMembInfo.MemberFlags.IsInstance) then + err(FSComp.SR.ValueNotContainedMutabilityStaticsDiffer) + elif false then + err(FSComp.SR.ValueNotContainedMutabilityVirtualsDiffer) + elif not (implMembInfo.MemberFlags.IsDispatchSlot = sigMembInfo.MemberFlags.IsDispatchSlot) then + err(FSComp.SR.ValueNotContainedMutabilityAbstractsDiffer) + // The final check is an implication: + // classes have non-final CompareTo/Hash methods + // abstract have non-final CompareTo/Hash methods + // records have final CompareTo/Hash methods + // unions have final CompareTo/Hash methods + // This is an example where it is OK for the signature to say 'non-final' when the implementation says 'final' + elif not implMembInfo.MemberFlags.IsFinal && sigMembInfo.MemberFlags.IsFinal then + err(FSComp.SR.ValueNotContainedMutabilityFinalsDiffer) + elif not (implMembInfo.MemberFlags.IsOverrideOrExplicitImpl = sigMembInfo.MemberFlags.IsOverrideOrExplicitImpl) then + err(FSComp.SR.ValueNotContainedMutabilityOverridesDiffer) + elif not (implMembInfo.MemberFlags.MemberKind = sigMembInfo.MemberFlags.MemberKind) then + err(FSComp.SR.ValueNotContainedMutabilityOneIsConstructor) + else + let finstance = ValSpecIsCompiledAsInstance g sigVal + let ainstance = ValSpecIsCompiledAsInstance g implVal + if finstance && not ainstance then + err(FSComp.SR.ValueNotContainedMutabilityStaticButInstance) + elif not finstance && ainstance then + err(FSComp.SR.ValueNotContainedMutabilityInstanceButStatic) + else true + + | _ -> false + + // ------------------------------------------------------------------------------- + // WARNING!!!! + // checkRecordFields and checkRecordFieldsForExn are the EXACT SAME FUNCTION. + // The only difference is the signature for err - this is because err is a function + // that reports errors, and checkRecordFields is called with a different + // sig for err then checkRecordFieldsForExn. + // ------------------------------------------------------------------------------- + + and checkRecordFields _g _amap _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + let implFields = implFields.TrueFieldsAsList + let sigFields = sigFields.TrueFieldsAsList + let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(x, s))); false) (checkField aenv) m1 m2 && + NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldWasPresent(x, s))); false) (fun x y -> checkField aenv y x) m2 m1 && + // This check is required because constructors etc. are externally visible + // and thus compiled representations do pick up dependencies on the field order + (if List.forall2 (checkField aenv) implFields sigFields + then true + else (errorR(err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer)); false)) + + and checkRecordFieldsForExn _g _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + let implFields = implFields.TrueFieldsAsList + let sigFields = sigFields.TrueFieldsAsList + let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInSigButNotImpl(s, x, y))); false) (checkField aenv) m1 m2 && + NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInImplButNotSig(s, x, y))); false) (fun x y -> checkField aenv y x) m2 m1 && + // This check is required because constructors etc. are externally visible + // and thus compiled representations do pick up dependencies on the field order + (if List.forall2 (checkField aenv) implFields sigFields + then true + else (errorR(err (FSComp.SR.ExceptionDefsNotCompatibleFieldOrderDiffers)); false)) + + and checkVirtualSlots _g denv err _aenv implAbstractSlots sigAbstractSlots = + let m1 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) implAbstractSlots + let m2 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) sigAbstractSlots + (m1,m2) ||> NameMap.suball2 (fun _s vref -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(x, NicePrint.stringValOrMember denv vref.Deref))); false) (fun _x _y -> true) && + (m2,m1) ||> NameMap.suball2 (fun _s vref -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(x, NicePrint.stringValOrMember denv vref.Deref))); false) (fun _x _y -> true) + + and checkClassFields isStruct _g _amap _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = + let implFields = implFields.TrueFieldsAsList + let sigFields = sigFields.TrueFieldsAsList + let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) + NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(x, s))); false) (checkField aenv) m1 m2 && + (if isStruct then + NameMap.suball2 (fun s _ -> warning(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(x, s))); true) (fun x y -> checkField aenv y x) m2 m1 + else + true) + + + and checkTypeRepr err aenv implTypeRepr sigTypeRepr = + let reportNiceError k s1 s2 = + let aset = NameSet.ofList s1 + let fset = NameSet.ofList s2 + match Zset.elements (Zset.diff aset fset) with + | [] -> + match Zset.elements (Zset.diff fset aset) with + | [] -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleNumbersDiffer(x, k))); false) + | l -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(x, k, String.concat ";" l))); false) + | l -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(x, k, String.concat ";" l))); false) + + match implTypeRepr,sigTypeRepr with + | (TRecdRepr _ + | TFiniteUnionRepr _ + | TILObjModelRepr _ +#if EXTENSIONTYPING + | TProvidedTypeExtensionPoint _ + | TProvidedNamespaceExtensionPoint _ +#endif + ), TNoRepr -> true + | (TFsObjModelRepr r), TNoRepr -> + match r.fsobjmodel_kind with + | TTyconStruct | TTyconEnum -> + (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesStruct); false) + | _ -> + true + | (TAsmRepr _), TNoRepr -> + (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden); false) + | (TMeasureableRepr _), TNoRepr -> + (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsHidden); false) + | (TFiniteUnionRepr r1), (TFiniteUnionRepr r2) -> + let ucases1 = r1.UnionCasesAsList + let ucases2 = r2.UnionCasesAsList + if ucases1.Length <> ucases2.Length then + let names (l: UnionCase list) = l |> List.map (fun c -> c.Id.idText) + reportNiceError "union case" (names ucases1) (names ucases2) + else List.forall2 (checkUnionCase aenv) ucases1 ucases2 + | (TRecdRepr implFields), (TRecdRepr sigFields) -> + checkRecordFields g amap denv err aenv implFields sigFields + | (TFsObjModelRepr r1), (TFsObjModelRepr r2) -> + if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with + | TTyconClass,TTyconClass -> true + | TTyconInterface,TTyconInterface -> true + | TTyconStruct,TTyconStruct -> true + | TTyconEnum, TTyconEnum -> true + | TTyconDelegate (TSlotSig(_,typ1,ctps1,mtps1,ps1, rty1)), + TTyconDelegate (TSlotSig(_,typ2,ctps2,mtps2,ps2, rty2)) -> + (typeAEquiv g aenv typ1 typ2) && + (ctps1.Length = ctps2.Length) && + (let aenv = aenv.BindEquivTypars ctps1 ctps2 + (typarsAEquiv g aenv ctps1 ctps2) && + (mtps1.Length = mtps2.Length) && + (let aenv = aenv.BindEquivTypars mtps1 mtps2 + (typarsAEquiv g aenv mtps1 mtps2) && + ((ps1,ps2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun p1 p2 -> typeAEquiv g aenv p1.Type p2.Type))) && + (returnTypesAEquiv g aenv rty1 rty2))) + | _,_ -> false) then + (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind); false) + else + let isStruct = (match r1.fsobjmodel_kind with TTyconStruct -> true | _ -> false) + checkClassFields isStruct g amap denv err aenv r1.fsobjmodel_rfields r2.fsobjmodel_rfields && + checkVirtualSlots g denv err aenv r1.fsobjmodel_vslots r2.fsobjmodel_vslots + | (TAsmRepr tcr1), (TAsmRepr tcr2) -> + if tcr1 <> tcr2 then (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleILDiffer); false) else true + | (TMeasureableRepr ty1), (TMeasureableRepr ty2) -> + if typeAEquiv g aenv ty1 ty2 then true else (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) + | TNoRepr, TNoRepr -> true +#if EXTENSIONTYPING + | TProvidedTypeExtensionPoint info1 , TProvidedTypeExtensionPoint info2 -> + Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType,info2.ProvidedType) + | TProvidedNamespaceExtensionPoint _, TProvidedNamespaceExtensionPoint _ -> + System.Diagnostics.Debug.Assert(false, "unreachable: TProvidedNamespaceExtensionPoint only on namespaces, not types" ) + true +#endif + | TNoRepr, _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) + | _, _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) + + and checkTypeAbbrev err aenv kind1 kind2 implTypeAbbrev sigTypeAbbrev = + if kind1 <> kind2 then (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(x, kind2.ToString(), kind1.ToString()))); false) + else + match implTypeAbbrev,sigTypeAbbrev with + | Some ty1, Some ty2 -> + if not (typeAEquiv g aenv ty1 ty2) then + let s1, s2, _ = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 + errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(x, s1, s2))) + false + else + true + | None,None -> true + | Some _, None -> (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig)); false) + | None, Some _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation); false) + + and checkModuleOrNamespaceContents m aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = + let implModType = implModRef.ModuleOrNamespaceType + (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(),m))) + + + (implModType.TypesByMangledName , signModType.TypesByMangledName) + ||> NameMap.suball2 + (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) + (checkTypeDef aenv) && + + + (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) + ||> NameMap.suball2 + (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun x1 x2 -> checkModuleOrNamespace aenv (mkLocalModRef x1) x2) && + + let sigValHadNoMatchingImplementation (fx:Val) (_closeActualVal: Val option) = + errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> + (* In the case of missing members show the full required enclosing type and signature *) + if fx.IsMember then + NicePrint.outputQualifiedValOrMember denv os fx + else + Printf.bprintf os "%s" fx.DisplayName),m)) + + let valuesPartiallyMatch (av:Val) (fv:Val) = + (av.LinkagePartialKey.MemberParentMangledName = fv.LinkagePartialKey.MemberParentMangledName) && + (av.LinkagePartialKey.LogicalName = fv.LinkagePartialKey.LogicalName) && + (av.LinkagePartialKey.TotalArgCount = fv.LinkagePartialKey.TotalArgCount) + + (implModType.AllValsAndMembersByLogicalNameUncached, signModType.AllValsAndMembersByLogicalNameUncached) + ||> NameMap.suball2 + (fun _s (fxs:Val list) -> sigValHadNoMatchingImplementation fxs.Head None; false) + (fun avs fvs -> + match avs,fvs with + | [],_ | _,[] -> failwith "unreachable" + | [av],[fv] -> + if valuesPartiallyMatch av fv then + checkVal implModRef aenv av fv + else + sigValHadNoMatchingImplementation fv None + false + | _ -> + // for each formal requirement, try to find a precisely matching actual requirement + let matchingPairs = + fvs |> List.choose (fun fv -> + match avs |> List.tryFind (fun av -> + let res = valLinkageAEquiv g aenv av fv + //if res then printfn "%s" (bufs (fun buf -> Printf.bprintf buf "YES MATCH: fv '%a', av '%a'" (NicePrint.outputQualifiedValOrMember denv) fv (NicePrint.outputQualifiedValOrMember denv) av)) + //else printfn "%s" (bufs (fun buf -> Printf.bprintf buf "NO MATCH: fv '%a', av '%a'" (NicePrint.outputQualifiedValOrMember denv) fv (NicePrint.outputQualifiedValOrMember denv) av)) + res) with + | None -> None + | Some av -> Some(fv,av)) + + // Check the ones with matching linkage + let allPairsOk = matchingPairs |> List.map (fun (fv,av) -> checkVal implModRef aenv av fv) |> List.forall id + let someNotOk = matchingPairs.Length < fvs.Length + // Report an error for those that don't. Try pairing up by enclosing-type/name + if someNotOk then + let noMatches,partialMatchingPairs = + fvs |> List.splitChoose (fun fv -> + match avs |> List.tryFind (fun av -> valuesPartiallyMatch av fv) with + | None -> Choice1Of2 fv + | Some av -> Choice2Of2(fv,av)) + for (fv,av) in partialMatchingPairs do + checkVal implModRef aenv av fv |> ignore + for fv in noMatches do + sigValHadNoMatchingImplementation fv None + allPairsOk && not someNotOk) + + + and checkModuleOrNamespace aenv implModRef sigModRef = + // Propagate defn location information from implementation to signature . + sigModRef.SetOtherRange (implModRef.Range, true) + implModRef.Deref.SetOtherRange (sigModRef.Range, false) + checkModuleOrNamespaceContents implModRef.Range aenv implModRef sigModRef.ModuleOrNamespaceType && + checkAttribs aenv implModRef.Attribs sigModRef.Attribs implModRef.Deref.SetAttribs + + member __.CheckSignature aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = + checkModuleOrNamespaceContents implModRef.Range aenv implModRef signModType + + member __.CheckTypars m aenv (implTypars: Typars) (signTypars: Typars) = + checkTypars m aenv implTypars signTypars + + +/// Check the names add up between a signature and its implementation. We check this first. +let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = + let m = implModRef.Range + let implModType = implModRef.ModuleOrNamespaceType + NameMap.suball2 + (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun _ _ -> true) + implModType.TypesByMangledName + signModType.TypesByMangledName && + + (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) + ||> NameMap.suball2 + (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) + (fun x1 (x2:ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && + + (implModType.AllValsAndMembersByLogicalNameUncached , signModType.AllValsAndMembersByLogicalNameUncached) + ||> NameMap.suball2 + (fun _s (fxs:Val list) -> + let fx = fxs.Head + errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> + // In the case of missing members show the full required enclosing type and signature + if isSome fx.MemberInfo then + NicePrint.outputQualifiedValOrMember denv os fx + else + Printf.bprintf os "%s" fx.DisplayName),m)); false) + (fun _ _ -> true) + + +and CheckNamesOfModuleOrNamespace denv (implModRef:ModuleOrNamespaceRef) signModType = + CheckNamesOfModuleOrNamespaceContents denv implModRef signModType + diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b20e3b909d6..2276413f89a 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6,8 +6,12 @@ module internal Microsoft.FSharp.Compiler.TypeChecker #nowarn "44" // This construct is deprecated. please use List.item +open System +open System.Collections.Generic + open Internal.Utilities open Internal.Utilities.Collections + open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal @@ -25,18 +29,18 @@ open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.PatternMatchCompilation open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.Infos -open Microsoft.FSharp.Compiler.Infos.AccessibilityLogic -open Microsoft.FSharp.Compiler.Infos.AttributeChecking +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.AttributeChecking open Microsoft.FSharp.Compiler.TypeRelations +open Microsoft.FSharp.Compiler.MethodCalls +open Microsoft.FSharp.Compiler.MethodOverrides open Microsoft.FSharp.Compiler.ConstraintSolver open Microsoft.FSharp.Compiler.NameResolution open Microsoft.FSharp.Compiler.PrettyNaming -open System -open System.Collections.Generic +open Microsoft.FSharp.Compiler.InfoReader #if EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping diff --git a/src/fsharp/TypeChecker.fsi b/src/fsharp/TypeChecker.fsi index db581d85dfe..51a346c35e9 100644 --- a/src/fsharp/TypeChecker.fsi +++ b/src/fsharp/TypeChecker.fsi @@ -8,8 +8,9 @@ open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops diff --git a/src/fsharp/TypeRelations.fs b/src/fsharp/TypeRelations.fs old mode 100755 new mode 100644 index 8875cc13c78..b0bb80e9824 --- a/src/fsharp/TypeRelations.fs +++ b/src/fsharp/TypeRelations.fs @@ -24,13 +24,9 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.PrettyNaming -open Microsoft.FSharp.Compiler.Infos.AccessibilityLogic +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.NameResolution -#if EXTENSIONTYPING -open Microsoft.FSharp.Compiler.ExtensionTyping -#endif - //------------------------------------------------------------------------- // a :> b without coercion based on finalized (no type variable) types //------------------------------------------------------------------------- @@ -291,1726 +287,6 @@ let IteratedAdjustArityOfLambda g amap topValInfo e = tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty -exception RequiredButNotSpecified of DisplayEnv * Tast.ModuleOrNamespaceRef * string * (StringBuilder -> unit) * range -exception ValueNotContained of DisplayEnv * Tast.ModuleOrNamespaceRef * Val * Val * (string * string * string -> string) -exception ConstrNotContained of DisplayEnv * UnionCase * UnionCase * (string * string -> string) -exception ExnconstrNotContained of DisplayEnv * Tycon * Tycon * (string * string -> string) -exception FieldNotContained of DisplayEnv * RecdField * RecdField * (string * string -> string) -exception InterfaceNotRevealed of DisplayEnv * TType * range - - -/// Containment relation for module types -module SignatureConformance = begin - - // Use a type to capture the constant, common parameters - type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = - - // Build a remap that maps tcrefs in the signature to tcrefs in the implementation - // Used when checking attributes. - let sigToImplRemap = - let remap = Remap.Empty - let remap = (remapInfo.mrpiEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) - let remap = (remapInfo.mrpiVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) - remap - - // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) - // - // (a) Start with lists AImpl and ASig containing the attributes in the implementation and signature, in declaration order - // (b) Each attribute in AImpl is checked against the available attributes in ASig. - // a. If an attribute is found in ASig which is an exact match (after evaluating attribute arguments), then the attribute in the implementation is ignored, the attribute is removed from ASig, and checking continues - // b. If an attribute is found in ASig that has the same attribute type, then a warning is given and the attribute in the implementation is ignored - // c. Otherwise, the attribute in the implementation is kept - // (c) The attributes appearing in the compiled element are the compiled forms of the attributes from the signature and the kept attributes from the implementation - let checkAttribs _aenv (implAttribs:Attribs) (sigAttribs:Attribs) fixup = - - // Remap the signature attributes to make them look as if they were declared in - // the implementation. This allows us to compare them and propagate them to the implementation - // if needed. - let sigAttribs = sigAttribs |> List.map (remapAttrib g sigToImplRemap) - - // Helper to check for equality of evaluated attribute expressions - let attribExprEq (AttribExpr(_,e1)) (AttribExpr(_,e2)) = EvaledAttribExprEquality g e1 e2 - - // Helper to check for equality of evaluated named attribute arguments - let attribNamedArgEq (AttribNamedArg(nm1,ty1,isProp1,e1)) (AttribNamedArg(nm2,ty2,isProp2,e2)) = - (nm1 = nm2) && - typeEquiv g ty1 ty2 && - (isProp1 = isProp2) && - attribExprEq e1 e2 - - let attribsEq attrib1 attrib2 = - let (Attrib(implTcref,_,implArgs,implNamedArgs,_,_,_implRange)) = attrib1 - let (Attrib(signTcref,_,signArgs,signNamedArgs,_,_,_signRange)) = attrib2 - tyconRefEq g signTcref implTcref && - (implArgs,signArgs) ||> List.lengthsEqAndForall2 attribExprEq && - (implNamedArgs, signNamedArgs) ||> List.lengthsEqAndForall2 attribNamedArgEq - - let attribsHaveSameTycon attrib1 attrib2 = - let (Attrib(implTcref,_,_,_,_,_,_)) = attrib1 - let (Attrib(signTcref,_,_,_,_,_,_)) = attrib2 - tyconRefEq g signTcref implTcref - - // For each implementation attribute, only keep if it is not mentioned in the signature. - // Emit a warning if it is mentioned in the signature and the arguments to the attributes are - // not identical. - let rec check keptImplAttribsRev implAttribs sigAttribs = - match implAttribs with - | [] -> keptImplAttribsRev |> List.rev - | implAttrib :: remainingImplAttribs -> - - // Look for an attribute in the signature that matches precisely. If so, remove it - let lookForMatchingAttrib = sigAttribs |> List.tryRemove (attribsEq implAttrib) - match lookForMatchingAttrib with - | Some (_, remainingSigAttribs) -> check keptImplAttribsRev remainingImplAttribs remainingSigAttribs - | None -> - - // Look for an attribute in the signature that has the same type. If so, give a warning - let existsSimilarAttrib = sigAttribs |> List.exists (attribsHaveSameTycon implAttrib) - - if existsSimilarAttrib then - let (Attrib(implTcref,_,_,_,_,_,implRange)) = implAttrib - warning(Error(FSComp.SR.tcAttribArgsDiffer(implTcref.DisplayName), implRange)) - check keptImplAttribsRev remainingImplAttribs sigAttribs - else - check (implAttrib :: keptImplAttribsRev) remainingImplAttribs sigAttribs - - let keptImplAttribs = check [] implAttribs sigAttribs - - fixup (sigAttribs @ keptImplAttribs) - true - - let rec checkTypars m (aenv: TypeEquivEnv) (implTypars:Typars) (sigTypars:Typars) = - if implTypars.Length <> sigTypars.Length then - errorR (Error(FSComp.SR.typrelSigImplNotCompatibleParamCountsDiffer(),m)) - false - else - let aenv = aenv.BindEquivTypars implTypars sigTypars - (implTypars,sigTypars) ||> List.forall2 (fun implTypar sigTypar -> - let m = sigTypar.Range - if implTypar.StaticReq <> sigTypar.StaticReq then - errorR (Error(FSComp.SR.typrelSigImplNotCompatibleCompileTimeRequirementsDiffer(), m)) - - // Adjust the actual type parameter name to look like the signature - implTypar.SetIdent (mkSynId implTypar.Range sigTypar.Id.idText) - - // Mark it as "not compiler generated", now that we've got a good name for it - implTypar.SetCompilerGenerated false - - // Check the constraints in the implementation are present in the signature - implTypar.Constraints |> List.forall (fun implTyparCx -> - match implTyparCx with - // defaults can be dropped in the signature - | TyparConstraint.DefaultsTo(_,_acty,_) -> true - | _ -> - if not (List.exists (typarConstraintsAEquiv g aenv implTyparCx) sigTypar.Constraints) - then (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDiffer(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (implTypar,implTyparCx))),m)); false) - else true) && - - // Check the constraints in the signature are present in the implementation - sigTypar.Constraints |> List.forall (fun sigTyparCx -> - match sigTyparCx with - // defaults can be present in the signature and not in the implementation because they are erased - | TyparConstraint.DefaultsTo(_,_acty,_) -> true - // 'comparison' and 'equality' constraints can be present in the signature and not in the implementation because they are erased - | TyparConstraint.SupportsComparison _ -> true - | TyparConstraint.SupportsEquality _ -> true - | _ -> - if not (List.exists (fun implTyparCx -> typarConstraintsAEquiv g aenv implTyparCx sigTyparCx) implTypar.Constraints) then - (errorR(Error(FSComp.SR.typrelSigImplNotCompatibleConstraintsDifferRemove(sigTypar.Name, Layout.showL(NicePrint.layoutTyparConstraint denv (sigTypar,sigTyparCx))),m)); false) - else - true) && - (not checkingSig || checkAttribs aenv implTypar.Attribs sigTypar.Attribs (fun attribs -> implTypar.Data.typar_attribs <- attribs))) - - and checkTypeDef (aenv: TypeEquivEnv) (implTycon:Tycon) (sigTycon:Tycon) = - let m = implTycon.Range - // Propagate defn location information from implementation to signature . - sigTycon.SetOtherRange (implTycon.Range, true) - implTycon.SetOtherRange (sigTycon.Range, false) - let err f = Error(f(implTycon.TypeOrMeasureKind.ToString()), m) - if implTycon.LogicalName <> sigTycon.LogicalName then (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer)); false) else - if implTycon.CompiledName <> sigTycon.CompiledName then (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleNamesDiffer)); false) else - checkExnInfo (fun f -> ExnconstrNotContained(denv,implTycon,sigTycon,f)) aenv implTycon.ExceptionInfo sigTycon.ExceptionInfo && - let implTypars = implTycon.Typars m - let sigTypars = sigTycon.Typars m - if implTypars.Length <> sigTypars.Length then - errorR (err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer)) - false - elif isLessAccessible implTycon.Accessibility sigTycon.Accessibility then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer)) - false - else - let aenv = aenv.BindEquivTypars implTypars sigTypars - - let aintfs = implTycon.ImmediateInterfaceTypesOfFSharpTycon - let fintfs = sigTycon.ImmediateInterfaceTypesOfFSharpTycon - let aintfsUser = implTycon.TypeContents.tcaug_interfaces |> List.filter (fun (_,compgen,_) -> not compgen) |> List.map p13 - let flatten tys = - tys - |> List.collect (AllSuperTypesOfType g amap m AllowMultiIntfInstantiations.Yes) - |> ListSet.setify (typeEquiv g) - |> List.filter (isInterfaceTy g) - let aintfs = flatten aintfs - let aintfsUser = flatten aintfsUser - let fintfs = flatten fintfs - - let unimpl = ListSet.subtract (fun fity aity -> typeAEquiv g aenv aity fity) fintfs aintfs - (unimpl |> List.forall (fun ity -> errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(x, NicePrint.minimalStringOfType denv ity))); false)) && - let hidden = ListSet.subtract (typeAEquiv g aenv) aintfsUser fintfs - hidden |> List.iter (fun ity -> (if implTycon.IsFSharpInterfaceTycon then error else warning) (InterfaceNotRevealed(denv,ity,implTycon.Range))) - - let aNull = IsUnionTypeWithNullAsTrueValue g implTycon - let fNull = IsUnionTypeWithNullAsTrueValue g sigTycon - if aNull && not fNull then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull)) - elif fNull && not aNull then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull)) - - let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) - let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) - if aNull2 && not fNull2 then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2)) - elif fNull2 && not aNull2 then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2)) - - let aSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef implTycon)) - let fSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef sigTycon)) - if aSealed && not fSealed then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed)) - if not aSealed && fSealed then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed)) - - let aPartial = isAbstractTycon implTycon - let fPartial = isAbstractTycon sigTycon - if aPartial && not fPartial then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract)) - - if not aPartial && fPartial then - errorR(err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract)) - - if not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then - errorR (err(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes)) - - checkTypars m aenv implTypars sigTypars && - checkTypeRepr err aenv implTycon.TypeReprInfo sigTycon.TypeReprInfo && - checkTypeAbbrev err aenv implTycon.TypeOrMeasureKind sigTycon.TypeOrMeasureKind implTycon.TypeAbbrev sigTycon.TypeAbbrev && - checkAttribs aenv implTycon.Attribs sigTycon.Attribs (fun attribs -> implTycon.Data.entity_attribs <- attribs) && - checkModuleOrNamespaceContents implTycon.Range aenv (mkLocalEntityRef implTycon) sigTycon.ModuleOrNamespaceType - - and checkValInfo aenv err (implVal : Val) (sigVal : Val) = - let id = implVal.Id - match implVal.ValReprInfo, sigVal.ValReprInfo with - | _,None -> true - | None, Some _ -> err(FSComp.SR.ValueNotContainedMutabilityArityNotInferred) - | Some (ValReprInfo (implTyparNames,implArgInfos,implRetInfo) as implValInfo), Some (ValReprInfo (sigTyparNames,sigArgInfos,sigRetInfo) as sigValInfo) -> - let ntps = implTyparNames.Length - let mtps = sigTyparNames.Length - if ntps <> mtps then - err(fun(x, y, z) -> FSComp.SR.ValueNotContainedMutabilityGenericParametersDiffer(x, y, z, string mtps, string ntps)) - elif implValInfo.KindsOfTypars <> sigValInfo.KindsOfTypars then - err(FSComp.SR.ValueNotContainedMutabilityGenericParametersAreDifferentKinds) - elif not (sigArgInfos.Length <= implArgInfos.Length && List.forall2 (fun x y -> List.length x <= List.length y) sigArgInfos (fst (List.chop sigArgInfos.Length implArgInfos))) then - err(fun(x, y, z) -> FSComp.SR.ValueNotContainedMutabilityAritiesDiffer(x, y, z, id.idText, string sigArgInfos.Length, id.idText, id.idText)) - else - let implArgInfos = implArgInfos |> List.take sigArgInfos.Length - let implArgInfos = (implArgInfos, sigArgInfos) ||> List.map2 (fun l1 l2 -> l1 |> List.take l2.Length) - // Propagate some information signature to implementation. - - // Check the attributes on each argument, and update the ValReprInfo for - // the value to reflect the information in the signature. - // This ensures that the compiled form of the value matches the signature rather than - // the implementation. This also propagates argument names from signature to implementation - let res = - (implArgInfos,sigArgInfos) ||> List.forall2 (List.forall2 (fun implArgInfo sigArgInfo -> - checkAttribs aenv implArgInfo.Attribs sigArgInfo.Attribs (fun attribs -> - implArgInfo.Name <- sigArgInfo.Name - implArgInfo.Attribs <- attribs))) && - - checkAttribs aenv implRetInfo.Attribs sigRetInfo.Attribs (fun attribs -> - implRetInfo.Name <- sigRetInfo.Name - implRetInfo.Attribs <- attribs) - - implVal.SetValReprInfo (Some (ValReprInfo (sigTyparNames,implArgInfos,implRetInfo))) - res - - and checkVal implModRef (aenv:TypeEquivEnv) (implVal:Val) (sigVal:Val) = - - // Propagate defn location information from implementation to signature . - sigVal.SetOtherRange (implVal.Range, true) - implVal.SetOtherRange (sigVal.Range, false) - - let mk_err denv f = ValueNotContained(denv,implModRef,implVal,sigVal,f) - let err denv f = errorR(mk_err denv f); false - let m = implVal.Range - if implVal.IsMutable <> sigVal.IsMutable then (err denv FSComp.SR.ValueNotContainedMutabilityAttributesDiffer) - elif implVal.LogicalName <> sigVal.LogicalName then (err denv FSComp.SR.ValueNotContainedMutabilityNamesDiffer) - elif implVal.CompiledName <> sigVal.CompiledName then (err denv FSComp.SR.ValueNotContainedMutabilityCompiledNamesDiffer) - elif implVal.DisplayName <> sigVal.DisplayName then (err denv FSComp.SR.ValueNotContainedMutabilityDisplayNamesDiffer) - elif isLessAccessible implVal.Accessibility sigVal.Accessibility then (err denv FSComp.SR.ValueNotContainedMutabilityAccessibilityMore) - elif implVal.MustInline <> sigVal.MustInline then (err denv FSComp.SR.ValueNotContainedMutabilityInlineFlagsDiffer) - elif implVal.LiteralValue <> sigVal.LiteralValue then (err denv FSComp.SR.ValueNotContainedMutabilityLiteralConstantValuesDiffer) - elif implVal.IsTypeFunction <> sigVal.IsTypeFunction then (err denv FSComp.SR.ValueNotContainedMutabilityOneIsTypeFunction) - else - let implTypars,atau = implVal.TypeScheme - let sigTypars,ftau = sigVal.TypeScheme - if implTypars.Length <> sigTypars.Length then (err {denv with showTyparBinding=true} FSComp.SR.ValueNotContainedMutabilityParameterCountsDiffer) else - let aenv = aenv.BindEquivTypars implTypars sigTypars - checkTypars m aenv implTypars sigTypars && - if not (typeAEquiv g aenv atau ftau) then err denv (FSComp.SR.ValueNotContainedMutabilityTypesDiffer) - elif not (checkValInfo aenv (err denv) implVal sigVal) then false - elif not (implVal.IsExtensionMember = sigVal.IsExtensionMember) then err denv (FSComp.SR.ValueNotContainedMutabilityExtensionsDiffer) - elif not (checkMemberDatasConform (err denv) (implVal.Attribs, implVal,implVal.MemberInfo) (sigVal.Attribs,sigVal,sigVal.MemberInfo)) then false - else checkAttribs aenv implVal.Attribs sigVal.Attribs (fun attribs -> implVal.Data.val_attribs <- attribs) - - - and checkExnInfo err aenv implTypeRepr sigTypeRepr = - match implTypeRepr,sigTypeRepr with - | TExnAsmRepr _, TExnFresh _ -> - (errorR (err FSComp.SR.ExceptionDefsNotCompatibleHiddenBySignature); false) - | TExnAsmRepr tcr1, TExnAsmRepr tcr2 -> - if tcr1 <> tcr2 then (errorR (err FSComp.SR.ExceptionDefsNotCompatibleDotNetRepresentationsDiffer); false) else true - | TExnAbbrevRepr _, TExnFresh _ -> - (errorR (err FSComp.SR.ExceptionDefsNotCompatibleAbbreviationHiddenBySignature); false) - | TExnAbbrevRepr ecr1, TExnAbbrevRepr ecr2 -> - if not (tcrefAEquiv g aenv ecr1 ecr2) then - (errorR (err FSComp.SR.ExceptionDefsNotCompatibleSignaturesDiffer); false) - else true - | TExnFresh r1, TExnFresh r2-> checkRecordFieldsForExn g denv err aenv r1 r2 - | TExnNone,TExnNone -> true - | _ -> - (errorR (err FSComp.SR.ExceptionDefsNotCompatibleExceptionDeclarationsDiffer); false) - - and checkUnionCase aenv implUnionCase sigUnionCase = - let err f = errorR(ConstrNotContained(denv,implUnionCase,sigUnionCase,f));false - sigUnionCase.OtherRangeOpt <- Some (implUnionCase.Range, true) - implUnionCase.OtherRangeOpt <- Some (sigUnionCase.Range, false) - if implUnionCase.Id.idText <> sigUnionCase.Id.idText then err FSComp.SR.ModuleContainsConstructorButNamesDiffer - elif implUnionCase.RecdFields.Length <> sigUnionCase.RecdFields.Length then err FSComp.SR.ModuleContainsConstructorButDataFieldsDiffer - elif not (List.forall2 (checkField aenv) implUnionCase.RecdFields sigUnionCase.RecdFields) then err FSComp.SR.ModuleContainsConstructorButTypesOfFieldsDiffer - elif isLessAccessible implUnionCase.Accessibility sigUnionCase.Accessibility then err FSComp.SR.ModuleContainsConstructorButAccessibilityDiffers - else checkAttribs aenv implUnionCase.Attribs sigUnionCase.Attribs (fun attribs -> implUnionCase.Attribs <- attribs) - - and checkField aenv implField sigField = - let err f = errorR(FieldNotContained(denv,implField,sigField,f)); false - sigField.rfield_other_range <- Some (implField.Range, true) - implField.rfield_other_range <- Some (sigField.Range, false) - if implField.rfield_id.idText <> sigField.rfield_id.idText then err FSComp.SR.FieldNotContainedNamesDiffer - elif isLessAccessible implField.Accessibility sigField.Accessibility then err FSComp.SR.FieldNotContainedAccessibilitiesDiffer - elif implField.IsStatic <> sigField.IsStatic then err FSComp.SR.FieldNotContainedStaticsDiffer - elif implField.IsMutable <> sigField.IsMutable then err FSComp.SR.FieldNotContainedMutablesDiffer - elif implField.LiteralValue <> sigField.LiteralValue then err FSComp.SR.FieldNotContainedLiteralsDiffer - elif not (typeAEquiv g aenv implField.FormalType sigField.FormalType) then err FSComp.SR.FieldNotContainedTypesDiffer - else - checkAttribs aenv implField.FieldAttribs sigField.FieldAttribs (fun attribs -> implField.rfield_fattribs <- attribs) && - checkAttribs aenv implField.PropertyAttribs sigField.PropertyAttribs (fun attribs -> implField.rfield_pattribs <- attribs) - - and checkMemberDatasConform err (_implAttrs,implVal,implMemberInfo) (_sigAttrs, sigVal,sigMemberInfo) = - match implMemberInfo,sigMemberInfo with - | None,None -> true - | Some implMembInfo, Some sigMembInfo -> - if not (implVal.CompiledName = sigVal.CompiledName) then - err(FSComp.SR.ValueNotContainedMutabilityDotNetNamesDiffer) - elif not (implMembInfo.MemberFlags.IsInstance = sigMembInfo.MemberFlags.IsInstance) then - err(FSComp.SR.ValueNotContainedMutabilityStaticsDiffer) - elif false then - err(FSComp.SR.ValueNotContainedMutabilityVirtualsDiffer) - elif not (implMembInfo.MemberFlags.IsDispatchSlot = sigMembInfo.MemberFlags.IsDispatchSlot) then - err(FSComp.SR.ValueNotContainedMutabilityAbstractsDiffer) - // The final check is an implication: - // classes have non-final CompareTo/Hash methods - // abstract have non-final CompareTo/Hash methods - // records have final CompareTo/Hash methods - // unions have final CompareTo/Hash methods - // This is an example where it is OK for the signature to say 'non-final' when the implementation says 'final' - elif not implMembInfo.MemberFlags.IsFinal && sigMembInfo.MemberFlags.IsFinal then - err(FSComp.SR.ValueNotContainedMutabilityFinalsDiffer) - elif not (implMembInfo.MemberFlags.IsOverrideOrExplicitImpl = sigMembInfo.MemberFlags.IsOverrideOrExplicitImpl) then - err(FSComp.SR.ValueNotContainedMutabilityOverridesDiffer) - elif not (implMembInfo.MemberFlags.MemberKind = sigMembInfo.MemberFlags.MemberKind) then - err(FSComp.SR.ValueNotContainedMutabilityOneIsConstructor) - else - let finstance = ValSpecIsCompiledAsInstance g sigVal - let ainstance = ValSpecIsCompiledAsInstance g implVal - if finstance && not ainstance then - err(FSComp.SR.ValueNotContainedMutabilityStaticButInstance) - elif not finstance && ainstance then - err(FSComp.SR.ValueNotContainedMutabilityInstanceButStatic) - else true - - | _ -> false - - // ------------------------------------------------------------------------------- - // WARNING!!!! - // checkRecordFields and checkRecordFieldsForExn are the EXACT SAME FUNCTION. - // The only difference is the signature for err - this is because err is a function - // that reports errors, and checkRecordFields is called with a different - // sig for err then checkRecordFieldsForExn. - // ------------------------------------------------------------------------------- - - and checkRecordFields _g _amap _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = - let implFields = implFields.TrueFieldsAsList - let sigFields = sigFields.TrueFieldsAsList - let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(x, s))); false) (checkField aenv) m1 m2 && - NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldWasPresent(x, s))); false) (fun x y -> checkField aenv y x) m2 m1 && - // This check is required because constructors etc. are externally visible - // and thus compiled representations do pick up dependencies on the field order - (if List.forall2 (checkField aenv) implFields sigFields - then true - else (errorR(err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer)); false)) - - and checkRecordFieldsForExn _g _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = - let implFields = implFields.TrueFieldsAsList - let sigFields = sigFields.TrueFieldsAsList - let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInSigButNotImpl(s, x, y))); false) (checkField aenv) m1 m2 && - NameMap.suball2 (fun s _ -> errorR(err (fun (x, y) -> FSComp.SR.ExceptionDefsNotCompatibleFieldInImplButNotSig(s, x, y))); false) (fun x y -> checkField aenv y x) m2 m1 && - // This check is required because constructors etc. are externally visible - // and thus compiled representations do pick up dependencies on the field order - (if List.forall2 (checkField aenv) implFields sigFields - then true - else (errorR(err (FSComp.SR.ExceptionDefsNotCompatibleFieldOrderDiffers)); false)) - - and checkVirtualSlots _g denv err _aenv implAbstractSlots sigAbstractSlots = - let m1 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) implAbstractSlots - let m2 = NameMap.ofKeyedList (fun (v:ValRef) -> v.DisplayName) sigAbstractSlots - (m1,m2) ||> NameMap.suball2 (fun _s vref -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(x, NicePrint.stringValOrMember denv vref.Deref))); false) (fun _x _y -> true) && - (m2,m1) ||> NameMap.suball2 (fun _s vref -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(x, NicePrint.stringValOrMember denv vref.Deref))); false) (fun _x _y -> true) - - and checkClassFields isStruct _g _amap _denv err aenv (implFields:TyconRecdFields) (sigFields:TyconRecdFields) = - let implFields = implFields.TrueFieldsAsList - let sigFields = sigFields.TrueFieldsAsList - let m1 = implFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - let m2 = sigFields |> NameMap.ofKeyedList (fun rfld -> rfld.Name) - NameMap.suball2 (fun s _ -> errorR(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(x, s))); false) (checkField aenv) m1 m2 && - (if isStruct then - NameMap.suball2 (fun s _ -> warning(err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(x, s))); true) (fun x y -> checkField aenv y x) m2 m1 - else - true) - - - and checkTypeRepr err aenv implTypeRepr sigTypeRepr = - let reportNiceError k s1 s2 = - let aset = NameSet.ofList s1 - let fset = NameSet.ofList s2 - match Zset.elements (Zset.diff aset fset) with - | [] -> - match Zset.elements (Zset.diff fset aset) with - | [] -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleNumbersDiffer(x, k))); false) - | l -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(x, k, String.concat ";" l))); false) - | l -> (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(x, k, String.concat ";" l))); false) - - match implTypeRepr,sigTypeRepr with - | (TRecdRepr _ - | TFiniteUnionRepr _ - | TILObjModelRepr _ -#if EXTENSIONTYPING - | TProvidedTypeExtensionPoint _ - | TProvidedNamespaceExtensionPoint _ -#endif - ), TNoRepr -> true - | (TFsObjModelRepr r), TNoRepr -> - match r.fsobjmodel_kind with - | TTyconStruct | TTyconEnum -> - (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesStruct); false) - | _ -> - true - | (TAsmRepr _), TNoRepr -> - (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden); false) - | (TMeasureableRepr _), TNoRepr -> - (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsHidden); false) - | (TFiniteUnionRepr r1), (TFiniteUnionRepr r2) -> - let ucases1 = r1.UnionCasesAsList - let ucases2 = r2.UnionCasesAsList - if ucases1.Length <> ucases2.Length then - let names (l: UnionCase list) = l |> List.map (fun c -> c.Id.idText) - reportNiceError "union case" (names ucases1) (names ucases2) - else List.forall2 (checkUnionCase aenv) ucases1 ucases2 - | (TRecdRepr implFields), (TRecdRepr sigFields) -> - checkRecordFields g amap denv err aenv implFields sigFields - | (TFsObjModelRepr r1), (TFsObjModelRepr r2) -> - if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with - | TTyconClass,TTyconClass -> true - | TTyconInterface,TTyconInterface -> true - | TTyconStruct,TTyconStruct -> true - | TTyconEnum, TTyconEnum -> true - | TTyconDelegate (TSlotSig(_,typ1,ctps1,mtps1,ps1, rty1)), - TTyconDelegate (TSlotSig(_,typ2,ctps2,mtps2,ps2, rty2)) -> - (typeAEquiv g aenv typ1 typ2) && - (ctps1.Length = ctps2.Length) && - (let aenv = aenv.BindEquivTypars ctps1 ctps2 - (typarsAEquiv g aenv ctps1 ctps2) && - (mtps1.Length = mtps2.Length) && - (let aenv = aenv.BindEquivTypars mtps1 mtps2 - (typarsAEquiv g aenv mtps1 mtps2) && - ((ps1,ps2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun p1 p2 -> typeAEquiv g aenv p1.Type p2.Type))) && - (returnTypesAEquiv g aenv rty1 rty2))) - | _,_ -> false) then - (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind); false) - else - let isStruct = (match r1.fsobjmodel_kind with TTyconStruct -> true | _ -> false) - checkClassFields isStruct g amap denv err aenv r1.fsobjmodel_rfields r2.fsobjmodel_rfields && - checkVirtualSlots g denv err aenv r1.fsobjmodel_vslots r2.fsobjmodel_vslots - | (TAsmRepr tcr1), (TAsmRepr tcr2) -> - if tcr1 <> tcr2 then (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleILDiffer); false) else true - | (TMeasureableRepr ty1), (TMeasureableRepr ty2) -> - if typeAEquiv g aenv ty1 ty2 then true else (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) - | TNoRepr, TNoRepr -> true -#if EXTENSIONTYPING - | TProvidedTypeExtensionPoint info1 , TProvidedTypeExtensionPoint info2 -> - Tainted.EqTainted info1.ProvidedType.TypeProvider info2.ProvidedType.TypeProvider && ProvidedType.TaintedEquals(info1.ProvidedType,info2.ProvidedType) - | TProvidedNamespaceExtensionPoint _, TProvidedNamespaceExtensionPoint _ -> - System.Diagnostics.Debug.Assert(false, "unreachable: TProvidedNamespaceExtensionPoint only on namespaces, not types" ) - true -#endif - | TNoRepr, _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) - | _, _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer); false) - - and checkTypeAbbrev err aenv kind1 kind2 implTypeAbbrev sigTypeAbbrev = - if kind1 <> kind2 then (errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(x, kind2.ToString(), kind1.ToString()))); false) - else - match implTypeAbbrev,sigTypeAbbrev with - | Some ty1, Some ty2 -> - if not (typeAEquiv g aenv ty1 ty2) then - let s1, s2, _ = NicePrint.minimalStringsOfTwoTypes denv ty1 ty2 - errorR (err (fun x -> FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(x, s1, s2))) - false - else - true - | None,None -> true - | Some _, None -> (errorR (err (FSComp.SR.DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig)); false) - | None, Some _ -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation); false) - - and checkModuleOrNamespaceContents m aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = - let implModType = implModRef.ModuleOrNamespaceType - (if implModType.ModuleOrNamespaceKind <> signModType.ModuleOrNamespaceKind then errorR(Error(FSComp.SR.typrelModuleNamespaceAttributesDifferInSigAndImpl(),m))) - - - (implModType.TypesByMangledName , signModType.TypesByMangledName) - ||> NameMap.suball2 - (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) - (checkTypeDef aenv) && - - - (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) - ||> NameMap.suball2 - (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) - (fun x1 x2 -> checkModuleOrNamespace aenv (mkLocalModRef x1) x2) && - - let sigValHadNoMatchingImplementation (fx:Val) (_closeActualVal: Val option) = - errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> - (* In the case of missing members show the full required enclosing type and signature *) - if fx.IsMember then - NicePrint.outputQualifiedValOrMember denv os fx - else - Printf.bprintf os "%s" fx.DisplayName),m)) - - let valuesPartiallyMatch (av:Val) (fv:Val) = - (av.LinkagePartialKey.MemberParentMangledName = fv.LinkagePartialKey.MemberParentMangledName) && - (av.LinkagePartialKey.LogicalName = fv.LinkagePartialKey.LogicalName) && - (av.LinkagePartialKey.TotalArgCount = fv.LinkagePartialKey.TotalArgCount) - - (implModType.AllValsAndMembersByLogicalNameUncached, signModType.AllValsAndMembersByLogicalNameUncached) - ||> NameMap.suball2 - (fun _s (fxs:Val list) -> sigValHadNoMatchingImplementation fxs.Head None; false) - (fun avs fvs -> - match avs,fvs with - | [],_ | _,[] -> failwith "unreachable" - | [av],[fv] -> - if valuesPartiallyMatch av fv then - checkVal implModRef aenv av fv - else - sigValHadNoMatchingImplementation fv None - false - | _ -> - // for each formal requirement, try to find a precisely matching actual requirement - let matchingPairs = - fvs |> List.choose (fun fv -> - match avs |> List.tryFind (fun av -> - let res = valLinkageAEquiv g aenv av fv - //if res then printfn "%s" (bufs (fun buf -> Printf.bprintf buf "YES MATCH: fv '%a', av '%a'" (NicePrint.outputQualifiedValOrMember denv) fv (NicePrint.outputQualifiedValOrMember denv) av)) - //else printfn "%s" (bufs (fun buf -> Printf.bprintf buf "NO MATCH: fv '%a', av '%a'" (NicePrint.outputQualifiedValOrMember denv) fv (NicePrint.outputQualifiedValOrMember denv) av)) - res) with - | None -> None - | Some av -> Some(fv,av)) - - // Check the ones with matching linkage - let allPairsOk = matchingPairs |> List.map (fun (fv,av) -> checkVal implModRef aenv av fv) |> List.forall id - let someNotOk = matchingPairs.Length < fvs.Length - // Report an error for those that don't. Try pairing up by enclosing-type/name - if someNotOk then - let noMatches,partialMatchingPairs = - fvs |> List.splitChoose (fun fv -> - match avs |> List.tryFind (fun av -> valuesPartiallyMatch av fv) with - | None -> Choice1Of2 fv - | Some av -> Choice2Of2(fv,av)) - for (fv,av) in partialMatchingPairs do - checkVal implModRef aenv av fv |> ignore - for fv in noMatches do - sigValHadNoMatchingImplementation fv None - allPairsOk && not someNotOk) - - - and checkModuleOrNamespace aenv implModRef sigModRef = - // Propagate defn location information from implementation to signature . - sigModRef.SetOtherRange (implModRef.Range, true) - implModRef.Deref.SetOtherRange (sigModRef.Range, false) - checkModuleOrNamespaceContents implModRef.Range aenv implModRef sigModRef.ModuleOrNamespaceType && - checkAttribs aenv implModRef.Attribs sigModRef.Attribs implModRef.Deref.SetAttribs - - member __.CheckSignature aenv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = - checkModuleOrNamespaceContents implModRef.Range aenv implModRef signModType - - member __.CheckTypars m aenv (implTypars: Typars) (signTypars: Typars) = - checkTypars m aenv implTypars signTypars - - - /// Check the names add up between a signature and its implementation. We check this first. - let rec CheckNamesOfModuleOrNamespaceContents denv (implModRef:ModuleOrNamespaceRef) (signModType:ModuleOrNamespaceType) = - let m = implModRef.Range - let implModType = implModRef.ModuleOrNamespaceType - NameMap.suball2 - (fun s _fx -> errorR(RequiredButNotSpecified(denv,implModRef,"type",(fun os -> Printf.bprintf os "%s" s),m)); false) - (fun _ _ -> true) - implModType.TypesByMangledName - signModType.TypesByMangledName && - - (implModType.ModulesAndNamespacesByDemangledName, signModType.ModulesAndNamespacesByDemangledName ) - ||> NameMap.suball2 - (fun s fx -> errorR(RequiredButNotSpecified(denv,implModRef,(if fx.IsModule then "module" else "namespace"),(fun os -> Printf.bprintf os "%s" s),m)); false) - (fun x1 (x2:ModuleOrNamespace) -> CheckNamesOfModuleOrNamespace denv (mkLocalModRef x1) x2.ModuleOrNamespaceType) && - - (implModType.AllValsAndMembersByLogicalNameUncached , signModType.AllValsAndMembersByLogicalNameUncached) - ||> NameMap.suball2 - (fun _s (fxs:Val list) -> - let fx = fxs.Head - errorR(RequiredButNotSpecified(denv,implModRef,"value",(fun os -> - // In the case of missing members show the full required enclosing type and signature - if isSome fx.MemberInfo then - NicePrint.outputQualifiedValOrMember denv os fx - else - Printf.bprintf os "%s" fx.DisplayName),m)); false) - (fun _ _ -> true) - - - and CheckNamesOfModuleOrNamespace denv (implModRef:ModuleOrNamespaceRef) signModType = - CheckNamesOfModuleOrNamespaceContents denv implModRef signModType - -end - -//------------------------------------------------------------------------- -// Completeness of classes -//------------------------------------------------------------------------- - -type OverrideCanImplement = - | CanImplementAnyInterfaceSlot - | CanImplementAnyClassHierarchySlot - | CanImplementAnySlot - | CanImplementNoSlots - -/// The overall information about a method implementation in a class or object expression -type OverrideInfo = - | Override of OverrideCanImplement * TyconRef * Ident * (Typars * TyparInst) * TType list list * TType option * bool * bool - member x.CanImplement = let (Override(a,_,_,_,_,_,_,_)) = x in a - member x.BoundingTyconRef = let (Override(_,ty,_,_,_,_,_,_)) = x in ty - member x.LogicalName = let (Override(_,_,id,_,_,_,_,_)) = x in id.idText - member x.Range = let (Override(_,_,id,_,_,_,_,_)) = x in id.idRange - member x.IsFakeEventProperty = let (Override(_,_,_,_,_,_,b,_)) = x in b - member x.ArgTypes = let (Override(_,_,_,_,b,_,_,_)) = x in b - member x.ReturnType = let (Override(_,_,_,_,_,b,_,_)) = x in b - member x.IsCompilerGenerated = let (Override(_,_,_,_,_,_,_,b)) = x in b - -// If the bool is true then the slot is optional, i.e. is an interface slot -// which does not _have_ to be implemented, because an inherited implementation -// is available. -type RequiredSlot = RequiredSlot of MethInfo * (* isOptional: *) bool - -type SlotImplSet = SlotImplSet of RequiredSlot list * NameMultiMap * OverrideInfo list * PropInfo list - -exception TypeIsImplicitlyAbstract of range -exception OverrideDoesntOverride of DisplayEnv * OverrideInfo * MethInfo option * TcGlobals * Import.ImportMap * range - -module DispatchSlotChecking = - - /// Print the signature of an override to a buffer as part of an error message - let PrintOverrideToBuffer denv os (Override(_,_,id,(mtps,memberToParentInst),argTys,retTy,_,_)) = - let denv = { denv with showTyparBinding = true } - let retTy = (retTy |> GetFSharpViewOfReturnType denv.g) - let argInfos = - match argTys with - | [] -> [[(denv.g.unit_ty,ValReprInfo.unnamedTopArg1)]] - | _ -> argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) - Layout.bufferL os (NicePrint.layoutMemberSig denv (memberToParentInst,id.idText,mtps, argInfos, retTy)) - - /// Print the signature of a MethInfo to a buffer as part of an error message - let PrintMethInfoSigToBuffer g amap m denv os minfo = - let denv = { denv with showTyparBinding = true } - let (CompiledSig(argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo - let retTy = (retTy |> GetFSharpViewOfReturnType g) - let argInfos = argTys |> List.mapSquared (fun ty -> (ty, ValReprInfo.unnamedTopArg1)) - let nm = minfo.LogicalName - Layout.bufferL os (NicePrint.layoutMemberSig denv (ttpinst,nm,fmtps, argInfos, retTy)) - - /// Format the signature of an override as a string as part of an error message - let FormatOverride denv d = bufs (fun buf -> PrintOverrideToBuffer denv buf d) - - /// Format the signature of a MethInfo as a string as part of an error message - let FormatMethInfoSig g amap m denv d = bufs (fun buf -> PrintMethInfoSigToBuffer g amap m denv buf d) - - /// Get the override info for an existing (inherited) method being used to implement a dispatch slot. - let GetInheritedMemberOverrideInfo g amap m parentType (minfo:MethInfo) = - let nm = minfo.LogicalName - let (CompiledSig (argTys,retTy,fmtps,ttpinst)) = CompiledSigOfMeth g amap m minfo - - let isFakeEventProperty = minfo.IsFSharpEventPropertyMethod - Override(parentType,tcrefOfAppTy g minfo.EnclosingType,mkSynId m nm, (fmtps,ttpinst),argTys,retTy,isFakeEventProperty,false) - - /// Get the override info for a value being used to implement a dispatch slot. - let GetTypeMemberOverrideInfo g reqdTy (overrideBy:ValRef) = - let _,argInfos,retTy,_ = GetTypeOfMemberInMemberForm g overrideBy - let nm = overrideBy.LogicalName - - let argTys = argInfos |> List.mapSquared fst - - let memberMethodTypars,memberToParentInst,argTys,retTy = - match PartitionValRefTypars g overrideBy with - | Some(_,_,memberMethodTypars,memberToParentInst,_tinst) -> - let argTys = argTys |> List.mapSquared (instType memberToParentInst) - let retTy = retTy |> Option.map (instType memberToParentInst) - memberMethodTypars, memberToParentInst,argTys, retTy - | None -> - error(Error(FSComp.SR.typrelMethodIsOverconstrained(),overrideBy.Range)) - let implKind = - if ValRefIsExplicitImpl g overrideBy then - - let belongsToReqdTy = - match overrideBy.MemberInfo.Value.ImplementedSlotSigs with - | [] -> false - | ss :: _ -> isInterfaceTy g ss.ImplementedType && typeEquiv g reqdTy ss.ImplementedType - if belongsToReqdTy then - CanImplementAnyInterfaceSlot - else - CanImplementNoSlots - else if overrideBy.IsDispatchSlotMember then - CanImplementNoSlots - // abstract slots can only implement interface slots - //CanImplementAnyInterfaceSlot <<----- Change to this to enable implicit interface implementation - - else - CanImplementAnyClassHierarchySlot - //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation - - let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) - Override(implKind,overrideBy.MemberApparentParent, mkSynId overrideBy.Range nm, (memberMethodTypars,memberToParentInst),argTys,retTy,isFakeEventProperty, overrideBy.IsCompilerGenerated) - - /// Get the override information for an object expression method being used to implement dispatch slots - let GetObjectExprOverrideInfo g amap (implty, id:Ident, memberFlags, ty, arityInfo, bindingAttribs, rhsExpr) = - // Dissect the type - let tps, argInfos, retTy, _ = GetMemberTypeInMemberForm g memberFlags arityInfo ty id.idRange - let argTys = argInfos |> List.mapSquared fst - // Dissect the implementation - let _, ctorThisValOpt, baseValOpt, vsl, rhsExpr,_ = destTopLambda g amap arityInfo (rhsExpr,ty) - assert ctorThisValOpt.IsNone - - // Drop 'this' - match vsl with - | [thisv]::vs -> - // Check for empty variable list from a () arg - let vs = if vs.Length = 1 && argInfos.IsEmpty then [] else vs - let implKind = - if isInterfaceTy g implty then - CanImplementAnyInterfaceSlot - else - CanImplementAnyClassHierarchySlot - //CanImplementAnySlot <<----- Change to this to enable implicit interface implementation - let isFakeEventProperty = CompileAsEvent g bindingAttribs - let overrideByInfo = Override(implKind, tcrefOfAppTy g implty, id, (tps,[]), argTys, retTy, isFakeEventProperty, false) - overrideByInfo, (baseValOpt, thisv, vs, bindingAttribs, rhsExpr) - | _ -> - error(InternalError("Unexpected shape for object expression override",id.idRange)) - - /// Check if an override matches a dispatch slot by name - let IsNameMatch (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = - (overrideBy.LogicalName = dispatchSlot.LogicalName) - - /// Check if an override matches a dispatch slot by name - let IsImplMatch g (dispatchSlot:MethInfo) (overrideBy: OverrideInfo) = - // If the override is listed as only relevant to one type, and we're matching it against an abstract slot of an interface type, - // then check that interface type is the right type. - (match overrideBy.CanImplement with - | CanImplementNoSlots -> false - | CanImplementAnySlot -> true - | CanImplementAnyClassHierarchySlot -> not (isInterfaceTy g dispatchSlot.EnclosingType) - //| CanImplementSpecificInterfaceSlot parentTy -> isInterfaceTy g dispatchSlot.EnclosingType && typeEquiv g parentTy dispatchSlot.EnclosingType - | CanImplementAnyInterfaceSlot -> isInterfaceTy g dispatchSlot.EnclosingType) - - /// Check if the kinds of type parameters match between a dispatch slot and an override. - let IsTyparKindMatch g amap m (dispatchSlot:MethInfo) (Override(_,_,_,(mtps,_),_,_,_,_)) = - let (CompiledSig(_,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot - List.lengthsEqAndForall2 (fun (tp1:Typar) (tp2:Typar) -> tp1.Kind = tp2.Kind) mtps fvmtps - - /// Check if an override is a partial match for the requirements for a dispatch slot - let IsPartialMatch g amap m (dispatchSlot:MethInfo) (Override(_,_,_,(mtps,_),argTys,_retTy,_,_) as overrideBy) = - IsNameMatch dispatchSlot overrideBy && - let (CompiledSig (vargtys,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot - mtps.Length = fvmtps.Length && - IsTyparKindMatch g amap m dispatchSlot overrideBy && - argTys.Length = vargtys.Length && - IsImplMatch g dispatchSlot overrideBy - - /// Compute the reverse of a type parameter renaming. - let ReverseTyparRenaming g tinst = - tinst |> List.map (fun (tp,ty) -> (destTyparTy g ty, mkTyparTy tp)) - - /// Compose two instantiations of type parameters. - let ComposeTyparInsts inst1 inst2 = - inst1 |> List.map (map2Of2 (instType inst2)) - - /// Check if an override exactly matches the requirements for a dispatch slot - let IsExactMatch g amap m dispatchSlot (Override(_,_,_,(mtps,mtpinst),argTys,retTy,_,_) as overrideBy) = - IsPartialMatch g amap m dispatchSlot overrideBy && - let (CompiledSig (vargtys,vrty,fvmtps,ttpinst)) = CompiledSigOfMeth g amap m dispatchSlot - - // Compare the types. CompiledSigOfMeth, GetObjectExprOverrideInfo and GetTypeMemberOverrideInfo have already - // applied all relevant substitutions except the renamings from fvtmps <-> mtps - - let aenv = TypeEquivEnv.FromEquivTypars fvmtps mtps - - List.forall2 (List.lengthsEqAndForall2 (typeAEquiv g aenv)) vargtys argTys && - returnTypesAEquiv g aenv vrty retTy && - - // Comparing the method typars and their constraints is much trickier since the substitutions have not been applied - // to the constraints of these babies. This is partly because constraints are directly attached to typars so it's - // difficult to apply substitutions to them unless we separate them off at some point, which we don't as yet. - // - // Given C - // D - // dispatchSlot : C.M(...) - // overrideBy: parent: D value: ! (...) - // - // where X[dtps] indicates that X may involve free type variables dtps - // - // we have - // ttpinst maps ctps --> ctys[dtps] - // mtpinst maps ttps --> dtps - // - // compare fvtmps[ctps] and mtps[ttps] by - // fvtmps[ctps] @ ttpinst -- gives fvtmps[dtps] - // fvtmps[dtps] @ rev(mtpinst) -- gives fvtmps[ttps] - // - // Now fvtmps[ttps] and mtpinst[ttps] are comparable, i.e. have constraints w.r.t. the same set of type variables - // - // i.e. Compose the substitutions ttpinst and rev(mtpinst) - - let ttpinst = - // check we can reverse - in some error recovery situations we can't - if mtpinst |> List.exists (snd >> isTyparTy g >> not) then ttpinst - else ComposeTyparInsts ttpinst (ReverseTyparRenaming g mtpinst) - - // Compare under the composed substitutions - let aenv = TypeEquivEnv.FromTyparInst ttpinst - - typarsAEquiv g aenv fvmtps mtps - - /// Check if an override implements a dispatch slot - let OverrideImplementsDispatchSlot g amap m dispatchSlot availPriorOverride = - IsExactMatch g amap m dispatchSlot availPriorOverride && - // The override has to actually be in some subtype of the dispatch slot - ExistsHeadTypeInEntireHierarchy g amap m (generalizedTyconRef availPriorOverride.BoundingTyconRef) (tcrefOfAppTy g dispatchSlot.EnclosingType) - - /// Check if a dispatch slot is already implemented - let DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed (dispatchSlot: MethInfo) = - availPriorOverridesKeyed - |> NameMultiMap.find dispatchSlot.LogicalName - |> List.exists (OverrideImplementsDispatchSlot g amap m dispatchSlot) - - - /// Check all dispatch slots are implemented by some override. - let CheckDispatchSlotsAreImplemented (denv,g,amap,m, - nenv,sink:TcResultsSink, - isOverallTyAbstract, - reqdTy, - dispatchSlots:RequiredSlot list, - availPriorOverrides:OverrideInfo list, - overrides:OverrideInfo list) = - - let isReqdTyInterface = isInterfaceTy g reqdTy - let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) - let res = ref true - let fail exn = (res := false ; if showMissingMethodsAndRaiseErrors then errorR exn) - - // Index the availPriorOverrides and overrides by name - let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - - dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot,isOptional)) -> - - match NameMultiMap.find dispatchSlot.LogicalName overridesKeyed - |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with - | [ovd] -> - if not ovd.IsCompilerGenerated then - let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None) - CallNameResolutionSink sink (ovd.Range,nenv,item,item,ItemOccurence.Implemented,denv,AccessorDomain.AccessibleFromSomewhere) - sink |> ignore - () - | [] -> - if not isOptional && - // Check that no available prior override implements this dispatch slot - not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot) then - // error reporting path - let (CompiledSig (vargtys,_vrty,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot - let noimpl() = if isReqdTyInterface then fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) - else fail(Error(FSComp.SR.typrelNoImplementationGiven(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) - match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with - | [] -> - match overrides |> List.filter (fun overrideBy -> IsNameMatch dispatchSlot overrideBy && - IsImplMatch g dispatchSlot overrideBy) with - | [] -> - noimpl() - | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> - let error_msg = - if argTys.Length <> vargtys.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - elif mtps.Length <> fvmtps.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - else FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot) - fail(Error(error_msg, overrideBy.Range)) - | overrideBy :: _ -> - errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) - - | [ overrideBy ] -> - - match dispatchSlots |> List.filter (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with - | [] -> - // Error will be reported below in CheckOverridesAreAllUsedOnce - () - | _ -> - noimpl() - - | _ -> - fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) - | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot),m))) - !res - - /// Check all implementations implement some dispatch slot. - let CheckOverridesAreAllUsedOnce(denv, g, amap, isObjExpr, reqdTy, - dispatchSlotsKeyed: NameMultiMap, - availPriorOverrides: OverrideInfo list, - overrides: OverrideInfo list) = - let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - for overrideBy in overrides do - if not overrideBy.IsFakeEventProperty then - let m = overrideBy.Range - let relevantVirts = NameMultiMap.find overrideBy.LogicalName dispatchSlotsKeyed - let relevantVirts = relevantVirts |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) - - match relevantVirts |> List.filter (fun dispatchSlot -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with - | [] -> - // This is all error reporting - match relevantVirts |> List.filter (fun dispatchSlot -> IsPartialMatch g amap m dispatchSlot overrideBy) with - | [dispatchSlot] -> - errorR(OverrideDoesntOverride(denv,overrideBy,Some dispatchSlot,g,amap,m)) - | _ -> - match relevantVirts |> List.filter (fun dispatchSlot -> IsNameMatch dispatchSlot overrideBy) with - | [dispatchSlot] -> - errorR(OverrideDoesntOverride(denv, overrideBy, Some dispatchSlot, g, amap, m)) - | _ -> - errorR(OverrideDoesntOverride(denv,overrideBy,None,g,amap,m)) - - - | [dispatchSlot] -> - if dispatchSlot.IsFinal && (isObjExpr || not (typeEquiv g reqdTy dispatchSlot.EnclosingType)) then - errorR(Error(FSComp.SR.typrelMethodIsSealed(NicePrint.stringOfMethInfo amap m denv dispatchSlot),m)) - | dispatchSlots -> - match dispatchSlots |> List.filter (fun dispatchSlot -> - isInterfaceTy g dispatchSlot.EnclosingType || - not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot)) with - | h1 :: h2 :: _ -> - errorR(Error(FSComp.SR.typrelOverrideImplementsMoreThenOneSlot((FormatOverride denv overrideBy), (NicePrint.stringOfMethInfo amap m denv h1), (NicePrint.stringOfMethInfo amap m denv h2)),m)) - | _ -> - // dispatch slots are ordered from the derived classes to base - // so we can check the topmost dispatch slot if it is final - match dispatchSlots with - | meth::_ when meth.IsFinal -> errorR(Error(FSComp.SR.tcCannotOverrideSealedMethod((sprintf "%s::%s" (meth.EnclosingType.ToString()) (meth.LogicalName))), m)) - | _ -> () - - - - /// Get the slots of a type that can or must be implemented. This depends - /// partly on the full set of interface types that are being implemented - /// simultaneously, e.g. - /// { new C with interface I2 = ... interface I3 = ... } - /// allReqdTys = {C;I2;I3} - /// - /// allReqdTys can include one class/record/union type. - let GetSlotImplSets (infoReader:InfoReader) denv isObjExpr allReqdTys = - - let g = infoReader.g - let amap = infoReader.amap - - let availImpliedInterfaces : TType list = - [ for (reqdTy,m) in allReqdTys do - if not (isInterfaceTy g reqdTy) then - let baseTyOpt = if isObjExpr then Some reqdTy else GetSuperTypeOfType g amap m reqdTy - match baseTyOpt with - | None -> () - | Some baseTy -> yield! AllInterfacesOfType g amap m AllowMultiIntfInstantiations.Yes baseTy ] - - // For each implemented type, get a list containing the transitive closure of - // interface types implied by the type. This includes the implemented type itself if the implemented type - // is an interface type. - let intfSets = - allReqdTys |> List.mapi (fun i (reqdTy,m) -> - let interfaces = AllInterfacesOfType g amap m AllowMultiIntfInstantiations.Yes reqdTy - let impliedTys = (if isInterfaceTy g reqdTy then interfaces else reqdTy :: interfaces) - (i, reqdTy, impliedTys,m)) - - // For each implemented type, reduce its list of implied interfaces by subtracting out those implied - // by another implemented interface type. - // - // REVIEW: Note complexity O(ity*jty) - let reqdTyInfos = - intfSets |> List.map (fun (i,reqdTy,impliedTys,m) -> - let reduced = - (impliedTys,intfSets) ||> List.fold (fun acc (j,jty,impliedTys2,m) -> - if i <> j && TypeFeasiblySubsumesType 0 g amap m jty CanCoerce reqdTy - then ListSet.subtract (TypesFeasiblyEquiv 0 g amap m) acc impliedTys2 - else acc ) - (i, reqdTy, m, reduced)) - - // Check that, for each implemented type, at least one implemented type is implied. This is enough to capture - // duplicates. - for (_i, reqdTy, m, impliedTys) in reqdTyInfos do - if isInterfaceTy g reqdTy && isNil impliedTys then - errorR(Error(FSComp.SR.typrelDuplicateInterface(),m)) - - // Check that no interface type is implied twice - // - // Note complexity O(reqdTy*reqdTy) - for (i, _reqdTy, reqdTyRange, impliedTys) in reqdTyInfos do - for (j,_,_,impliedTys2) in reqdTyInfos do - if i > j then - let overlap = ListSet.intersect (TypesFeasiblyEquiv 0 g amap reqdTyRange) impliedTys impliedTys2 - overlap |> List.iter (fun overlappingTy -> - if nonNil(GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange overlappingTy |> List.filter (fun minfo -> minfo.IsVirtual)) then - errorR(Error(FSComp.SR.typrelNeedExplicitImplementation(NicePrint.minimalStringOfType denv (List.head overlap)),reqdTyRange))) - - // Get the SlotImplSet for each implemented type - // This contains the list of required members and the list of available members - [ for (_,reqdTy,reqdTyRange,impliedTys) in reqdTyInfos do - - // Build a set of the implied interface types, for quicker lookup, by nominal type - let isImpliedInterfaceTable = - impliedTys - |> List.filter (isInterfaceTy g) - |> List.map (fun ty -> tcrefOfAppTy g ty, ()) - |> TyconRefMap.OfList - - // Is a member an abstract slot of one of the implied interface types? - let isImpliedInterfaceType ty = - isImpliedInterfaceTable.ContainsKey (tcrefOfAppTy g ty) && - impliedTys |> List.exists (TypesFeasiblyEquiv 0 g amap reqdTyRange ty) - - //let isSlotImpl (minfo:MethInfo) = - // not minfo.IsAbstract && minfo.IsVirtual - - // Compute the abstract slots that require implementations - let dispatchSlots = - [ if isInterfaceTy g reqdTy then - for impliedTy in impliedTys do - // Check if the interface has an inherited implementation - // If so, you do not have to implement all the methods - each - // specific method is "optionally" implemented. - let isOptional = - ListSet.contains (typeEquiv g) impliedTy availImpliedInterfaces - for reqdSlot in GetImmediateIntrinsicMethInfosOfType (None,AccessibleFromSomewhere) g amap reqdTyRange impliedTy do - yield RequiredSlot(reqdSlot, isOptional) - else - - // In the normal case, the requirements for a class are precisely all the abstract slots up the whole hierarchy. - // So here we get and yield all of those. - for minfo in reqdTy |> GetIntrinsicMethInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange do - if minfo.IsDispatchSlot then - yield RequiredSlot(minfo,(*isOptional=*)false) ] - - - // Compute the methods that are available to implement abstract slots from the base class - // - // This is used in CheckDispatchSlotsAreImplemented when we think a dispatch slot may not - // have been implemented. - let availPriorOverrides : OverrideInfo list = - if isInterfaceTy g reqdTy then - [] - else - let reqdTy = - let baseTyOpt = if isObjExpr then Some reqdTy else GetSuperTypeOfType g amap reqdTyRange reqdTy - match baseTyOpt with - | None -> reqdTy - | Some baseTy -> baseTy - [ // Get any class hierarchy methods on this type - // - // NOTE: What we have below is an over-approximation that will get too many methods - // and not always correctly relate them to the slots they implement. For example, - // we may get an override from a base class and believe it implements a fresh, new abstract - // slot in a subclass. - for minfos in infoReader.GetRawIntrinsicMethodSetsOfType(None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes,reqdTyRange,reqdTy) do - for minfo in minfos do - if not minfo.IsAbstract then - yield GetInheritedMemberOverrideInfo g amap reqdTyRange CanImplementAnyClassHierarchySlot minfo ] - - // We also collect up the properties. This is used for abstract slot inference when overriding properties - let isRelevantRequiredProperty (x:PropInfo) = - (x.IsVirtualProperty && not (isInterfaceTy g reqdTy)) || - isImpliedInterfaceType x.EnclosingType - - let reqdProperties = - GetIntrinsicPropInfosOfType infoReader (None,AccessibleFromSomewhere,AllowMultiIntfInstantiations.Yes) IgnoreOverrides reqdTyRange reqdTy - |> List.filter isRelevantRequiredProperty - - let dispatchSlotsKeyed = dispatchSlots |> NameMultiMap.initBy (fun (RequiredSlot(v,_)) -> v.LogicalName) - yield SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides, reqdProperties) ] - - - /// Check that a type definition implements all its required interfaces after processing all declarations - /// within a file. - let CheckImplementationRelationAtEndOfInferenceScope (infoReader :InfoReader,denv,nenv,sink,tycon:Tycon,isImplementation) = - - let g = infoReader.g - let amap = infoReader.amap - - let tcaug = tycon.TypeContents - let interfaces = tycon.ImmediateInterfacesOfFSharpTycon |> List.map (fun (ity,_compgen,m) -> (ity,m)) - - let overallTy = generalizedTyconRef (mkLocalTyconRef tycon) - - let allReqdTys = (overallTy,tycon.Range) :: interfaces - - // Get all the members that are immediately part of this type - // Include the auto-generated members - let allImmediateMembers = tycon.MembersOfFSharpTyconSorted @ tycon.AllGeneratedValues - - // Get all the members we have to implement, organized by each type we explicitly implement - let slotImplSets = GetSlotImplSets infoReader denv false allReqdTys - - let allImpls = List.zip allReqdTys slotImplSets - - // Find the methods relevant to implementing the abstract slots listed under the reqdType being checked. - let allImmediateMembersThatMightImplementDispatchSlots = - allImmediateMembers |> List.filter (fun overrideBy -> - overrideBy.IsInstanceMember && // exclude static - overrideBy.IsVirtualMember && // exclude non virtual (e.g. keep override/default). [4469] - not overrideBy.IsDispatchSlotMember) - - let mustOverrideSomething reqdTy (overrideBy:ValRef) = - let memberInfo = overrideBy.MemberInfo.Value - not (overrideBy.IsFSharpEventProperty(g)) && - memberInfo.MemberFlags.IsOverrideOrExplicitImpl && - - match memberInfo.ImplementedSlotSigs with - | [] -> - // Are we looking at the implementation of the class hierarchy? If so include all the override members - not (isInterfaceTy g reqdTy) - | ss -> - ss |> List.forall (fun ss -> - let ty = ss.ImplementedType - if isInterfaceTy g ty then - // Is this a method impl listed under the reqdTy? - typeEquiv g ty reqdTy - else - not (isInterfaceTy g reqdTy) ) - - - // We check all the abstracts related to the class hierarchy and then check each interface implementation - for ((reqdTy,m),slotImplSet) in allImpls do - let (SlotImplSet(dispatchSlots, dispatchSlotsKeyed, availPriorOverrides,_)) = slotImplSet - try - - // Now extract the information about each overriding method relevant to this SlotImplSet - let allImmediateMembersThatMightImplementDispatchSlots = - allImmediateMembersThatMightImplementDispatchSlots - |> List.map (fun overrideBy -> overrideBy,GetTypeMemberOverrideInfo g reqdTy overrideBy) - - // Now check the implementation - // We don't give missing method errors for abstract classes - - if isImplementation && not (isInterfaceTy g overallTy) then - let overrides = allImmediateMembersThatMightImplementDispatchSlots |> List.map snd - let allCorrect = CheckDispatchSlotsAreImplemented (denv,g,amap,m,nenv,sink,tcaug.tcaug_abstract,reqdTy,dispatchSlots,availPriorOverrides,overrides) - - // Tell the user to mark the thing abstract if it was missing implementations - if not allCorrect && not tcaug.tcaug_abstract && not (isInterfaceTy g reqdTy) then - errorR(TypeIsImplicitlyAbstract(m)) - - let overridesToCheck = - allImmediateMembersThatMightImplementDispatchSlots - |> List.filter (fst >> mustOverrideSomething reqdTy) - |> List.map snd - - CheckOverridesAreAllUsedOnce (denv, g, amap, false, reqdTy, dispatchSlotsKeyed, availPriorOverrides, overridesToCheck) - - with e -> errorRecovery e m - - // Now record the full slotsigs of the abstract members implemented by each override. - // This is used to generate IL MethodImpls in the code generator. - allImmediateMembersThatMightImplementDispatchSlots |> List.iter (fun overrideBy -> - - let isFakeEventProperty = overrideBy.IsFSharpEventProperty(g) - let overriden = - if isFakeEventProperty then - let slotsigs = overrideBy.MemberInfo.Value.ImplementedSlotSigs - slotsigs |> List.map (ReparentSlotSigToUseMethodTypars g overrideBy.Range overrideBy) - else - [ for ((reqdTy,m),(SlotImplSet(_dispatchSlots,dispatchSlotsKeyed,_,_))) in allImpls do - let overrideByInfo = GetTypeMemberOverrideInfo g reqdTy overrideBy - let overridenForThisSlotImplSet = - [ for (RequiredSlot(dispatchSlot,_)) in NameMultiMap.find overrideByInfo.LogicalName dispatchSlotsKeyed do - if OverrideImplementsDispatchSlot g amap m dispatchSlot overrideByInfo then - if tyconRefEq g overrideByInfo.BoundingTyconRef (tcrefOfAppTy g dispatchSlot.EnclosingType) then - match dispatchSlot.ArbitraryValRef with - | Some virtMember -> - if virtMember.MemberInfo.Value.IsImplemented then errorR(Error(FSComp.SR.tcDefaultImplementationAlreadyExists(),overrideByInfo.Range)) - virtMember.MemberInfo.Value.IsImplemented <- true - | None -> () // not an F# slot - - // Get the slotsig of the overridden method - let slotsig = dispatchSlot.GetSlotSig(amap, m) - - // The slotsig from the overridden method is in terms of the type parameters on the parent type of the overriding method, - // Modify map the slotsig so it is in terms of the type parameters for the overriding method - let slotsig = ReparentSlotSigToUseMethodTypars g m overrideBy slotsig - - // Record the slotsig via mutation - yield slotsig ] - //if mustOverrideSomething reqdTy overrideBy then - // assert nonNil overridenForThisSlotImplSet - yield! overridenForThisSlotImplSet ] - - overrideBy.MemberInfo.Value.ImplementedSlotSigs <- overriden) - - -//------------------------------------------------------------------------- -// Sets of methods involved in overload resolution and trait constraint -// satisfaction. -//------------------------------------------------------------------------- - -/// In the following, 'T gets instantiated to: -/// 1. the expression being supplied for an argument -/// 2. "unit", when simply checking for the existence of an overload that satisfies -/// a signature, or when finding the corresponding witness. -/// Note the parametricity helps ensure that overload resolution doesn't depend on the -/// expression on the callside (though it is in some circumstances allowed -/// to depend on some type information inferred syntactically from that -/// expression, e.g. a lambda expression may be converted to a delegate as -/// an adhoc conversion. -/// -/// The bool indicates if named using a '?' -type CallerArg<'T> = - /// CallerArg(ty, range, isOpt, exprInfo) - | CallerArg of TType * range * bool * 'T - member x.Type = (let (CallerArg(ty,_,_,_)) = x in ty) - member x.Range = (let (CallerArg(_,m,_,_)) = x in m) - member x.IsOptional = (let (CallerArg(_,_,isOpt,_)) = x in isOpt) - member x.Expr = (let (CallerArg(_,_,_,expr)) = x in expr) - -/// Represents the information about an argument in the method being called -type CalledArg = - { Position: (int * int) - IsParamArray : bool - OptArgInfo : OptionalArgInfo - CallerInfoInfo : CallerInfoInfo - IsOutArg: bool - ReflArgInfo: ReflectedArgInfo - NameOpt: Ident option - CalledArgumentType : TType } - -let CalledArg(pos,isParamArray,optArgInfo,callerInfoInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = - { Position=pos - IsParamArray=isParamArray - OptArgInfo =optArgInfo - CallerInfoInfo = callerInfoInfo - IsOutArg=isOutArg - ReflArgInfo=reflArgInfo - NameOpt=nameOpt - CalledArgumentType = calledArgTy } - -/// Represents a match between a caller argument and a called argument, arising from either -/// a named argument or an unnamed argument. -type AssignedCalledArg<'T> = - { /// The identifier for a named argument, if any - NamedArgIdOpt : Ident option - /// The called argument in the method - CalledArg: CalledArg - /// The argument on the caller side - CallerArg: CallerArg<'T> } - member x.Position = x.CalledArg.Position - -/// Represents the possibilities for a named-setter argument (a property, field , or a record field setter) -type AssignedItemSetterTarget = - | AssignedPropSetter of PropInfo * MethInfo * TypeInst (* the MethInfo is a non-indexer setter property *) - | AssignedILFieldSetter of ILFieldInfo - | AssignedRecdFieldSetter of RecdFieldInfo - -/// Represents the resolution of a caller argument as a named-setter argument -type AssignedItemSetter<'T> = AssignedItemSetter of Ident * AssignedItemSetterTarget * CallerArg<'T> - -type CallerNamedArg<'T> = - | CallerNamedArg of Ident * CallerArg<'T> - member x.Ident = (let (CallerNamedArg(id,_)) = x in id) - member x.Name = x.Ident.idText - member x.CallerArg = (let (CallerNamedArg(_,a)) = x in a) - -//------------------------------------------------------------------------- -// Callsite conversions -//------------------------------------------------------------------------- - -// F# supports three adhoc conversions at method callsites (note C# supports more, though ones -// such as implicit conversions interact badly with type inference). -// -// 1. The use of "(fun x y -> ...)" when a delegate it expected. This is not part of -// the ":>" coercion relationship or inference constraint problem as -// such, but is a special rule applied only to method arguments. -// -// The function AdjustCalledArgType detects this case based on types and needs to know that the type being applied -// is a function type. -// -// 2. The use of "(fun x y -> ...)" when Expression it expected. This is similar to above. -// -// 3. Two ways to pass a value where a byref is expected. The first (default) -// is to use a reference cell, and the interior address is taken automatically -// The second is an explicit use of the "address-of" operator "&e". Here we detect the second case, -// and record the presence of the sytnax "&e" in the pre-inferred actual type for the method argument. -// The function AdjustCalledArgType detects this and refuses to apply the default byref-to-ref transformation. -// -// The function AdjustCalledArgType also adjusts for optional arguments. -let AdjustCalledArgType (infoReader:InfoReader) isConstraint (calledArg: CalledArg) (callerArg: CallerArg<_>) = - let g = infoReader.g - // #424218 - when overload resolution is part of constraint solving - do not perform type-directed conversions - let calledArgTy = calledArg.CalledArgumentType - let callerArgTy = callerArg.Type - let m = callerArg.Range - if isConstraint then calledArgTy else - // If the called method argument is a byref type, then the caller may provide a byref or ref - if isByrefTy g calledArgTy then - if isByrefTy g callerArgTy then - calledArgTy - else - mkRefCellTy g (destByrefTy g calledArgTy) - else - // If the called method argument is a delegate type, then the caller may provide a function - let calledArgTy = - let adjustDelegateTy calledTy = - let (SigOfFunctionForDelegate(_,delArgTys,_,fty)) = GetSigOfFunctionForDelegate infoReader calledTy m AccessibleFromSomeFSharpCode - let delArgTys = (if isNil delArgTys then [g.unit_ty] else delArgTys) - if (fst (stripFunTy g callerArgTy)).Length = delArgTys.Length - then fty - else calledArgTy - - if isDelegateTy g calledArgTy && isFunTy g callerArgTy then - adjustDelegateTy calledArgTy - - elif isLinqExpressionTy g calledArgTy && isFunTy g callerArgTy then - let origArgTy = calledArgTy - let calledArgTy = destLinqExpressionTy g calledArgTy - if isDelegateTy g calledArgTy then - adjustDelegateTy calledArgTy - else - // BUG 435170: called arg is Expr<'t> where 't is not delegate - such conversion is not legal -> return original type - origArgTy - - elif calledArg.ReflArgInfo.AutoQuote && isQuotedExprTy g calledArgTy && not (isQuotedExprTy g callerArgTy) then - destQuotedExprTy g calledArgTy - - else calledArgTy - - // Adjust the called argument type to take into account whether the caller's argument is M(?arg=Some(3)) or M(arg=1) - // If the called method argument is optional with type Option, then the caller may provide a T, unless their argument is propogating-optional (i.e. isOptCallerArg) - let calledArgTy = - match calledArg.OptArgInfo with - | NotOptional -> calledArgTy - | CalleeSide when not callerArg.IsOptional && isOptionTy g calledArgTy -> destOptionTy g calledArgTy - | CalleeSide | CallerSide _ -> calledArgTy - calledArgTy - - -//------------------------------------------------------------------------- -// CalledMeth -//------------------------------------------------------------------------- - -type CalledMethArgSet<'T> = - { /// The called arguments corresponding to "unnamed" arguments - UnnamedCalledArgs : CalledArg list - /// Any unnamed caller arguments not otherwise assigned - UnnamedCallerArgs : CallerArg<'T> list - /// The called "ParamArray" argument, if any - ParamArrayCalledArgOpt : CalledArg option - /// Any unnamed caller arguments assigned to a "param array" argument - ParamArrayCallerArgs : CallerArg<'T> list - /// Named args - AssignedNamedArgs: AssignedCalledArg<'T> list } - member x.NumUnnamedCallerArgs = x.UnnamedCallerArgs.Length - member x.NumAssignedNamedArgs = x.AssignedNamedArgs.Length - member x.NumUnnamedCalledArgs = x.UnnamedCalledArgs.Length - - -let MakeCalledArgs amap m (minfo:MethInfo) minst = - // Mark up the arguments with their position, so we can sort them back into order later - let paramDatas = minfo.GetParamDatas(amap, m, minst) - paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,callerInfoFlags,nmOpt,reflArgInfo,typeOfCalledArg)) -> - { Position=(i,j) - IsParamArray=isParamArrayArg - OptArgInfo=optArgInfo - CallerInfoInfo=callerInfoFlags - IsOutArg=isOutArg - ReflArgInfo=reflArgInfo - NameOpt=nmOpt - CalledArgumentType=typeOfCalledArg }) - -/// Represents the syntactic matching between a caller of a method and the called method. -/// -/// The constructor takes all the information about the caller and called side of a method, match up named arguments, property setters etc., -/// and returns a CalledMeth object for further analysis. -type CalledMeth<'T> - (infoReader:InfoReader, - nameEnv: NameResolutionEnv option, - isCheckingAttributeCall, - freshenMethInfo,// a function to help generate fresh type variables the property setters methods in generic classes - m, - ad, // the access domain of the place where the call is taking place - minfo:MethInfo, // the method we're attempting to call - calledTyArgs, // the 'called type arguments', i.e. the fresh generic instantiation of the method we're attempting to call - callerTyArgs: TType list, // the 'caller type arguments', i.e. user-given generic instantiation of the method we're attempting to call - pinfoOpt: PropInfo option, // the property related to the method we're attempting to call, if any - callerObjArgTys: TType list, // the types of the actual object argument, if any - curriedCallerArgs: (CallerArg<'T> list * CallerNamedArg<'T> list) list, // the data about any arguments supplied by the caller - allowParamArgs:bool, // do we allow the use of a param args method in its "expanded" form? - allowOutAndOptArgs: bool, // do we allow the use of the transformation that converts out arguments as tuple returns? - tyargsOpt : TType option) // method parameters - = - let g = infoReader.g - let methodRetTy = minfo.GetFSharpReturnTy(infoReader.amap, m, calledTyArgs) - - let fullCurriedCalledArgs = MakeCalledArgs infoReader.amap m minfo calledTyArgs - do assert (fullCurriedCalledArgs.Length = fullCurriedCalledArgs.Length) - - let argSetInfos = - (curriedCallerArgs, fullCurriedCalledArgs) ||> List.map2 (fun (unnamedCallerArgs,namedCallerArgs) fullCalledArgs -> - // Find the arguments not given by name - let unnamedCalledArgs = - fullCalledArgs |> List.filter (fun calledArg -> - match calledArg.NameOpt with - | Some nm -> namedCallerArgs |> List.forall (fun (CallerNamedArg(nm2,_e)) -> nm.idText <> nm2.idText) - | None -> true) - - // See if any of them are 'out' arguments being returned as part of a return tuple - let unnamedCalledArgs, unnamedCalledOptArgs, unnamedCalledOutArgs = - let nUnnamedCallerArgs = unnamedCallerArgs.Length - if allowOutAndOptArgs && nUnnamedCallerArgs < unnamedCalledArgs.Length then - let unnamedCalledArgsTrimmed,unnamedCalledOptOrOutArgs = List.chop nUnnamedCallerArgs unnamedCalledArgs - - // Check if all optional/out arguments are byref-out args - if unnamedCalledOptOrOutArgs |> List.forall (fun x -> x.IsOutArg && isByrefTy g x.CalledArgumentType) then - unnamedCalledArgsTrimmed,[],unnamedCalledOptOrOutArgs - // Check if all optional/out arguments are optional args - elif unnamedCalledOptOrOutArgs |> List.forall (fun x -> x.OptArgInfo.IsOptional) then - unnamedCalledArgsTrimmed,unnamedCalledOptOrOutArgs,[] - // Otherwise drop them on the floor - else - unnamedCalledArgs,[],[] - else - unnamedCalledArgs,[],[] - - let (unnamedCallerArgs,paramArrayCallerArgs),unnamedCalledArgs,paramArrayCalledArgOpt = - let minArgs = unnamedCalledArgs.Length - 1 - let supportsParamArgs = - allowParamArgs && - minArgs >= 0 && - unnamedCalledArgs |> List.last |> (fun calledArg -> calledArg.IsParamArray && isArray1DTy g calledArg.CalledArgumentType) - - if supportsParamArgs && unnamedCallerArgs.Length >= minArgs then - let a,b = List.frontAndBack unnamedCalledArgs - List.chop minArgs unnamedCallerArgs, a, Some(b) - else - (unnamedCallerArgs, []),unnamedCalledArgs, None - - let assignedNamedArgs = - fullCalledArgs |> List.choose (fun calledArg -> - match calledArg.NameOpt with - | Some nm -> - namedCallerArgs |> List.tryPick (fun (CallerNamedArg(nm2,callerArg)) -> - if nm.idText = nm2.idText then Some { NamedArgIdOpt = Some nm2; CallerArg=callerArg; CalledArg=calledArg } - else None) - | _ -> None) - - let unassignedNamedItem = - namedCallerArgs |> List.filter (fun (CallerNamedArg(nm,_e)) -> - fullCalledArgs |> List.forall (fun calledArg -> - match calledArg.NameOpt with - | Some nm2 -> nm.idText <> nm2.idText - | None -> true)) - - let attributeAssignedNamedItems,unassignedNamedItem = - if isCheckingAttributeCall then - // the assignment of names to properties is substantially for attribute specifications - // permits bindings of names to non-mutable fields and properties, so we do that using the old - // reliable code for this later on. - unassignedNamedItem,[] - else - [],unassignedNamedItem - - let assignedNamedProps,unassignedNamedItem = - let returnedObjTy = if minfo.IsConstructor then minfo.EnclosingType else methodRetTy - unassignedNamedItem |> List.splitChoose (fun (CallerNamedArg(id,e) as arg) -> - let nm = id.idText - let pinfos = GetIntrinsicPropInfoSetsOfType infoReader (Some(nm),ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides id.idRange returnedObjTy - let pinfos = pinfos |> ExcludeHiddenOfPropInfos g infoReader.amap m - match pinfos with - | [pinfo] when pinfo.HasSetter && not pinfo.IsIndexer -> - let pminfo = pinfo.SetterMethod - let pminst = freshenMethInfo m pminfo - Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e)) - | _ -> - let epinfos = - match nameEnv with - | Some(ne) -> ExtensionPropInfosOfTypeInScope infoReader ne (Some(nm), ad) m returnedObjTy - | _ -> [] - match epinfos with - | [pinfo] when pinfo.HasSetter && not pinfo.IsIndexer -> - let pminfo = pinfo.SetterMethod - let pminst = match minfo with - | MethInfo.FSMeth(_,TType.TType_app(_,types),_,_) -> types - | _ -> freshenMethInfo m pminfo - - let pminst = match tyargsOpt with - | Some(TType.TType_app(_, types)) -> types - | _ -> pminst - Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e)) - | _ -> - match infoReader.GetILFieldInfosOfType(Some(nm),ad,m,returnedObjTy) with - | finfo :: _ -> - Choice1Of2(AssignedItemSetter(id,AssignedILFieldSetter(finfo), e)) - | _ -> - match infoReader.TryFindRecdOrClassFieldInfoOfType(nm,m,returnedObjTy) with - | Some rfinfo -> - Choice1Of2(AssignedItemSetter(id,AssignedRecdFieldSetter(rfinfo), e)) - | None -> - Choice2Of2(arg)) - - let names = namedCallerArgs |> List.map (fun (CallerNamedArg(nm,_)) -> nm.idText) - - if (List.noRepeats String.order names).Length <> namedCallerArgs.Length then - errorR(Error(FSComp.SR.typrelNamedArgumentHasBeenAssignedMoreThenOnce(),m)) - - let argSet = { UnnamedCalledArgs=unnamedCalledArgs; UnnamedCallerArgs=unnamedCallerArgs; ParamArrayCalledArgOpt=paramArrayCalledArgOpt; ParamArrayCallerArgs=paramArrayCallerArgs; AssignedNamedArgs=assignedNamedArgs } - - (argSet,assignedNamedProps,unassignedNamedItem,attributeAssignedNamedItems,unnamedCalledOptArgs,unnamedCalledOutArgs)) - - let argSets = argSetInfos |> List.map (fun (x,_,_,_,_,_) -> x) - let assignedNamedProps = argSetInfos |> List.collect (fun (_,x,_,_,_,_) -> x) - let unassignedNamedItems = argSetInfos |> List.collect (fun (_,_,x,_,_,_) -> x) - let attributeAssignedNamedItems = argSetInfos |> List.collect (fun (_,_,_,x,_,_) -> x) - let unnamedCalledOptArgs = argSetInfos |> List.collect (fun (_,_,_,_,x,_) -> x) - let unnamedCalledOutArgs = argSetInfos |> List.collect (fun (_,_,_,_,_,x) -> x) - - member x.infoReader = infoReader - member x.amap = infoReader.amap - - /// the method we're attempting to call - member x.Method=minfo - /// the instantiation of the method we're attempting to call - member x.CalledTyArgs=calledTyArgs - /// the formal instantiation of the method we're attempting to call - member x.CallerTyArgs=callerTyArgs - /// The types of the actual object arguments, if any - member x.CallerObjArgTys=callerObjArgTys - /// The argument analysis for each set of curried arguments - member x.ArgSets=argSets - /// return type - member x.ReturnType=methodRetTy - /// named setters - member x.AssignedItemSetters=assignedNamedProps - /// the property related to the method we're attempting to call, if any - member x.AssociatedPropertyInfo=pinfoOpt - /// unassigned args - member x.UnassignedNamedArgs=unassignedNamedItems - /// args assigned to specify values for attribute fields and properties (these are not necessarily "property sets") - member x.AttributeAssignedNamedArgs=attributeAssignedNamedItems - /// unnamed called optional args: pass defaults for these - member x.UnnamedCalledOptArgs=unnamedCalledOptArgs - /// unnamed called out args: return these as part of the return tuple - member x.UnnamedCalledOutArgs=unnamedCalledOutArgs - - static member GetMethod (x:CalledMeth<'T>) = x.Method - - member x.NumArgSets = x.ArgSets.Length - - member x.HasOptArgs = nonNil x.UnnamedCalledOptArgs - member x.HasOutArgs = nonNil x.UnnamedCalledOutArgs - member x.UsesParamArrayConversion = x.ArgSets |> List.exists (fun argSet -> argSet.ParamArrayCalledArgOpt.IsSome) - member x.ParamArrayCalledArgOpt = x.ArgSets |> List.tryPick (fun argSet -> argSet.ParamArrayCalledArgOpt) - member x.ParamArrayCallerArgs = x.ArgSets |> List.tryPick (fun argSet -> if isSome argSet.ParamArrayCalledArgOpt then Some argSet.ParamArrayCallerArgs else None ) - member x.ParamArrayElementType = - assert (x.UsesParamArrayConversion) - x.ParamArrayCalledArgOpt.Value.CalledArgumentType |> destArrayTy x.amap.g - member x.NumAssignedProps = x.AssignedItemSetters.Length - member x.CalledObjArgTys(m) = x.Method.GetObjArgTypes(x.amap, m, x.CalledTyArgs) - member x.NumCalledTyArgs = x.CalledTyArgs.Length - member x.NumCallerTyArgs = x.CallerTyArgs.Length - - member x.AssignsAllNamedArgs = isNil x.UnassignedNamedArgs - - member x.HasCorrectArity = - (x.NumCalledTyArgs = x.NumCallerTyArgs) && - x.ArgSets |> List.forall (fun argSet -> argSet.NumUnnamedCalledArgs = argSet.NumUnnamedCallerArgs) - - member x.HasCorrectGenericArity = - (x.NumCalledTyArgs = x.NumCallerTyArgs) - - member x.IsAccessible(m,ad) = - IsMethInfoAccessible x.amap m ad x.Method - - member x.HasCorrectObjArgs(m) = - x.CalledObjArgTys(m).Length = x.CallerObjArgTys.Length - - member x.IsCandidate(m,ad) = - x.IsAccessible(m,ad) && - x.HasCorrectArity && - x.HasCorrectObjArgs(m) && - x.AssignsAllNamedArgs - - member x.AssignedUnnamedArgs = - // We use Seq.map2 to tolerate there being mismatched caller/called args - x.ArgSets |> List.map (fun argSet -> - (argSet.UnnamedCalledArgs, argSet.UnnamedCallerArgs) ||> Seq.map2 (fun calledArg callerArg -> - { NamedArgIdOpt=None; CalledArg=calledArg; CallerArg=callerArg }) |> Seq.toList) - - member x.AssignedNamedArgs = - x.ArgSets |> List.map (fun argSet -> argSet.AssignedNamedArgs) - - member x.AllUnnamedCalledArgs = x.ArgSets |> List.collect (fun x -> x.UnnamedCalledArgs) - member x.TotalNumUnnamedCalledArgs = x.ArgSets |> List.sumBy (fun x -> x.NumUnnamedCalledArgs) - member x.TotalNumUnnamedCallerArgs = x.ArgSets |> List.sumBy (fun x -> x.NumUnnamedCallerArgs) - member x.TotalNumAssignedNamedArgs = x.ArgSets |> List.sumBy (fun x -> x.NumAssignedNamedArgs) - -let NamesOfCalledArgs (calledArgs: CalledArg list) = - calledArgs |> List.choose (fun x -> x.NameOpt) - -//------------------------------------------------------------------------- -// Helpers dealing with propagating type information in method overload resolution -//------------------------------------------------------------------------- - -type ArgumentAnalysis = - | NoInfo - | ArgDoesNotMatch - | CallerLambdaHasArgTypes of TType list - | CalledArgMatchesType of TType - -let InferLambdaArgsForLambdaPropagation origRhsExpr = - let rec loop e = - match e with - | SynExpr.Lambda(_,_,_,rest,_) -> 1 + loop rest - | SynExpr.MatchLambda _ -> 1 - | _ -> 0 - loop origRhsExpr - -let ExamineArgumentForLambdaPropagation (infoReader:InfoReader) (arg: AssignedCalledArg) = - let g = infoReader.g - // Find the explicit lambda arguments of the caller. Ignore parentheses. - let argExpr = match arg.CallerArg.Expr with SynExpr.Paren(x,_,_,_) -> x | x -> x - let countOfCallerLambdaArg = InferLambdaArgsForLambdaPropagation argExpr - // Adjust for Expression<_>, Func<_,_>, ... - let adjustedCalledArgTy = AdjustCalledArgType infoReader false arg.CalledArg arg.CallerArg - if countOfCallerLambdaArg > 0 then - // Decompose the explicit function type of the target - let calledLambdaArgTys,_calledLambdaRetTy = Tastops.stripFunTy g adjustedCalledArgTy - if calledLambdaArgTys.Length >= countOfCallerLambdaArg then - // success - CallerLambdaHasArgTypes calledLambdaArgTys - elif isDelegateTy g (if isLinqExpressionTy g adjustedCalledArgTy then destLinqExpressionTy g adjustedCalledArgTy else adjustedCalledArgTy) then - ArgDoesNotMatch // delegate arity mismatch - else - NoInfo // not a function type on the called side - no information - else CalledArgMatchesType(adjustedCalledArgTy) // not a lambda on the caller side - push information from caller to called - -let ExamineMethodForLambdaPropagation(x:CalledMeth) = - let unnamedInfo = x.AssignedUnnamedArgs |> List.mapSquared (ExamineArgumentForLambdaPropagation x.infoReader) - let namedInfo = x.AssignedNamedArgs |> List.mapSquared (fun arg -> (arg.NamedArgIdOpt.Value, ExamineArgumentForLambdaPropagation x.infoReader arg)) - if unnamedInfo |> List.existsSquared (function CallerLambdaHasArgTypes _ -> true | _ -> false) || - namedInfo |> List.existsSquared (function (_,CallerLambdaHasArgTypes _) -> true | _ -> false) then - Some (unnamedInfo, namedInfo) - else - None - - - -//------------------------------------------------------------------------- -// "Type Completion" inference and a few other checks at the end of the inference scope -//------------------------------------------------------------------------- - - -/// "Type Completion" inference and a few other checks at the end of the inference scope -let FinalTypeDefinitionChecksAtEndOfInferenceScope (infoReader:InfoReader, nenv, sink, isImplementation, denv) (tycon:Tycon) = - - let g = infoReader.g - let amap = infoReader.amap - - let tcaug = tycon.TypeContents - tcaug.tcaug_closed <- true - - // Note you only have to explicitly implement 'System.IComparable' to customize structural comparison AND equality on F# types - if isImplementation && -#if EXTENSIONTYPING - not tycon.IsProvidedGeneratedTycon && -#endif - isNone tycon.GeneratedCompareToValues && - tycon.HasInterface g g.mk_IComparable_ty && - not (tycon.HasOverride g "Equals" [g.obj_ty]) && - not tycon.IsFSharpInterfaceTycon - then - (* Warn when we're doing this for class types *) - if AugmentWithHashCompare.TyconIsCandidateForAugmentationWithEquals g tycon then - warning(Error(FSComp.SR.typrelTypeImplementsIComparableShouldOverrideObjectEquals(tycon.DisplayName),tycon.Range)) - else - warning(Error(FSComp.SR.typrelTypeImplementsIComparableDefaultObjectEqualsProvided(tycon.DisplayName),tycon.Range)) - - AugmentWithHashCompare.CheckAugmentationAttribs isImplementation g amap tycon - // Check some conditions about generic comparison and hashing. We can only check this condition after we've done the augmentation - if isImplementation -#if EXTENSIONTYPING - && not tycon.IsProvidedGeneratedTycon -#endif - then - let tcaug = tycon.TypeContents - let m = tycon.Range - let hasExplicitObjectGetHashCode = tycon.HasOverride g "GetHashCode" [] - let hasExplicitObjectEqualsOverride = tycon.HasOverride g "Equals" [g.obj_ty] - - if (isSome tycon.GeneratedHashAndEqualsWithComparerValues) && - (hasExplicitObjectGetHashCode || hasExplicitObjectEqualsOverride) then - errorR(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCodeOrEquals(tycon.DisplayName),m)) - - if not hasExplicitObjectEqualsOverride && hasExplicitObjectGetHashCode then - warning(Error(FSComp.SR.typrelExplicitImplementationOfGetHashCode(tycon.DisplayName),m)) - - if hasExplicitObjectEqualsOverride && not hasExplicitObjectGetHashCode then - warning(Error(FSComp.SR.typrelExplicitImplementationOfEquals(tycon.DisplayName),m)) - - - // remember these values to ensure we don't generate these methods during codegen - tcaug.SetHasObjectGetHashCode hasExplicitObjectGetHashCode - - if not tycon.IsHiddenReprTycon - && not tycon.IsTypeAbbrev - && not tycon.IsMeasureableReprTycon - && not tycon.IsAsmReprTycon - && not tycon.IsFSharpInterfaceTycon - && not tycon.IsFSharpDelegateTycon then - - DispatchSlotChecking.CheckImplementationRelationAtEndOfInferenceScope (infoReader,denv,nenv,sink,tycon,isImplementation) - -//------------------------------------------------------------------------- -// Additional helpers for type checking and constraint solving -//------------------------------------------------------------------------- - /// "Single Feasible Type" inference /// Look for the unique supertype of ty2 for which ty2 :> ty1 might feasibly hold let FindUniqueFeasibleSupertype g amap m ty1 ty2 = @@ -2019,661 +295,3 @@ let FindUniqueFeasibleSupertype g amap m ty1 ty2 = supertypes |> List.tryFind (TypeFeasiblySubsumesType 0 g amap m ty1 NoCoerce) - -/// Get the methods relevant to determining if a uniquely-identified-override exists based on the syntactic information -/// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractMethInfosForSynMethodDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,valSynData) = - let minfos = - match typToSearchForAbstractMembers with - | _,Some(SlotImplSet(_, dispatchSlotsKeyed,_,_)) -> - NameMultiMap.find memberName.idText dispatchSlotsKeyed |> List.map (fun (RequiredSlot(dispatchSlot,_)) -> dispatchSlot) - | ty, None -> - GetIntrinsicMethInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty - let dispatchSlots = minfos |> List.filter (fun minfo -> minfo.IsDispatchSlot) - let topValSynArities = SynInfo.AritiesOfArgs valSynData - let topValSynArities = if topValSynArities.Length > 0 then topValSynArities.Tail else topValSynArities - let dispatchSlotsArityMatch = dispatchSlots |> List.filter (fun minfo -> minfo.NumArgs = topValSynArities) - dispatchSlots,dispatchSlotsArityMatch - -/// Get the properties relevant to determining if a uniquely-identified-override exists based on the syntactic information -/// at the member signature prior to type inference. This is used to pre-assign type information if it does -let GetAbstractPropInfosForSynPropertyDecl(infoReader:InfoReader,ad,memberName:Ident,bindm,typToSearchForAbstractMembers,_k,_valSynData) = - let pinfos = - match typToSearchForAbstractMembers with - | _,Some(SlotImplSet(_,_,_,reqdProps)) -> - reqdProps |> List.filter (fun pinfo -> pinfo.PropertyName = memberName.idText) - | ty, None -> - GetIntrinsicPropInfosOfType infoReader (Some(memberName.idText), ad, AllowMultiIntfInstantiations.Yes) IgnoreOverrides bindm ty - - let dispatchSlots = pinfos |> List.filter (fun pinfo -> pinfo.IsVirtualProperty) - dispatchSlots - -//------------------------------------------------------------------------- -// Additional helpers for building method calls and doing TAST generation -//------------------------------------------------------------------------- - -/// Is this a 'base' call (in the sense of C#) -let IsBaseCall objArgs = - match objArgs with - | [Expr.Val(v,_,_)] when v.BaseOrThisInfo = BaseVal -> true - | _ -> false - -/// Compute whether we insert a 'coerce' on the 'this' pointer for an object model call -/// For example, when calling an interface method on a struct, or a method on a constrained -/// variable type. -let ComputeConstrainedCallInfo g amap m (objArgs,minfo:MethInfo) = - match objArgs with - | [objArgExpr] when not minfo.IsExtensionMember -> - let methObjTy = minfo.EnclosingType - let objArgTy = tyOfExpr g objArgExpr - if TypeDefinitelySubsumesTypeNoCoercion 0 g amap m methObjTy objArgTy - // Constrained calls to class types can only ever be needed for the three class types that - // are base types of value types - || (isClassTy g methObjTy && - (not (typeEquiv g methObjTy g.system_Object_typ || - typeEquiv g methObjTy g.system_Value_typ || - typeEquiv g methObjTy g.system_Enum_typ))) then - None - else - // The object argument is a value type or variable type and the target method is an interface or System.Object - // type. A .NET 2.0 generic constrained call is required - Some objArgTy - | _ -> - None - - -/// Adjust the 'this' pointer before making a call -/// Take the address of a struct, and coerce to an interface/base/constraint type if necessary -let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = - let ccallInfo = ComputeConstrainedCallInfo g amap m (objArgs,minfo) - let mustTakeAddress = - (minfo.IsStruct && not minfo.IsExtensionMember) // don't take the address of a struct when passing to an extension member - || - (match ccallInfo with - | Some _ -> true - | None -> false) - let wrap,objArgs = - match objArgs with - | [objArgExpr] -> - let objArgTy = tyOfExpr g objArgExpr - let wrap,objArgExpr' = mkExprAddrOfExpr g mustTakeAddress (isSome ccallInfo) isMutable objArgExpr None m - - // Extension members and calls to class constraints may need a coercion for their object argument - let objArgExpr' = - if isNone ccallInfo && // minfo.IsExtensionMember && minfo.IsStruct && - not (TypeDefinitelySubsumesTypeNoCoercion 0 g amap m minfo.EnclosingType objArgTy) then - mkCoerceExpr(objArgExpr',minfo.EnclosingType,m,objArgTy) - else - objArgExpr' - - wrap,[objArgExpr'] - - | _ -> - (fun x -> x), objArgs - let e,ety = f ccallInfo objArgs - wrap e,ety - -//------------------------------------------------------------------------- -// Build method calls. -//------------------------------------------------------------------------- - -#if EXTENSIONTYPING -// This imports a provided method, and checks if it is a known compiler intrinsic like "1 + 2" -let TryImportProvidedMethodBaseAsLibraryIntrinsic (amap:Import.ImportMap, m:range, mbase: Tainted) = - let methodName = mbase.PUntaint((fun x -> x.Name),m) - let declaringType = Import.ImportProvidedType amap m (mbase.PApply((fun x -> x.DeclaringType),m)) - if isAppTy amap.g declaringType then - let declaringEntity = tcrefOfAppTy amap.g declaringType - if not declaringEntity.IsLocalRef && ccuEq declaringEntity.nlr.Ccu amap.g.fslibCcu then - match amap.g.knownIntrinsics.TryGetValue ((declaringEntity.LogicalName, methodName)) with - | true,vref -> Some vref - | _ -> - match amap.g.knownFSharpCoreModules.TryGetValue(declaringEntity.LogicalName) with - | true,modRef -> - match modRef.ModuleOrNamespaceType.AllValsByLogicalName |> Seq.tryPick (fun (KeyValue(_,v)) -> if v.CompiledName = methodName then Some v else None) with - | Some v -> Some (mkNestedValRef modRef v) - | None -> None - | _ -> None - else - None - else - None -#endif - - -/// Build an expression that calls a given method info. -/// This is called after overload resolution, and also to call other -/// methods such as 'setters' for properties. -// tcVal: used to convert an F# value into an expression. See tc.fs. -// isProp: is it a property get? -// minst: the instantiation to apply for a generic method -// objArgs: the 'this' argument, if any -// args: the arguments, if any -let BuildMethodCall tcVal g amap isMutable m isProp minfo valUseFlags minst objArgs args = - - let direct = IsBaseCall objArgs - - TakeObjAddrForMethodCall g amap minfo isMutable m objArgs (fun ccallInfo objArgs -> - let allArgs = (objArgs @ args) - let valUseFlags = - if (direct && (match valUseFlags with NormalValUse -> true | _ -> false)) then - VSlotDirectCall - else - match ccallInfo with - | Some ty -> - // printfn "possible constrained call to '%s' at %A" minfo.LogicalName m - PossibleConstrainedCall ty - | None -> - valUseFlags - - match minfo with -#if EXTENSIONTYPING - // By this time this is an erased method info, e.g. one returned from an expression - // REVIEW: copied from tastops, which doesn't allow protected methods - | ProvidedMeth (amap,providedMeth,_,_) -> - // TODO: there is a fair bit of duplication here with mk_il_minfo_call. We should be able to merge these - - /// Build an expression node that is a call to a extension method in a generated assembly - let enclTy = minfo.EnclosingType - // prohibit calls to methods that are declared in specific array types (Get,Set,Address) - // these calls are provided by the runtime and should not be called from the user code - if isArrayTy g enclTy then - let tpe = TypeProviderError(FSComp.SR.tcRuntimeSuppliedMethodCannotBeUsedInUserCode(minfo.DisplayName), providedMeth.TypeProviderDesignation, m) - error (tpe) - let valu = isStructTy g enclTy - let isCtor = minfo.IsConstructor - if minfo.IsClassConstructor then - error (InternalError (minfo.LogicalName ^": cannot call a class constructor",m)) - let useCallvirt = not valu && not direct && minfo.IsVirtual - let isProtected = minfo.IsProtectedAccessiblity - let exprTy = if isCtor then enclTy else minfo.GetFSharpReturnTy(amap, m, minst) - match TryImportProvidedMethodBaseAsLibraryIntrinsic (amap, m, providedMeth) with - | Some fsValRef -> - //reraise() calls are converted to TOp.Reraise in the type checker. So if a provided expression includes a reraise call - // we must put it in that form here. - if valRefEq amap.g fsValRef amap.g.reraise_vref then - mkReraise m exprTy, exprTy - else - let vexp, vexpty = tcVal fsValRef valUseFlags (minfo.DeclaringTypeInst @ minst) m - BuildFSharpMethodApp g m fsValRef vexp vexpty allArgs - | None -> - let ilMethRef = Import.ImportProvidedMethodBaseAsILMethodRef amap m providedMeth - let isNewObj = isCtor && (match valUseFlags with NormalValUse -> true | _ -> false) - let actualTypeInst = - if isTupleTy g enclTy then argsOfAppTy g (mkCompiledTupleTy g (destTupleTy g enclTy)) // provided expressions can include method calls that get properties of tuple types - elif isFunTy g enclTy then [ domainOfFunTy g enclTy; rangeOfFunTy g enclTy ] // provided expressions can call Invoke - else minfo.DeclaringTypeInst - let actualMethInst = minst - let retTy = (if not isCtor && (ilMethRef.ReturnType = ILType.Void) then [] else [exprTy]) - let noTailCall = false - let expr = Expr.Op(TOp.ILCall(useCallvirt,isProtected,valu,isNewObj,valUseFlags,isProp,noTailCall,ilMethRef,actualTypeInst,actualMethInst, retTy),[],allArgs,m) - expr,exprTy - -#endif - - // Build a call to a .NET method - | ILMeth(_,ilMethInfo,_) -> - BuildILMethInfoCall g amap m isProp ilMethInfo valUseFlags minst direct allArgs - - // Build a call to an F# method - | FSMeth(_, _, vref, _) -> - - // Go see if this is a use of a recursive definition... Note we know the value instantiation - // we want to use so we pass that in order not to create a new one. - let vexp, vexpty = tcVal vref valUseFlags (minfo.DeclaringTypeInst @ minst) m - BuildFSharpMethodApp g m vref vexp vexpty allArgs - - // Build a 'call' to a struct default constructor - | DefaultStructCtor (g,typ) -> - if not (TypeHasDefaultValue g m typ) then - errorR(Error(FSComp.SR.tcDefaultStructConstructorCall(),m)) - mkDefault (m,typ), typ) - -//------------------------------------------------------------------------- -// Build delegate constructions (lambdas/functions to delegates) -//------------------------------------------------------------------------- - -/// Implements the elaborated form of adhoc conversions from functions to delegates at member callsites -let BuildNewDelegateExpr (eventInfoOpt:EventInfo option, g, amap, delegateTy, invokeMethInfo:MethInfo, delArgTys, f, fty, m) = - let slotsig = invokeMethInfo.GetSlotSig(amap, m) - let delArgVals,expr = - let topValInfo = ValReprInfo([],List.replicate (List.length delArgTys) ValReprInfo.unnamedTopArg, ValReprInfo.unnamedRetVal) - - // Try to pull apart an explicit lambda and use it directly - // Don't do this in the case where we're adjusting the arguments of a function used to build a .NET-compatible event handler - let lambdaContents = - if isSome eventInfoOpt then - None - else - tryDestTopLambda g amap topValInfo (f, fty) - match lambdaContents with - | None -> - - if List.exists (isByrefTy g) delArgTys then - error(Error(FSComp.SR.tcFunctionRequiresExplicitLambda(List.length delArgTys),m)) - - let delArgVals = delArgTys |> List.map (fun argty -> fst (mkCompGenLocal m "delegateArg" argty)) - let expr = - let args = - match eventInfoOpt with - | Some einfo -> - match delArgVals with - | [] -> error(nonStandardEventError einfo.EventName m) - | h :: _ when not (isObjTy g h.Type) -> error(nonStandardEventError einfo.EventName m) - | h :: t -> [exprForVal m h; mkTupledVars g m t] - | None -> - if isNil delArgTys then [mkUnit g m] else List.map (exprForVal m) delArgVals - mkApps g ((f,fty),[],args,m) - delArgVals,expr - - | Some _ -> - if isNil delArgTys then [], mkApps g ((f,fty),[],[mkUnit g m],m) - else - let _,_,_,vsl,body,_ = IteratedAdjustArityOfLambda g amap topValInfo f - List.concat vsl, body - - let meth = TObjExprMethod(slotsig, [], [], [delArgVals], expr, m) - mkObjExpr(delegateTy,None,BuildObjCtorCall g m,[meth],[],m) - -let CoerceFromFSharpFuncToDelegate g amap infoReader ad callerArgTy m callerArgExpr delegateTy = - let (SigOfFunctionForDelegate(invokeMethInfo,delArgTys,_,_)) = GetSigOfFunctionForDelegate infoReader delegateTy m ad - BuildNewDelegateExpr (None, g, amap, delegateTy, invokeMethInfo, delArgTys, callerArgExpr, callerArgTy, m) - - -//------------------------------------------------------------------------- -// Import provided expressions -//------------------------------------------------------------------------- - - -#if EXTENSIONTYPING -// This file is not a great place for this functionality to sit, it's here because of BuildMethodCall -module ProvidedMethodCalls = - - let private convertConstExpr g amap m (constant : Tainted) = - let (obj,objTy) = constant.PApply2(id,m) - let ty = Import.ImportProvidedType amap m objTy - let normTy = normalizeEnumTy g ty - obj.PUntaint((fun v -> - let fail() = raise <| TypeProviderError(FSComp.SR.etUnsupportedConstantType(v.GetType().ToString()), constant.TypeProviderDesignation, m) - try - match v with - | null -> mkNull m ty - | _ when typeEquiv g normTy g.bool_ty -> Expr.Const(Const.Bool(v :?> bool), m, ty) - | _ when typeEquiv g normTy g.sbyte_ty -> Expr.Const(Const.SByte(v :?> sbyte), m, ty) - | _ when typeEquiv g normTy g.byte_ty -> Expr.Const(Const.Byte(v :?> byte), m, ty) - | _ when typeEquiv g normTy g.int16_ty -> Expr.Const(Const.Int16(v :?> int16), m, ty) - | _ when typeEquiv g normTy g.uint16_ty -> Expr.Const(Const.UInt16(v :?> uint16), m, ty) - | _ when typeEquiv g normTy g.int32_ty -> Expr.Const(Const.Int32(v :?> int32), m, ty) - | _ when typeEquiv g normTy g.uint32_ty -> Expr.Const(Const.UInt32(v :?> uint32), m, ty) - | _ when typeEquiv g normTy g.int64_ty -> Expr.Const(Const.Int64(v :?> int64), m, ty) - | _ when typeEquiv g normTy g.uint64_ty -> Expr.Const(Const.UInt64(v :?> uint64), m, ty) - | _ when typeEquiv g normTy g.nativeint_ty -> Expr.Const(Const.IntPtr(v :?> int64), m, ty) - | _ when typeEquiv g normTy g.unativeint_ty -> Expr.Const(Const.UIntPtr(v :?> uint64), m, ty) - | _ when typeEquiv g normTy g.float32_ty -> Expr.Const(Const.Single(v :?> float32), m, ty) - | _ when typeEquiv g normTy g.float_ty -> Expr.Const(Const.Double(v :?> float), m, ty) - | _ when typeEquiv g normTy g.char_ty -> Expr.Const(Const.Char(v :?> char), m, ty) - | _ when typeEquiv g normTy g.string_ty -> Expr.Const(Const.String(v :?> string), m, ty) - | _ when typeEquiv g normTy g.decimal_ty -> Expr.Const(Const.Decimal(v :?> decimal), m, ty) - | _ when typeEquiv g normTy g.unit_ty -> Expr.Const(Const.Unit, m, ty) - | _ -> fail() - with _ -> - fail() - ), range=m) - - /// Erasure over System.Type. - /// - /// This is a reimplementation of the logic of provided-type erasure, working entirely over (tainted, provided) System.Type - /// values. This is used when preparing ParameterInfo objects to give to the provider in GetInvokerExpression. - /// These ParameterInfo have erased ParameterType - giving the provider an erased type makes it considerably easier - /// to implement a correct GetInvokerExpression. - /// - /// Ideally we would implement this operation by converting to an F# TType using ImportSystemType, and then erasing, and then converting - /// back to System.Type. However, there is currently no way to get from an arbitrary F# TType (even the TType for - /// System.Object) to a System.Type to give to the type provider. - let eraseSystemType (amap,m,inputType) = - let rec loop (st:Tainted) = - if st.PUntaint((fun st -> st.IsGenericParameter),m) then st - elif st.PUntaint((fun st -> st.IsArray),m) then - let et = st.PApply((fun st -> st.GetElementType()),m) - let rank = st.PUntaint((fun st -> st.GetArrayRank()),m) - (loop et).PApply((fun st -> ProvidedType.CreateNoContext(if rank = 1 then st.RawSystemType.MakeArrayType() else st.RawSystemType.MakeArrayType(rank))),m) - elif st.PUntaint((fun st -> st.IsByRef),m) then - let et = st.PApply((fun st -> st.GetElementType()),m) - (loop et).PApply((fun st -> ProvidedType.CreateNoContext(st.RawSystemType.MakeByRefType())),m) - elif st.PUntaint((fun st -> st.IsPointer),m) then - let et = st.PApply((fun st -> st.GetElementType()),m) - (loop et).PApply((fun st -> ProvidedType.CreateNoContext(st.RawSystemType.MakePointerType())),m) - else - let isGeneric = st.PUntaint((fun st -> st.IsGenericType),m) - let headType = if isGeneric then st.PApply((fun st -> st.GetGenericTypeDefinition()),m) else st - // We import in order to use IsProvidedErasedTycon, to make sure we at least don't reinvent that - let headTypeAsFSharpType = Import.ImportProvidedNamedType amap m headType - if headTypeAsFSharpType.IsProvidedErasedTycon then - let baseType = - st.PApply((fun st -> - match st.BaseType with - | null -> ProvidedType.CreateNoContext(typeof) // it might be an interface - | st -> st),m) - loop baseType - else - if isGeneric then - let genericArgs = st.PApplyArray((fun st -> st.GetGenericArguments()),"GetGenericArguments",m) - let typars = headTypeAsFSharpType.Typars(m) - // Drop the generic arguments that don't correspond to type arguments, i.e. are units-of-measure - let genericArgs = - [| for (genericArg,tp) in Seq.zip genericArgs typars do - if tp.Kind = TyparKind.Type then - yield genericArg |] - - if genericArgs.Length = 0 then - headType - else - let erasedArgTys = genericArgs |> Array.map loop - headType.PApply((fun st -> - let erasedArgTys = erasedArgTys |> Array.map (fun a -> a.PUntaintNoFailure (fun x -> x.RawSystemType)) - ProvidedType.CreateNoContext(st.RawSystemType.MakeGenericType erasedArgTys)),m) - else - st - loop inputType - - let convertProvidedExpressionToExprAndWitness tcVal (thisArg:Expr option, - allArgs:Exprs, - paramVars:Tainted[], - g,amap,mut,isProp,isSuperInit,m, - expr:Tainted) = - let varConv = - [ for (v,e) in Seq.zip (paramVars |> Seq.map (fun x -> x.PUntaint(id,m))) (Option.toList thisArg @ allArgs) do - yield (v,(None,e)) ] - |> Dictionary.ofList - - let rec exprToExprAndWitness top (ea:Tainted) = - let fail() = error(Error(FSComp.SR.etUnsupportedProvidedExpression(ea.PUntaint((fun etree -> etree.UnderlyingExpressionString), m)),m)) - match ea with - | Tainted.Null -> error(Error(FSComp.SR.etNullProvidedExpression(ea.TypeProviderDesignation),m)) - | _ -> - match ea.PApplyOption((function ProvidedTypeAsExpr x -> Some x | _ -> None), m) with - | Some info -> - let (expr,targetTy) = info.PApply2(id,m) - let srcExpr = exprToExpr expr - let targetTy = Import.ImportProvidedType amap m (targetTy.PApply(id,m)) - let sourceTy = Import.ImportProvidedType amap m (expr.PApply((fun e -> e.Type),m)) - let te = mkCoerceIfNeeded g targetTy sourceTy srcExpr - None, (te, tyOfExpr g te) - | None -> - match ea.PApplyOption((function ProvidedTypeTestExpr x -> Some x | _ -> None), m) with - | Some info -> - let (expr,targetTy) = info.PApply2(id,m) - let srcExpr = exprToExpr expr - let targetTy = Import.ImportProvidedType amap m (targetTy.PApply(id,m)) - let te = mkCallTypeTest g m targetTy srcExpr - None, (te, tyOfExpr g te) - | None -> - match ea.PApplyOption((function ProvidedIfThenElseExpr x -> Some x | _ -> None), m) with - | Some info -> - let test,thenBranch,elseBranch = info.PApply3(id,m) - let testExpr = exprToExpr test - let ifTrueExpr = exprToExpr thenBranch - let ifFalseExpr = exprToExpr elseBranch - let te = mkCond NoSequencePointAtStickyBinding SuppressSequencePointAtTarget m (tyOfExpr g ifTrueExpr) testExpr ifTrueExpr ifFalseExpr - None, (te, tyOfExpr g te) - | None -> - match ea.PApplyOption((function ProvidedVarExpr x -> Some x | _ -> None), m) with - | Some info -> - let _,vTe = varToExpr info - None, (vTe, tyOfExpr g vTe) - | None -> - match ea.PApplyOption((function ProvidedConstantExpr x -> Some x | _ -> None), m) with - | Some info -> - let ce = convertConstExpr g amap m info - None, (ce, tyOfExpr g ce) - | None -> - match ea.PApplyOption((function ProvidedNewTupleExpr x -> Some x | _ -> None), m) with - | Some info -> - let elems = info.PApplyArray(id, "GetInvokerExpresson",m) - let elemsT = elems |> Array.map exprToExpr |> Array.toList - let exprT = mkTupledNoTypes g m elemsT - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedNewArrayExpr x -> Some x | _ -> None), m) with - | Some info -> - let ty,elems = info.PApply2(id,m) - let tyT = Import.ImportProvidedType amap m ty - let elems = elems.PApplyArray(id, "GetInvokerExpresson",m) - let elemsT = elems |> Array.map exprToExpr |> Array.toList - let exprT = Expr.Op(TOp.Array, [tyT],elemsT,m) - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedTupleGetExpr x -> Some x | _ -> None), m) with - | Some info -> - let inp,n = info.PApply2(id, m) - let inpT = inp |> exprToExpr - // if type of expression is erased type then we need convert it to the underlying base type - let typeOfExpr = - let t = tyOfExpr g inpT - stripTyEqnsWrtErasure EraseMeasures g t - let tysT = tryDestTupleTy g typeOfExpr - let exprT = mkTupleFieldGet (inpT, tysT, n.PUntaint(id,m), m) - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedLambdaExpr x -> Some x | _ -> None), m) with - | Some info -> - let v,b = info.PApply2(id, m) - let vT = addVar v - let bT = exprToExpr b - removeVar v - let exprT = mkLambda m vT (bT, tyOfExpr g bT) - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedLetExpr x -> Some x | _ -> None), m) with - | Some info -> - let v,e,b = info.PApply3(id, m) - let eT = exprToExpr e - let vT = addVar v - let bT = exprToExpr b - removeVar v - let exprT = mkCompGenLet m vT eT bT - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedVarSetExpr x -> Some x | _ -> None), m) with - | Some info -> - let v,e = info.PApply2(id, m) - let eT = exprToExpr e - let vTopt,_ = varToExpr v - match vTopt with - | None -> - fail() - | Some vT -> - let exprT = mkValSet m (mkLocalValRef vT) eT - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedWhileLoopExpr x -> Some x | _ -> None), m) with - | Some info -> - let guardExpr,bodyExpr = info.PApply2(id, m) - let guardExprT = exprToExpr guardExpr - let bodyExprT = exprToExpr bodyExpr - let exprT = mkWhile g (SequencePointInfoForWhileLoop.NoSequencePointAtWhileLoop,SpecialWhileLoopMarker.NoSpecialWhileLoopMarker, guardExprT, bodyExprT, m) - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedForIntegerRangeLoopExpr x -> Some x | _ -> None), m) with - | Some info -> - let v,e1,e2,e3 = info.PApply4(id, m) - let e1T = exprToExpr e1 - let e2T = exprToExpr e2 - let vT = addVar v - let e3T = exprToExpr e3 - removeVar v - let exprT = mkFastForLoop g (SequencePointInfoForForLoop.NoSequencePointAtForLoop,m,vT,e1T,true,e2T,e3T) - None, (exprT, tyOfExpr g exprT) - | None -> - match ea.PApplyOption((function ProvidedNewDelegateExpr x -> Some x | _ -> None), m) with - | Some info -> - let delegateTy,boundVars,delegateBodyExpr = info.PApply3(id, m) - let delegateTyT = Import.ImportProvidedType amap m delegateTy - let vs = boundVars.PApplyArray(id, "GetInvokerExpresson",m) |> Array.toList - let vsT = List.map addVar vs - let delegateBodyExprT = exprToExpr delegateBodyExpr - List.iter removeVar vs - let lambdaExpr = mkLambdas m [] vsT (delegateBodyExprT, tyOfExpr g delegateBodyExprT) - let lambdaExprTy = tyOfExpr g lambdaExpr - let infoReader = InfoReader(g, amap) - let exprT = CoerceFromFSharpFuncToDelegate g amap infoReader AccessorDomain.AccessibleFromSomewhere lambdaExprTy m lambdaExpr delegateTyT - None, (exprT, tyOfExpr g exprT) - | None -> -#if PROVIDED_ADDRESS_OF - match ea.PApplyOption((function ProvidedAddressOfExpr x -> Some x | _ -> None), m) with - | Some e -> - let eT = exprToExpr e - let wrap,ce = mkExprAddrOfExpr g true false DefinitelyMutates eT None m - let ce = wrap ce - None, (ce, tyOfExpr g ce) - | None -> -#endif - match ea.PApplyOption((function ProvidedDefaultExpr x -> Some x | _ -> None), m) with - | Some pty -> - let ty = Import.ImportProvidedType amap m pty - let ce = mkDefault (m, ty) - None, (ce, tyOfExpr g ce) - | None -> - match ea.PApplyOption((function ProvidedCallExpr c -> Some c | _ -> None), m) with - | Some info -> - methodCallToExpr top ea info - | None -> - match ea.PApplyOption((function ProvidedSequentialExpr c -> Some c | _ -> None), m) with - | Some info -> - let e1,e2 = info.PApply2(id, m) - let e1T = exprToExpr e1 - let e2T = exprToExpr e2 - let ce = mkCompGenSequential m e1T e2T - None, (ce, tyOfExpr g ce) - | None -> - match ea.PApplyOption((function ProvidedTryFinallyExpr c -> Some c | _ -> None), m) with - | Some info -> - let e1,e2 = info.PApply2(id, m) - let e1T = exprToExpr e1 - let e2T = exprToExpr e2 - let ce = mkTryFinally g (e1T,e2T,m,tyOfExpr g e1T,SequencePointInfoForTry.NoSequencePointAtTry,SequencePointInfoForFinally.NoSequencePointAtFinally) - None, (ce, tyOfExpr g ce) - | None -> - match ea.PApplyOption((function ProvidedTryWithExpr c -> Some c | _ -> None), m) with - | Some info -> - let bT = exprToExpr (info.PApply((fun (x,_,_,_,_) -> x), m)) - let v1 = info.PApply((fun (_,x,_,_,_) -> x), m) - let v1T = addVar v1 - let e1T = exprToExpr (info.PApply((fun (_,_,x,_,_) -> x), m)) - removeVar v1 - let v2 = info.PApply((fun (_,_,_,x,_) -> x), m) - let v2T = addVar v2 - let e2T = exprToExpr (info.PApply((fun (_,_,_,_,x) -> x), m)) - removeVar v2 - let ce = mkTryWith g (bT,v1T,e1T,v2T,e2T,m,tyOfExpr g bT,SequencePointInfoForTry.NoSequencePointAtTry,SequencePointInfoForWith.NoSequencePointAtWith) - None, (ce, tyOfExpr g ce) - | None -> - match ea.PApplyOption((function ProvidedNewObjectExpr c -> Some c | _ -> None), m) with - | Some info -> - None, ctorCallToExpr info - | None -> - fail() - - - and ctorCallToExpr (ne:Tainted<_>) = - let (ctor,args) = ne.PApply2(id,m) - let targetMethInfo = ProvidedMeth(amap,ctor.PApply((fun ne -> upcast ne),m),None,m) - let objArgs = [] - let arguments = [ for ea in args.PApplyArray(id, "GetInvokerExpresson", m) -> exprToExpr ea ] - let callExpr = BuildMethodCall tcVal g amap Mutates.PossiblyMutates m false targetMethInfo isSuperInit [] objArgs arguments - callExpr - - and addVar (v:Tainted) = - let nm = v.PUntaint ((fun v -> v.Name),m) - let mut = v.PUntaint ((fun v -> v.IsMutable),m) - let vRaw = v.PUntaint (id,m) - let tyT = Import.ImportProvidedType amap m (v.PApply ((fun v -> v.Type),m)) - let vT,vTe = if mut then mkMutableCompGenLocal m nm tyT else mkCompGenLocal m nm tyT - varConv.[vRaw] <- (Some vT,vTe) - vT - - and removeVar (v:Tainted) = - let vRaw = v.PUntaint (id,m) - varConv.Remove vRaw |> ignore - - and methodCallToExpr top _origExpr (mce:Tainted<_>) = - let (objOpt,meth,args) = mce.PApply3(id,m) - let targetMethInfo = ProvidedMeth(amap,meth.PApply((fun mce -> upcast mce), m),None,m) - let objArgs = - match objOpt.PApplyOption(id, m) with - | None -> [] - | Some objExpr -> [exprToExpr objExpr] - - let arguments = [ for ea in args.PApplyArray(id, "GetInvokerExpresson", m) -> exprToExpr ea ] - let genericArguments = - if meth.PUntaint((fun m -> m.IsGenericMethod), m) then - meth.PApplyArray((fun m -> m.GetGenericArguments()), "GetGenericArguments", m) - else - [| |] - let replacementGenericArguments = genericArguments |> Array.map (fun t->Import.ImportProvidedType amap m t) |> List.ofArray - - let mut = if top then mut else PossiblyMutates - let isSuperInit = if top then isSuperInit else ValUseFlag.NormalValUse - let isProp = if top then isProp else false - let callExpr = BuildMethodCall tcVal g amap mut m isProp targetMethInfo isSuperInit replacementGenericArguments objArgs arguments - Some meth, callExpr - - and varToExpr (pe:Tainted) = - // sub in the appropriate argument - // REVIEW: "thisArg" pointer should be first, if present - let vRaw = pe.PUntaint(id,m) - if not (varConv.ContainsKey vRaw) then - let typeProviderDesignation = ExtensionTyping.DisplayNameOfTypeProvider (pe.TypeProvider, m) - error(NumberedError(FSComp.SR.etIncorrectParameterExpression(typeProviderDesignation,vRaw.Name), m)) - varConv.[vRaw] - - and exprToExpr expr = - let _, (resExpr, _) = exprToExprAndWitness false expr - resExpr - - exprToExprAndWitness true expr - - - // fill in parameter holes in the expression - let TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi:Tainted, objArgs, allArgs, m) = - let parameters = - mi.PApplyArray((fun mi -> mi.GetParameters()), "GetParameters", m) - let paramTys = - parameters - |> Array.map (fun p -> p.PApply((fun st -> st.ParameterType),m)) - let erasedParamTys = - paramTys - |> Array.map (fun pty -> eraseSystemType (amap,m,pty)) - let paramVars = - erasedParamTys - |> Array.mapi (fun i erasedParamTy -> erasedParamTy.PApply((fun ty -> ProvidedVar.Fresh("arg" + i.ToString(),ty)),m)) - - - // encode "this" as the first ParameterExpression, if applicable - let thisArg, paramVars = - match objArgs with - | [objArg] -> - let erasedThisTy = eraseSystemType (amap,m,mi.PApply((fun mi -> mi.DeclaringType),m)) - let thisVar = erasedThisTy.PApply((fun ty -> ProvidedVar.Fresh("this", ty)), m) - Some objArg , Array.append [| thisVar |] paramVars - | [] -> None , paramVars - | _ -> failwith "multiple objArgs?" - - let ea = mi.PApplyWithProvider((fun (methodInfo,provider) -> ExtensionTyping.GetInvokerExpression(provider, methodInfo, [| for p in paramVars -> p.PUntaintNoFailure id |])), m) - - convertProvidedExpressionToExprAndWitness tcVal (thisArg,allArgs,paramVars,g,amap,mut,isProp,isSuperInit,m,ea) - - - let BuildInvokerExpressionForProvidedMethodCall tcVal (g, amap, mi:Tainted, objArgs, mut, isProp, isSuperInit, allArgs, m) = - try - let methInfoOpt, (expr, retTy) = TranslateInvokerExpressionForProvidedMethodCall tcVal (g, amap, mut, isProp, isSuperInit, mi, objArgs, allArgs, m) - - let exprty = GetCompiledReturnTyOfProvidedMethodInfo amap m mi |> GetFSharpViewOfReturnType g - let expr = mkCoerceIfNeeded g exprty retTy expr - methInfoOpt, expr, exprty - with - | :? TypeProviderError as tpe -> - let typeName = mi.PUntaint((fun mb -> mb.DeclaringType.FullName), m) - let methName = mi.PUntaint((fun mb -> mb.Name), m) - raise( tpe.WithContext(typeName, methName) ) // loses original stack trace -#endif diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 8eb1ffcf6af..7f3ab96e115 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -13,16 +13,18 @@ module internal Microsoft.FSharp.Compiler.Driver open System +open System.Collections.Generic open System.Diagnostics open System.Globalization open System.IO -open System.Threading open System.Reflection -open System.Collections.Generic open System.Runtime.CompilerServices open System.Text +open System.Threading + open Internal.Utilities open Internal.Utilities.Collections + open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL @@ -35,22 +37,23 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL #else open Microsoft.FSharp.Compiler.IlxGen #endif + +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.AttributeChecking open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.CompileOptions open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.DiagnosticMessage +open Microsoft.FSharp.Compiler.Optimizer open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.TypeChecker -open Microsoft.FSharp.Compiler.Infos -open Microsoft.FSharp.Compiler.Infos.AccessibilityLogic -open Microsoft.FSharp.Compiler.Infos.AttributeChecking open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops -open Microsoft.FSharp.Compiler.Optimizer open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.CompileOps -open Microsoft.FSharp.Compiler.Lib -open Microsoft.FSharp.Compiler.CompileOptions -open Microsoft.FSharp.Compiler.DiagnosticMessage -open Microsoft.FSharp.Core #if EXTENSIONTYPING open Microsoft.FSharp.Compiler.ExtensionTyping diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 69caf49bccf..93e567a7a14 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -25,8 +25,8 @@ open System.Reflection #if !FX_NO_WINFORMS open System.Windows.Forms #endif -open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library @@ -34,24 +34,26 @@ open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX open Microsoft.FSharp.Compiler.AbstractIL.ILRuntimeWriter open Microsoft.FSharp.Compiler.Interactive.Settings open Microsoft.FSharp.Compiler.Interactive.RuntimeHelpers -open Microsoft.FSharp.Compiler.Lib + +open Microsoft.FSharp.Compiler +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.CompileOptions -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics -open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.IlxGen +open Microsoft.FSharp.Compiler.Lexhelp +open Microsoft.FSharp.Compiler.Layout +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.Optimizer +open Microsoft.FSharp.Compiler.PostTypeCheckSemanticChecks open Microsoft.FSharp.Compiler.Range -open Microsoft.FSharp.Compiler.Ast -open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.TypeChecker open Microsoft.FSharp.Compiler.Tast -open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.Tastops -open Microsoft.FSharp.Compiler.Optimizer open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.CompileOps -open Microsoft.FSharp.Compiler.Lexhelp -open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.PostTypeCheckSemanticChecks open Internal.Utilities.Collections open Internal.Utilities.StructuredFormat @@ -766,7 +768,7 @@ let internal WithImplicitHome (tcConfigB, dir) f = /// A single instance of this object is created per interactive session. type internal FsiDynamicCompiler (timeReporter : FsiTimeReporter, - tcConfigB, + tcConfigB: TcConfigBuilder, tcLockObject : obj, errorLogger: ErrorLoggerThatStopsOnFirstError, outWriter: TextWriter, @@ -795,7 +797,7 @@ type internal FsiDynamicCompiler let infoReader = InfoReader(tcGlobals,tcImports.GetImportMap()) /// Add attributes - let CreateModuleFragment (tcConfigB, assemblyName, codegenResults) = + let CreateModuleFragment (tcConfigB: TcConfigBuilder, assemblyName, codegenResults) = if !progress then fprintfn fsiConsoleOutput.Out "Creating main module..."; let mainModule = mkILSimpleModule assemblyName (GetGeneratedILModuleName tcConfigB.target assemblyName) (tcConfigB.target = Dll) tcConfigB.subsystemVersion tcConfigB.useHighEntropyVA (mkILTypeDefs codegenResults.ilTypeDefs) None None 0x0 (mkILExportedTypes []) "" { mainModule @@ -1131,10 +1133,10 @@ type internal FsiIntellisenseProvider(tcGlobals, tcImports: TcImports) = let tcState = istate.tcState (* folded through now? *) let amap = tcImports.GetImportMap() - let infoReader = new Infos.InfoReader(tcGlobals,amap) + let infoReader = new InfoReader(tcGlobals,amap) let ncenv = new NameResolution.NameResolver(tcGlobals,amap,infoReader,NameResolution.FakeInstantiationGenerator) // Note: for the accessor domain we should use (AccessRightsOfEnv tcState.TcEnvFromImpls) - let ad = Infos.AccessibleFromSomeFSharpCode + let ad = AccessibleFromSomeFSharpCode let nItems = NameResolution.ResolvePartialLongIdent ncenv tcState.TcEnvFromImpls.NameEnv (ConstraintSolver.IsApplicableMethApprox tcGlobals amap rangeStdin) rangeStdin ad lid false let names = nItems |> List.map (fun d -> d.DisplayName) let names = names |> List.filter (fun (name:string) -> name.StartsWith(stem,StringComparison.Ordinal)) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 7d37ad064cb..c34c19ee382 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -8,11 +8,11 @@ module internal Microsoft.FSharp.Compiler.Infos open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger @@ -20,7 +20,6 @@ open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Core.Printf @@ -30,7 +29,7 @@ open Microsoft.FSharp.Core.CompilerServices #endif #if FX_RESHAPED_REFLECTION - open Microsoft.FSharp.Core.ReflectionAdapters +open Microsoft.FSharp.Core.ReflectionAdapters #endif //------------------------------------------------------------------------- @@ -38,10 +37,10 @@ open Microsoft.FSharp.Core.CompilerServices //------------------------------------------------------------------------- /// Import an IL type as an F# type. importInst gives the context for interpreting type variables. -let ImportType scoref amap m importInst ilty = +let ImportILType scoref amap m importInst ilty = ilty |> rescopeILType scoref |> Import.ImportILType amap m importInst -let CanImportType scoref amap m ilty = +let CanImportILType scoref amap m ilty = ilty |> rescopeILType scoref |> Import.CanImportILType amap m //------------------------------------------------------------------------- @@ -75,7 +74,7 @@ let GetSuperTypeOfType g amap m typ = let _,tinst = destAppTy g typ match tdef.Extends with | None -> None - | Some ilty -> Some (ImportType scoref amap m tinst ilty) + | Some ilty -> Some (ImportILType scoref amap m tinst ilty) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> @@ -126,7 +125,7 @@ let rec GetImmediateInterfacesOfType skipUnref g amap m typ = #endif | ILTypeMetadata (scoref,tdef) -> - // ImportType may fail for an interface if the assembly load set is incomplete and the interface + // ImportILType may fail for an interface if the assembly load set is incomplete and the interface // comes from another assembly. In this case we simply skip the interface: // if we don't skip it, then compilation will just fail here, and if type checking // succeeds with fewer non-dereferencable interfaces reported then it would have @@ -134,8 +133,8 @@ let rec GetImmediateInterfacesOfType skipUnref g amap m typ = // doesn't apply: e.g. for mscorlib interfaces like IComparable, but we can always // assume those are present. [ for ity in tdef.Implements |> ILList.toList do - if skipUnref = SkipUnrefInterfaces.No || CanImportType scoref amap m ity then - yield ImportType scoref amap m tinst ity ] + if skipUnref = SkipUnrefInterfaces.No || CanImportILType scoref amap m ity then + yield ImportILType scoref amap m tinst ity ] | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> tcref.ImmediateInterfaceTypesOfFSharpTycon |> List.map (instType (mkInstForAppTy g typ)) @@ -277,8 +276,8 @@ let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = /// Read an Abstract IL type from metadata and convert to an F# type. -let ImportTypeFromMetadata amap m scoref tinst minst ilty = - ImportType scoref amap m (tinst@minst) ilty +let ImportILTypeFromMetadata amap m scoref tinst minst ilty = + ImportILType scoref amap m (tinst@minst) ilty /// Get the return type of an IL method, taking into account instantiations for type and method generic parameters, and @@ -286,7 +285,7 @@ let ImportTypeFromMetadata amap m scoref tinst minst ilty = let ImportReturnTypeFromMetaData amap m ty scoref tinst minst = match ty with | ILType.Void -> None - | retTy -> Some (ImportTypeFromMetadata amap m scoref tinst minst retTy) + | retTy -> Some (ImportILTypeFromMetadata amap m scoref tinst minst retTy) /// Copy constraints. If the constraint comes from a type parameter associated /// with a type constructor then we are simply renaming type variables. If it comes @@ -512,7 +511,7 @@ type OptionalArgInfo = else MissingValue else DefaultValue - CallerSide (analyze (ImportTypeFromMetadata amap m ilScope ilTypeInst [] ilParam.Type)) + CallerSide (analyze (ImportILTypeFromMetadata amap m ilScope ilTypeInst [] ilParam.Type)) | Some v -> CallerSide (Constant v) else @@ -762,17 +761,17 @@ type ILMethInfo = /// Get the argument types of the the IL method. If this is an C#-style extension method /// then drop the object argument. member x.GetParamTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ImportTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.ParamMetadata |> List.map (fun p -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) /// Get all the argument types of the IL method. Include the object argument even if this is /// an C#-style extension method. member x.GetRawArgTypes(amap,m,minst) = - x.RawMetadata.Parameters |> ILList.toList |> List.map (fun p -> ImportTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.RawMetadata.Parameters |> ILList.toList |> List.map (fun p -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) /// Get info about the arguments of the IL method. If this is an C#-style extension method then /// drop the object argument. member x.GetParamNamesAndTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) ) + x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) ) /// Get a reference to the method (dropping all generic instantiations), as an Abstract IL ILMethodRef. member x.ILMethodRef = @@ -792,7 +791,7 @@ type ILMethInfo = // All C#-style extension methods are instance. We have to re-read the 'obj' type w.r.t. the // method instantiation. if x.IsILExtensionMethod then - [ImportTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst x.RawMetadata.Parameters.Head.Type] + [ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst x.RawMetadata.Parameters.Head.Type] else if x.IsInstance then [ x.ApparentEnclosingType ] else @@ -1399,7 +1398,7 @@ type MethInfo = let formalRetTy = ImportReturnTypeFromMetaData amap m ilminfo.RawMetadata.Return.Type ftinfo.ILScopeRef ftinfo.TypeInst formalMethTyparTys let formalParams = [ [ for p in ilminfo.RawMetadata.Parameters do - let paramType = ImportTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInst formalMethTyparTys p.Type + let paramType = ImportILTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInst formalMethTyparTys p.Type yield TSlotParam(p.Name, paramType, p.IsIn, p.IsOut, p.IsOptional, []) ] ] formalRetTy, formalParams #if EXTENSIONTYPING @@ -1577,7 +1576,7 @@ type ILFieldInfo = /// Get the type of the field as an F# type member x.FieldType(amap,m) = match x with - | ILFieldInfo (tinfo,fdef) -> ImportTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] fdef.Type + | ILFieldInfo (tinfo,fdef) -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] fdef.Type #if EXTENSIONTYPING | ProvidedField(amap,fi,m) -> Import.ImportProvidedType amap m (fi.PApply((fun fi -> fi.FieldType),m)) #endif @@ -1705,17 +1704,17 @@ type ILPropInfo = /// Get the names and types of the indexer arguments associated with the IL property. member x.GetParamNamesAndTypes(amap,m) = let (ILPropInfo (tinfo,pdef)) = x - pdef.Args |> ILList.toList |> List.map (fun ty -> ParamNameAndType(None, ImportTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] ty) ) + pdef.Args |> ILList.toList |> List.map (fun ty -> ParamNameAndType(None, ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] ty) ) /// Get the types of the indexer arguments associated with the IL property. member x.GetParamTypes(amap,m) = let (ILPropInfo (tinfo,pdef)) = x - pdef.Args |> ILList.toList |> List.map (fun ty -> ImportTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] ty) + pdef.Args |> ILList.toList |> List.map (fun ty -> ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] ty) /// Get the return type of the IL property. member x.GetPropertyType (amap,m) = let (ILPropInfo (tinfo,pdef)) = x - ImportTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] pdef.Type + ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] pdef.Type override x.ToString() = x.ILTypeInfo.ToString() + "::" + x.PropertyName @@ -2214,7 +2213,7 @@ type EventInfo = // Get the delegate type associated with an IL event, taking into account the instantiation of the // declaring type. if isNone edef.Type then error (nonStandardEventError x.EventName m) - ImportTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] edef.Type.Value + ImportILTypeFromMetadata amap m tinfo.ILScopeRef tinfo.TypeInst [] edef.Type.Value | FSEvent(g,p,_,_) -> FindDelegateTypeOfPropertyEvent g amap x.EventName m (p.GetPropertyType(amap,m)) @@ -2308,1613 +2307,3 @@ let PropInfosEquivByNameAndSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:Pro typeEquivAux erasureFlag g retTy retTy2 -//------------------------------------------------------------------------- -// Basic accessibility logic -//------------------------------------------------------------------------- - -/// Represents the 'keys' a particular piece of code can use to access other constructs?. -[] -type AccessorDomain = - /// AccessibleFrom(cpaths, tyconRefOpt) - /// - /// cpaths: indicates we have the keys to access any members private to the given paths - /// tyconRefOpt: indicates we have the keys to access any protected members of the super types of 'TyconRef' - | AccessibleFrom of CompilationPath list * TyconRef option - - /// An AccessorDomain which returns public items - | AccessibleFromEverywhere - - /// An AccessorDomain which returns everything but .NET private/internal items. - /// This is used - /// - when solving member trait constraints, which are solved independently of accessibility - /// - for failure paths in error reporting, e.g. to produce an error that an F# item is not accessible - /// - an adhoc use in service.fs to look up a delegate signature - | AccessibleFromSomeFSharpCode - - /// An AccessorDomain which returns all items - | AccessibleFromSomewhere - - // Hashing and comparison is used for the memoization tables keyed by an accessor domain. - // It is dependent on a TcGlobals because of the TyconRef in the data structure - static member CustomGetHashCode(ad:AccessorDomain) = - match ad with - | AccessibleFrom _ -> 1 - | AccessibleFromEverywhere -> 2 - | AccessibleFromSomeFSharpCode -> 3 - | AccessibleFromSomewhere -> 4 - static member CustomEquals(g:TcGlobals, ad1:AccessorDomain, ad2:AccessorDomain) = - match ad1, ad2 with - | AccessibleFrom(cs1,tc1), AccessibleFrom(cs2,tc2) -> (cs1 = cs2) && (match tc1,tc2 with None,None -> true | Some tc1, Some tc2 -> tyconRefEq g tc1 tc2 | _ -> false) - | AccessibleFromEverywhere, AccessibleFromEverywhere -> true - | AccessibleFromSomeFSharpCode, AccessibleFromSomeFSharpCode -> true - | AccessibleFromSomewhere, AccessibleFromSomewhere -> true - | _ -> false - -module AccessibilityLogic = - - /// Indicates if an F# item is accessible - let IsAccessible ad taccess = - match ad with - | AccessibleFromEverywhere -> canAccessFromEverywhere taccess - | AccessibleFromSomeFSharpCode -> canAccessFromSomewhere taccess - | AccessibleFromSomewhere -> true - | AccessibleFrom (cpaths,_tcrefViewedFromOption) -> - List.exists (canAccessFrom taccess) cpaths - - /// Indicates if an IL member is accessible (ignoring its enclosing type) - let private IsILMemberAccessible g amap m (tcrefOfViewedItem : TyconRef) ad access = - match ad with - | AccessibleFromEverywhere -> - access = ILMemberAccess.Public - | AccessibleFromSomeFSharpCode -> - (access = ILMemberAccess.Public || - access = ILMemberAccess.Family || - access = ILMemberAccess.FamilyOrAssembly) - | AccessibleFrom (cpaths,tcrefViewedFromOption) -> - let accessibleByFamily = - ((access = ILMemberAccess.Family || - access = ILMemberAccess.FamilyOrAssembly) && - match tcrefViewedFromOption with - | None -> false - | Some tcrefViewedFrom -> - ExistsHeadTypeInEntireHierarchy g amap m (generalizedTyconRef tcrefViewedFrom) tcrefOfViewedItem) - let accessibleByInternalsVisibleTo = - (access = ILMemberAccess.Assembly && canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath) - (access = ILMemberAccess.Public) || accessibleByFamily || accessibleByInternalsVisibleTo - | AccessibleFromSomewhere -> - true - - /// Indicates if tdef is accessible. If tdef.Access = ILTypeDefAccess.Nested then encTyconRefOpt s TyconRef of enclosing type - /// and visibility of tdef is obtained using member access rules - let private IsILTypeDefAccessible (amap : Import.ImportMap) m ad encTyconRefOpt (tdef: ILTypeDef) = - match tdef.Access with - | ILTypeDefAccess.Nested nestedAccess -> - match encTyconRefOpt with - | None -> assert false; true - | Some encTyconRef -> IsILMemberAccessible amap.g amap m encTyconRef ad nestedAccess - | _ -> - match ad with - | AccessibleFromSomewhere -> true - | AccessibleFromEverywhere - | AccessibleFromSomeFSharpCode - | AccessibleFrom _ -> tdef.Access = ILTypeDefAccess.Public - - /// Indicates if a TyconRef is visible through the AccessibleFrom(cpaths,_). - /// Note that InternalsVisibleTo extends those cpaths. - let private IsTyconAccessibleViaVisibleTo ad (tcrefOfViewedItem:TyconRef) = - match ad with - | AccessibleFromEverywhere - | AccessibleFromSomewhere - | AccessibleFromSomeFSharpCode -> false - | AccessibleFrom (cpaths,_tcrefViewedFromOption) -> - canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath - - /// Indicates if given IL based TyconRef is accessible. If TyconRef is nested then we'll - /// walk though the list of enclosing types and test if all of them are accessible - let private IsILTypeInfoAccessible amap m ad (tcrefOfViewedItem : TyconRef) = - let scoref, enc, tdef = tcrefOfViewedItem.ILTyconInfo - let rec check parentTycon path = - let ilTypeDefAccessible = - match parentTycon with - | None -> - match path with - | [] -> assert false; true // in this case path should have at least one element - | [x] -> IsILTypeDefAccessible amap m ad None x // shortcut for non-nested types - | x::xs -> - // check if enclosing type x is accessible. - // if yes - create parent tycon for type 'x' and continue with the rest of the path - IsILTypeDefAccessible amap m ad None x && - ( - let parentILTyRef = mkRefForNestedILTypeDef scoref ([], x) - let parentTycon = Import.ImportILTypeRef amap m parentILTyRef - check (Some (parentTycon, [x])) xs - ) - | (Some (parentTycon, parentPath)) -> - match path with - | [] -> true // end of path is reached - success - | x::xs -> - // check if x is accessible from the parent tycon - // if yes - create parent tycon for type 'x' and continue with the rest of the path - IsILTypeDefAccessible amap m ad (Some parentTycon) x && - ( - let parentILTyRef = mkRefForNestedILTypeDef scoref (parentPath, x) - let parentTycon = Import.ImportILTypeRef amap m parentILTyRef - check (Some (parentTycon, parentPath @ [x])) xs - ) - ilTypeDefAccessible || IsTyconAccessibleViaVisibleTo ad tcrefOfViewedItem - - check None (enc @ [tdef]) - - /// Indicates if an IL member associated with the given ILType is accessible - let private IsILTypeAndMemberAccessible g amap m adType ad (ILTypeInfo(tcrefOfViewedItem, _, _, _)) access = - IsILTypeInfoAccessible amap m adType tcrefOfViewedItem && IsILMemberAccessible g amap m tcrefOfViewedItem ad access - - /// Indicates if an entity is accessible - let IsEntityAccessible amap m ad (tcref:TyconRef) = - if tcref.IsILTycon then - IsILTypeInfoAccessible amap m ad tcref - else - tcref.Accessibility |> IsAccessible ad - - /// Check that an entity is accessible - let CheckTyconAccessible amap m ad tcref = - let res = IsEntityAccessible amap m ad tcref - if not res then - errorR(Error(FSComp.SR.typeIsNotAccessible tcref.DisplayName,m)) - res - - /// Indicates if a type definition and its representation contents are accessible - let IsTyconReprAccessible amap m ad tcref = - IsEntityAccessible amap m ad tcref && - IsAccessible ad tcref.TypeReprAccessibility - - /// Check that a type definition and its representation contents are accessible - let CheckTyconReprAccessible amap m ad tcref = - CheckTyconAccessible amap m ad tcref && - (let res = IsAccessible ad tcref.TypeReprAccessibility - if not res then - errorR (Error (FSComp.SR.unionCasesAreNotAccessible tcref.DisplayName,m)) - res) - - /// Indicates if a type is accessible (both definition and instantiation) - let rec IsTypeAccessible g amap m ad ty = - not (isAppTy g ty) || - let tcref,tinst = destAppTy g ty - IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst - - and IsTypeInstAccessible g amap m ad tinst = - match tinst with - | [] -> true - | _ -> List.forall (IsTypeAccessible g amap m ad) tinst - - /// Indicate if a provided member is accessible - let IsProvidedMemberAccessible (amap:Import.ImportMap) m ad ty access = - let g = amap.g - let isTyAccessible = IsTypeAccessible g amap m ad ty - if not isTyAccessible then false - else - not (isAppTy g ty) || - let tcrefOfViewedItem,_ = destAppTy g ty - IsILMemberAccessible g amap m tcrefOfViewedItem ad access - - /// Compute the accessibility of a provided member - let ComputeILAccess isPublic isFamily isFamilyOrAssembly isFamilyAndAssembly = - if isPublic then ILMemberAccess.Public - elif isFamily then ILMemberAccess.Family - elif isFamilyOrAssembly then ILMemberAccess.FamilyOrAssembly - elif isFamilyAndAssembly then ILMemberAccess.FamilyAndAssembly - else ILMemberAccess.Private - - /// IndiCompute the accessibility of a provided member - let IsILFieldInfoAccessible g amap m ad x = - match x with - | ILFieldInfo (tinfo,fd) -> IsILTypeAndMemberAccessible g amap m ad ad tinfo fd.Access -#if EXTENSIONTYPING - | ProvidedField (amap, tpfi, m) as pfi -> - let access = tpfi.PUntaint((fun fi -> ComputeILAccess fi.IsPublic fi.IsFamily fi.IsFamilyOrAssembly fi.IsFamilyAndAssembly), m) - IsProvidedMemberAccessible amap m ad pfi.EnclosingType access -#endif - - let GetILAccessOfILEventInfo (ILEventInfo (tinfo,edef)) = - (resolveILMethodRef tinfo.RawMetadata edef.AddMethod).Access - - let IsILEventInfoAccessible g amap m ad einfo = - let access = GetILAccessOfILEventInfo einfo - IsILTypeAndMemberAccessible g amap m ad ad einfo.ILTypeInfo access - - let private IsILMethInfoAccessible g amap m adType ad ilminfo = - match ilminfo with - | ILMethInfo (_,typ,None,mdef,_) -> IsILTypeAndMemberAccessible g amap m adType ad (ILTypeInfo.FromType g typ) mdef.Access - | ILMethInfo (_,_,Some declaringTyconRef,mdef,_) -> IsILMemberAccessible g amap m declaringTyconRef ad mdef.Access - - let GetILAccessOfILPropInfo (ILPropInfo(tinfo,pdef)) = - let tdef = tinfo.RawMetadata - let ilAccess = - match pdef.GetMethod with - | Some mref -> (resolveILMethodRef tdef mref).Access - | None -> - match pdef.SetMethod with - | None -> ILMemberAccess.Public - | Some mref -> (resolveILMethodRef tdef mref).Access - ilAccess - - let IsILPropInfoAccessible g amap m ad pinfo = - let ilAccess = GetILAccessOfILPropInfo pinfo - IsILTypeAndMemberAccessible g amap m ad ad pinfo.ILTypeInfo ilAccess - - let IsValAccessible ad (vref:ValRef) = - vref.Accessibility |> IsAccessible ad - - let CheckValAccessible m ad (vref:ValRef) = - if not (IsValAccessible ad vref) then - errorR (Error (FSComp.SR.valueIsNotAccessible vref.DisplayName,m)) - - let IsUnionCaseAccessible amap m ad (ucref:UnionCaseRef) = - IsTyconReprAccessible amap m ad ucref.TyconRef && - IsAccessible ad ucref.UnionCase.Accessibility - - let CheckUnionCaseAccessible amap m ad (ucref:UnionCaseRef) = - CheckTyconReprAccessible amap m ad ucref.TyconRef && - (let res = IsAccessible ad ucref.UnionCase.Accessibility - if not res then - errorR (Error (FSComp.SR.unionCaseIsNotAccessible ucref.CaseName,m)) - res) - - let IsRecdFieldAccessible amap m ad (rfref:RecdFieldRef) = - IsTyconReprAccessible amap m ad rfref.TyconRef && - IsAccessible ad rfref.RecdField.Accessibility - - let CheckRecdFieldAccessible amap m ad (rfref:RecdFieldRef) = - CheckTyconReprAccessible amap m ad rfref.TyconRef && - (let res = IsAccessible ad rfref.RecdField.Accessibility - if not res then - errorR (Error (FSComp.SR.fieldIsNotAccessible rfref.FieldName,m)) - res) - - let CheckRecdFieldInfoAccessible amap m ad (rfinfo:RecdFieldInfo) = - CheckRecdFieldAccessible amap m ad rfinfo.RecdFieldRef |> ignore - - let CheckILFieldInfoAccessible g amap m ad finfo = - if not (IsILFieldInfoAccessible g amap m ad finfo) then - errorR (Error (FSComp.SR.structOrClassFieldIsNotAccessible finfo.FieldName,m)) - - /// Uses a separate accessibility domains for containing type and method itself - /// This makes sense cases like - /// type A() = - /// type protected B() = - /// member this.Public() = () - /// member protected this.Protected() = () - /// type C() = - /// inherit A() - /// let x = A.B() - /// do x.Public() - /// when calling x.SomeMethod() we need to use 'adTyp' do verify that type of x is accessible from C - /// and 'ad' to determine accessibility of SomeMethod. - /// I.e when calling x.Public() and x.Protected() -in both cases first check should succeed and second - should fail in the latter one. - let IsTypeAndMethInfoAccessible amap m adTyp ad = function - | ILMeth (g,x,_) -> IsILMethInfoAccessible g amap m adTyp ad x - | FSMeth (_,_,vref,_) -> IsValAccessible ad vref - | DefaultStructCtor(g,typ) -> IsTypeAccessible g amap m ad typ -#if EXTENSIONTYPING - | ProvidedMeth(amap,tpmb,_,m) as etmi -> - let access = tpmb.PUntaint((fun mi -> ComputeILAccess mi.IsPublic mi.IsFamily mi.IsFamilyOrAssembly mi.IsFamilyAndAssembly), m) - IsProvidedMemberAccessible amap m ad etmi.EnclosingType access -#endif - let IsMethInfoAccessible amap m ad minfo = IsTypeAndMethInfoAccessible amap m ad ad minfo - - let IsPropInfoAccessible g amap m ad = function - | ILProp (_,x) -> IsILPropInfoAccessible g amap m ad x - | FSProp (_,_,Some vref,_) - | FSProp (_,_,_,Some vref) -> IsValAccessible ad vref -#if EXTENSIONTYPING - | ProvidedProp (amap, tppi, m) as pp-> - let access = - let a = tppi.PUntaint((fun ppi -> - let tryGetILAccessForProvidedMethodBase (mi : ProvidedMethodBase) = - match mi with - | null -> None - | mi -> Some(ComputeILAccess mi.IsPublic mi.IsFamily mi.IsFamilyOrAssembly mi.IsFamilyAndAssembly) - match tryGetILAccessForProvidedMethodBase(ppi.GetGetMethod()) with - | None -> tryGetILAccessForProvidedMethodBase(ppi.GetSetMethod()) - | x -> x), m) - defaultArg a ILMemberAccess.Public - IsProvidedMemberAccessible amap m ad pp.EnclosingType access -#endif - | _ -> false - - let IsFieldInfoAccessible ad (rfref:RecdFieldInfo) = - IsAccessible ad rfref.RecdField.Accessibility - -open AccessibilityLogic - - - -//------------------------------------------------------------------------- -// Check custom attributes -//------------------------------------------------------------------------- - -exception ObsoleteWarning of string * range -exception ObsoleteError of string * range - -let fail() = failwith "This custom attribute has an argument that can not yet be converted using this API" - -let rec evalILAttribElem e = - match e with - | ILAttribElem.String (Some x) -> box x - | ILAttribElem.String None -> null - | ILAttribElem.Bool x -> box x - | ILAttribElem.Char x -> box x - | ILAttribElem.SByte x -> box x - | ILAttribElem.Int16 x -> box x - | ILAttribElem.Int32 x -> box x - | ILAttribElem.Int64 x -> box x - | ILAttribElem.Byte x -> box x - | ILAttribElem.UInt16 x -> box x - | ILAttribElem.UInt32 x -> box x - | ILAttribElem.UInt64 x -> box x - | ILAttribElem.Single x -> box x - | ILAttribElem.Double x -> box x - | ILAttribElem.Null -> null - | ILAttribElem.Array (_, a) -> box [| for i in a -> evalILAttribElem i |] - // TODO: typeof<..> in attribute values - | ILAttribElem.Type (Some _t) -> fail() - | ILAttribElem.Type None -> null - | ILAttribElem.TypeRef (Some _t) -> fail() - | ILAttribElem.TypeRef None -> null - -let rec evalFSharpAttribArg g e = - match e with - | Expr.Const(c,_,_) -> - match c with - | Const.Bool b -> box b - | Const.SByte i -> box i - | Const.Int16 i -> box i - | Const.Int32 i -> box i - | Const.Int64 i -> box i - | Const.Byte i -> box i - | Const.UInt16 i -> box i - | Const.UInt32 i -> box i - | Const.UInt64 i -> box i - | Const.Single i -> box i - | Const.Double i -> box i - | Const.Char i -> box i - | Const.Zero -> null - | Const.String s -> box s - | _ -> fail() - | Expr.Op (TOp.Array,_,a,_) -> box [| for i in a -> evalFSharpAttribArg g i |] - | TypeOfExpr g ty -> box ty - // TODO: | TypeDefOfExpr g ty - | _ -> fail() - -type AttribInfo = - | FSAttribInfo of TcGlobals * Attrib - | ILAttribInfo of TcGlobals * Import.ImportMap * ILScopeRef * ILAttribute * range - - member x.TyconRef = - match x with - | FSAttribInfo(_g,Attrib(tcref,_,_,_,_,_,_)) -> tcref - | ILAttribInfo (g, amap, scoref, a, m) -> - let ty = ImportType scoref amap m [] a.Method.EnclosingType - tcrefOfAppTy g ty - - member x.ConstructorArguments = - match x with - | FSAttribInfo(g,Attrib(_,_,unnamedArgs,_,_,_,_)) -> - unnamedArgs - |> List.map (fun (AttribExpr(origExpr,evaluatedExpr)) -> - let ty = tyOfExpr g origExpr - let obj = evalFSharpAttribArg g evaluatedExpr - ty,obj) - | ILAttribInfo (g, amap, scoref, cattr, m) -> - let parms, _args = decodeILAttribData g.ilg cattr - [ for (argty,argval) in Seq.zip cattr.Method.FormalArgTypes parms -> - let ty = ImportType scoref amap m [] argty - let obj = evalILAttribElem argval - ty,obj ] - - member x.NamedArguments = - match x with - | FSAttribInfo(g,Attrib(_,_,_,namedArgs,_,_,_)) -> - namedArgs - |> List.map (fun (AttribNamedArg(nm,_,isField,AttribExpr(origExpr,evaluatedExpr))) -> - let ty = tyOfExpr g origExpr - let obj = evalFSharpAttribArg g evaluatedExpr - ty, nm, isField, obj) - | ILAttribInfo (g, amap, scoref, cattr, m) -> - let _parms, namedArgs = decodeILAttribData g.ilg cattr - [ for (nm, argty, isProp, argval) in namedArgs -> - let ty = ImportType scoref amap m [] argty - let obj = evalILAttribElem argval - let isField = not isProp - ty, nm, isField, obj ] - - -/// Check custom attributes. This is particularly messy because custom attributes come in in three different -/// formats. -module AttributeChecking = - - let AttribInfosOfIL g amap scoref m (attribs: ILAttributes) = - attribs.AsList |> List.map (fun a -> ILAttribInfo (g, amap, scoref, a, m)) - - let AttribInfosOfFS g attribs = - attribs |> List.map (fun a -> FSAttribInfo (g, a)) - - let GetAttribInfosOfEntity g amap m (tcref:TyconRef) = - match metadataOfTycon tcref.Deref with -#if EXTENSIONTYPING - // TODO: provided attributes - | ProvidedTypeMetadata _info -> [] - //let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) - //match provAttribs.PUntaint((fun a -> a. .GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with - //| Some args -> f3 args - //| None -> None -#endif - | ILTypeMetadata (scoref,tdef) -> - tdef.CustomAttrs |> AttribInfosOfIL g amap scoref m - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - tcref.Attribs |> List.map (fun a -> FSAttribInfo (g, a)) - - - let GetAttribInfosOfMethod amap m minfo = - match minfo with - | ILMeth (g,ilminfo,_) -> ilminfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilminfo.MetadataScope m - | FSMeth (g,_,vref,_) -> vref.Attribs |> AttribInfosOfFS g - | DefaultStructCtor _ -> [] -#if EXTENSIONTYPING - // TODO: provided attributes - | ProvidedMeth (_,_mi,_,_m) -> - [] - -#endif - - let GetAttribInfosOfProp amap m pinfo = - match pinfo with - | ILProp(g,ilpinfo) -> ilpinfo.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap ilpinfo.ILTypeInfo.ILScopeRef m - | FSProp(g,_,Some vref,_) - | FSProp(g,_,_,Some vref) -> vref.Attribs |> AttribInfosOfFS g - | FSProp _ -> failwith "GetAttribInfosOfProp: unreachable" -#if EXTENSIONTYPING - // TODO: provided attributes - | ProvidedProp _ -> [] -#endif - - let GetAttribInfosOfEvent amap m einfo = - match einfo with - | ILEvent(g, x) -> x.RawMetadata.CustomAttrs |> AttribInfosOfIL g amap x.ILTypeInfo.ILScopeRef m - | FSEvent(_, pi, _vref1, _vref2) -> GetAttribInfosOfProp amap m pi -#if EXTENSIONTYPING - // TODO: provided attributes - | ProvidedEvent _ -> [] -#endif - - /// Analyze three cases for attributes declared on type definitions: IL-declared attributes, F#-declared attributes and - /// provided attributes. - // - // This is used for AttributeUsageAttribute, DefaultMemberAttribute and ConditionalAttribute (on attribute types) - let TryBindTyconRefAttribute g m (AttribInfo (atref,_) as args) (tcref:TyconRef) f1 f2 f3 = - ignore m; ignore f3 - match metadataOfTycon tcref.Deref with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let provAttribs = info.ProvidedType.PApply((fun a -> (a :> IProvidedCustomAttributeProvider)),m) - match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with - | Some args -> f3 args - | None -> None -#endif - | ILTypeMetadata (_,tdef) -> - match TryDecodeILAttribute g atref tdef.CustomAttrs with - | Some attr -> f1 attr - | _ -> None - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - match TryFindFSharpAttribute g args tcref.Attribs with - | Some attr -> f2 attr - | _ -> None - - /// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and - /// provided attributes. - let BindMethInfoAttributes m minfo f1 f2 f3 = - ignore m; ignore f3 - match minfo with - | ILMeth (_,x,_) -> f1 x.RawMetadata.CustomAttrs - | FSMeth (_,_,vref,_) -> f2 vref.Attribs - | DefaultStructCtor _ -> f2 [] -#if EXTENSIONTYPING - | ProvidedMeth (_,mi,_,_) -> f3 (mi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) -#endif - - /// Analyze three cases for attributes declared on methods: IL-declared attributes, F#-declared attributes and - /// provided attributes. - let TryBindMethInfoAttribute g m (AttribInfo(atref,_) as attribSpec) minfo f1 f2 f3 = -#if EXTENSIONTYPING -#else - // to prevent unused parameter warning - ignore f3 -#endif - BindMethInfoAttributes m minfo - (fun ilAttribs -> TryDecodeILAttribute g atref ilAttribs |> Option.bind f1) - (fun fsAttribs -> TryFindFSharpAttribute g attribSpec fsAttribs |> Option.bind f2) -#if EXTENSIONTYPING - (fun provAttribs -> - match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), atref.FullName)),m) with - | Some args -> f3 args - | None -> None) -#else - (fun _provAttribs -> None) -#endif - - /// Try to find a specific attribute on a method, where the attribute accepts a string argument. - /// - /// This is just used for the 'ConditionalAttribute' attribute - let TryFindMethInfoStringAttribute g m attribSpec minfo = - TryBindMethInfoAttribute g m attribSpec minfo - (function ([ILAttribElem.String (Some msg) ],_) -> Some msg | _ -> None) - (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) - (function ([ Some ((:? string as msg) : obj) ],_) -> Some msg | _ -> None) - - /// Check if a method has a specific attribute. - let MethInfoHasAttribute g m attribSpec minfo = - TryBindMethInfoAttribute g m attribSpec minfo - (fun _ -> Some ()) - (fun _ -> Some ()) - (fun _ -> Some ()) - |> Option.isSome - - - - /// Check IL attributes for 'ObsoleteAttribute', returning errors and warnings as data - let private CheckILAttributes g cattrs m = - let (AttribInfo(tref,_)) = g.attrib_SystemObsolete - match TryDecodeILAttribute g tref cattrs with - | Some ([ILAttribElem.String (Some msg) ],_) -> - WarnD(ObsoleteWarning(msg,m)) - | Some ([ILAttribElem.String (Some msg); ILAttribElem.Bool isError ],_) -> - if isError then - ErrorD (ObsoleteError(msg,m)) - else - WarnD (ObsoleteWarning(msg,m)) - | Some ([ILAttribElem.String None ],_) -> - WarnD(ObsoleteWarning("",m)) - | Some _ -> - WarnD(ObsoleteWarning("",m)) - | None -> - CompleteD - - /// Check F# attributes for 'ObsoleteAttribute', 'CompilerMessageAttribute' and 'ExperimentalAttribute', - /// returning errors and warnings as data - let CheckFSharpAttributes g attribs m = - if isNil attribs then CompleteD - else - (match TryFindFSharpAttribute g g.attrib_SystemObsolete attribs with - | Some(Attrib(_,_,[ AttribStringArg s ],_,_,_,_)) -> - WarnD(ObsoleteWarning(s,m)) - | Some(Attrib(_,_,[ AttribStringArg s; AttribBoolArg(isError) ],_,_,_,_)) -> - if isError then - ErrorD (ObsoleteError(s,m)) - else - WarnD (ObsoleteWarning(s,m)) - | Some _ -> - WarnD(ObsoleteWarning("", m)) - | None -> - CompleteD - ) ++ (fun () -> - - match TryFindFSharpAttribute g g.attrib_CompilerMessageAttribute attribs with - | Some(Attrib(_,_,[ AttribStringArg s ; AttribInt32Arg n ],namedArgs,_,_,_)) -> - let msg = UserCompilerMessage(s,n,m) - let isError = - match namedArgs with - | ExtractAttribNamedArg "IsError" (AttribBoolArg v) -> v - | _ -> false - if isError then ErrorD msg else WarnD msg - - | _ -> - CompleteD - ) ++ (fun () -> - - match TryFindFSharpAttribute g g.attrib_ExperimentalAttribute attribs with - | Some(Attrib(_,_,[ AttribStringArg(s) ],_,_,_,_)) -> - WarnD(Experimental(s,m)) - | Some _ -> - WarnD(Experimental(FSComp.SR.experimentalConstruct (), m)) - | _ -> - CompleteD - ) ++ (fun () -> - - match TryFindFSharpAttribute g g.attrib_UnverifiableAttribute attribs with - | Some _ -> - WarnD(PossibleUnverifiableCode(m)) - | _ -> - CompleteD - ) - -#if EXTENSIONTYPING - /// Check a list of provided attributes for 'ObsoleteAttribute', returning errors and warnings as data - let private CheckProvidedAttributes g m (provAttribs: Tainted) = - let (AttribInfo(tref,_)) = g.attrib_SystemObsolete - match provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), tref.FullName)),m) with - | Some ([ Some (:? string as msg) ], _) -> WarnD(ObsoleteWarning(msg,m)) - | Some ([ Some (:? string as msg); Some (:?bool as isError) ], _) -> - if isError then - ErrorD (ObsoleteError(msg,m)) - else - WarnD (ObsoleteWarning(msg,m)) - | Some ([ None ], _) -> - WarnD(ObsoleteWarning("",m)) - | Some _ -> - WarnD(ObsoleteWarning("",m)) - | None -> - CompleteD -#endif - - /// Indicate if a list of IL attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. - let CheckILAttributesForUnseen g cattrs _m = - let (AttribInfo(tref,_)) = g.attrib_SystemObsolete - isSome (TryDecodeILAttribute g tref cattrs) - - /// Checks the attributes for CompilerMessageAttribute, which has an IsHidden argument that allows - /// items to be suppressed from intellisense. - let CheckFSharpAttributesForHidden g attribs = - nonNil attribs && - (match TryFindFSharpAttribute g g.attrib_CompilerMessageAttribute attribs with - | Some(Attrib(_,_,[AttribStringArg _; AttribInt32Arg messageNumber], - ExtractAttribNamedArg "IsHidden" (AttribBoolArg v),_,_,_)) -> - // Message number 62 is for "ML Compatibility". Items labelled with this are visible in intellisense - // when mlCompatibility is set. - v && not (messageNumber = 62 && g.mlCompatibility) - | _ -> false) - - /// Indicate if a list of F# attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. - let CheckFSharpAttributesForObsolete g attribs = - nonNil attribs && (HasFSharpAttribute g g.attrib_SystemObsolete attribs) - - /// Indicate if a list of F# attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. - /// Also check the attributes for CompilerMessageAttribute, which has an IsHidden argument that allows - /// items to be suppressed from intellisense. - let CheckFSharpAttributesForUnseen g attribs _m = - nonNil attribs && - (CheckFSharpAttributesForObsolete g attribs || - CheckFSharpAttributesForHidden g attribs) - -#if EXTENSIONTYPING - /// Indicate if a list of provided attributes contains 'ObsoleteAttribute'. Used to suppress the item in intellisense. - let CheckProvidedAttributesForUnseen (provAttribs: Tainted) m = - provAttribs.PUntaint((fun a -> a.GetAttributeConstructorArgs(provAttribs.TypeProvider.PUntaintNoFailure(id), typeof.FullName).IsSome),m) -#endif - - /// Check the attributes associated with a property, returning warnings and errors as data. - let CheckPropInfoAttributes pinfo m = - match pinfo with - | ILProp(g,ILPropInfo(_,pdef)) -> CheckILAttributes g pdef.CustomAttrs m - | FSProp(g,_,Some vref,_) - | FSProp(g,_,_,Some vref) -> CheckFSharpAttributes g vref.Attribs m - | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" -#if EXTENSIONTYPING - | ProvidedProp (amap,pi,m) -> - CheckProvidedAttributes amap.g m (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) - -#endif - - - /// Check the attributes associated with a IL field, returning warnings and errors as data. - let CheckILFieldAttributes g (finfo:ILFieldInfo) m = - match finfo with - | ILFieldInfo(_,pd) -> - CheckILAttributes g pd.CustomAttrs m |> CommitOperationResult -#if EXTENSIONTYPING - | ProvidedField (amap,fi,m) -> - CheckProvidedAttributes amap.g m (fi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) |> CommitOperationResult -#endif - - /// Check the attributes associated with a method, returning warnings and errors as data. - let CheckMethInfoAttributes g m tyargsOpt minfo = - let search = - BindMethInfoAttributes m minfo - (fun ilAttribs -> Some(CheckILAttributes g ilAttribs m)) - (fun fsAttribs -> - let res = - CheckFSharpAttributes g fsAttribs m ++ (fun () -> - if isNone tyargsOpt && HasFSharpAttribute g g.attrib_RequiresExplicitTypeArgumentsAttribute fsAttribs then - ErrorD(Error(FSComp.SR.tcFunctionRequiresExplicitTypeArguments(minfo.LogicalName),m)) - else - CompleteD) - Some res) -#if EXTENSIONTYPING - (fun provAttribs -> Some (CheckProvidedAttributes g m provAttribs)) -#else - (fun _provAttribs -> None) -#endif - match search with - | Some res -> res - | None -> CompleteD // no attribute = no errors - - /// Indicate if a method has 'Obsolete', 'CompilerMessageAttribute' or 'TypeProviderEditorHideMethodsAttribute'. - /// Used to suppress the item in intellisense. - let MethInfoIsUnseen g m typ minfo = - let isUnseenByObsoleteAttrib = - match BindMethInfoAttributes m minfo - (fun ilAttribs -> Some(CheckILAttributesForUnseen g ilAttribs m)) - (fun fsAttribs -> Some(CheckFSharpAttributesForUnseen g fsAttribs m)) -#if EXTENSIONTYPING - (fun provAttribs -> Some(CheckProvidedAttributesForUnseen provAttribs m)) -#else - (fun _provAttribs -> None) -#endif - with - | Some res -> res - | None -> false - - let isUnseenByHidingAttribute = -#if EXTENSIONTYPING - not (isObjTy g typ) && - isAppTy g typ && - isObjTy g minfo.EnclosingType && - let tcref = tcrefOfAppTy g typ - match tcref.TypeReprInfo with - | TProvidedTypeExtensionPoint info -> - info.ProvidedType.PUntaint((fun st -> (st :> IProvidedCustomAttributeProvider).GetHasTypeProviderEditorHideMethodsAttribute(info.ProvidedType.TypeProvider.PUntaintNoFailure(id))), m) - | _ -> - // This attribute check is done by name to ensure compilation doesn't take a dependency - // on Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute. - // - // We are only interested in filtering out the method on System.Object, so it is sufficient - // just to look at the attributes on IL methods. - if tcref.IsILTycon then - tcref.ILTyconRawMetadata.CustomAttrs.AsList - |> List.exists (fun attr -> attr.Method.EnclosingType.TypeSpec.Name = typeof.FullName) - else - false -#else - typ |> ignore - false -#endif - isUnseenByObsoleteAttrib || isUnseenByHidingAttribute - - /// Indicate if a property has 'Obsolete' or 'CompilerMessageAttribute'. - /// Used to suppress the item in intellisense. - let PropInfoIsUnseen m pinfo = - match pinfo with - | ILProp (g,ILPropInfo(_,pdef)) -> CheckILAttributesForUnseen g pdef.CustomAttrs m - | FSProp (g,_,Some vref,_) - | FSProp (g,_,_,Some vref) -> CheckFSharpAttributesForUnseen g vref.Attribs m - | FSProp _ -> failwith "CheckPropInfoAttributes: unreachable" -#if EXTENSIONTYPING - | ProvidedProp (_amap,pi,m) -> - CheckProvidedAttributesForUnseen (pi.PApply((fun st -> (st :> IProvidedCustomAttributeProvider)),m)) m -#endif - - /// Check the attributes on an entity, returning errors and warnings as data. - let CheckEntityAttributes g (x:TyconRef) m = - if x.IsILTycon then - CheckILAttributes g x.ILTyconRawMetadata.CustomAttrs m - else - CheckFSharpAttributes g x.Attribs m - - /// Check the attributes on a union case, returning errors and warnings as data. - let CheckUnionCaseAttributes g (x:UnionCaseRef) m = - CheckEntityAttributes g x.TyconRef m ++ (fun () -> - CheckFSharpAttributes g x.Attribs m) - - /// Check the attributes on a record field, returning errors and warnings as data. - let CheckRecdFieldAttributes g (x:RecdFieldRef) m = - CheckEntityAttributes g x.TyconRef m ++ (fun () -> - CheckFSharpAttributes g x.PropertyAttribs m) - - /// Check the attributes on an F# value, returning errors and warnings as data. - let CheckValAttributes g (x:ValRef) m = - CheckFSharpAttributes g x.Attribs m - - /// Check the attributes on a record field, returning errors and warnings as data. - let CheckRecdFieldInfoAttributes g (x:RecdFieldInfo) m = - CheckRecdFieldAttributes g x.RecdFieldRef m - - -open AttributeChecking - -//------------------------------------------------------------------------- -// Build calls -//------------------------------------------------------------------------- - - -/// Build an expression node that is a call to a .NET method. -let BuildILMethInfoCall g amap m isProp (minfo:ILMethInfo) valUseFlags minst direct args = - let valu = isStructTy g minfo.ApparentEnclosingType - let ctor = minfo.IsConstructor - if minfo.IsClassConstructor then - error (InternalError (minfo.ILName+": cannot call a class constructor",m)) - let useCallvirt = - not valu && not direct && minfo.IsVirtual - let isProtected = minfo.IsProtectedAccessibility - let ilMethRef = minfo.ILMethodRef - let newobj = ctor && (match valUseFlags with NormalValUse -> true | _ -> false) - let exprTy = if ctor then minfo.ApparentEnclosingType else minfo.GetFSharpReturnTy(amap, m, minst) - let retTy = (if not ctor && (ilMethRef.ReturnType = ILType.Void) then [] else [exprTy]) - let isDllImport = minfo.IsDllImport g - Expr.Op(TOp.ILCall(useCallvirt,isProtected,valu,newobj,valUseFlags,isProp,isDllImport,ilMethRef,minfo.DeclaringTypeInst,minst,retTy),[],args,m), - exprTy - -/// Build a call to the System.Object constructor taking no arguments, -let BuildObjCtorCall g m = - let ilMethRef = (mkILCtorMethSpecForTy(g.ilg.typ_Object,[])).MethodRef - Expr.Op(TOp.ILCall(false,false,false,false,CtorValUsedAsSuperInit,false,true,ilMethRef,[],[],[g.obj_ty]),[],[],m) - - -/// Build a call to an F# method. -/// -/// Consume the arguments in chunks and build applications. This copes with various F# calling signatures -/// all of which ultimately become 'methods'. -/// -/// QUERY: this looks overly complex considering that we are doing a fundamentally simple -/// thing here. -let BuildFSharpMethodApp g m (vref: ValRef) vexp vexprty (args: Exprs) = - let arities = (arityOfVal vref.Deref).AritiesOfArgs - - let args3,(leftover,retTy) = - ((args,vexprty), arities) ||> List.mapFold (fun (args,fty) arity -> - match arity,args with - | (0|1),[] when typeEquiv g (domainOfFunTy g fty) g.unit_ty -> mkUnit g m, (args, rangeOfFunTy g fty) - | 0,(arg::argst)-> - warning(InternalError(sprintf "Unexpected zero arity, args = %s" (Layout.showL (Layout.sepListL (Layout.rightL ";") (List.map exprL args))),m)); - arg, (argst, rangeOfFunTy g fty) - | 1,(arg :: argst) -> arg, (argst, rangeOfFunTy g fty) - | 1,[] -> error(InternalError("expected additional arguments here",m)) - | _ -> - if args.Length < arity then error(InternalError("internal error in getting arguments, n = "+string arity+", #args = "+string args.Length,m)); - let tupargs,argst = List.chop arity args - let tuptys = tupargs |> List.map (tyOfExpr g) - (mkTupled g m tupargs tuptys), - (argst, rangeOfFunTy g fty) ) - if not leftover.IsEmpty then error(InternalError("Unexpected "+string(leftover.Length)+" remaining arguments in method application",m)) - mkApps g ((vexp,vexprty),[],args3,m), - retTy - -/// Build a call to an F# method. -let BuildFSharpMethodCall g m (typ,vref:ValRef) valUseFlags minst args = - let vexp = Expr.Val (vref,valUseFlags,m) - let vexpty = vref.Type - let tpsorig,tau = vref.TypeScheme - let vtinst = argsOfAppTy g typ @ minst - if tpsorig.Length <> vtinst.Length then error(InternalError("BuildFSharpMethodCall: unexpected List.length mismatch",m)) - let expr = mkTyAppExpr m (vexp,vexpty) vtinst - let exprty = instType (mkTyparInst tpsorig vtinst) tau - BuildFSharpMethodApp g m vref expr exprty args - - -/// Make a call to a method info. Used by the optimizer and code generator to build -/// calls to the type-directed solutions to member constraints. -let MakeMethInfoCall amap m minfo minst args = - let valUseFlags = NormalValUse // correct unless if we allow wild trait constraints like "T has a ctor and can be used as a parent class" - match minfo with - | ILMeth(g,ilminfo,_) -> - let direct = not minfo.IsVirtual - let isProp = false // not necessarily correct, but this is only used post-creflect where this flag is irrelevant - BuildILMethInfoCall g amap m isProp ilminfo valUseFlags minst direct args |> fst - | FSMeth(g,typ,vref,_) -> - BuildFSharpMethodCall g m (typ,vref) valUseFlags minst args |> fst - | DefaultStructCtor(_,typ) -> - mkDefault (m,typ) -#if EXTENSIONTYPING - | ProvidedMeth(amap,mi,_,m) -> - let isProp = false // not necessarily correct, but this is only used post-creflect where this flag is irrelevant - let ilMethodRef = Import.ImportProvidedMethodBaseAsILMethodRef amap m mi - let isConstructor = mi.PUntaint((fun c -> c.IsConstructor), m) - let valu = mi.PUntaint((fun c -> c.DeclaringType.IsValueType), m) - let actualTypeInst = [] // GENERIC TYPE PROVIDERS: for generics, we would have something here - let actualMethInst = [] // GENERIC TYPE PROVIDERS: for generics, we would have something here - let ilReturnTys = Option.toList (minfo.GetCompiledReturnTy(amap, m, [])) // GENERIC TYPE PROVIDERS: for generics, we would have more here - // REVIEW: Should we allow protected calls? - Expr.Op(TOp.ILCall(false,false, valu, isConstructor,valUseFlags,isProp,false,ilMethodRef,actualTypeInst,actualMethInst, ilReturnTys),[],args,m) - -#endif -//--------------------------------------------------------------------------- -// Helpers when selecting members -//--------------------------------------------------------------------------- - - -/// Use the given function to select some of the member values from the members of an F# type -let SelectImmediateMemberVals g optFilter f (tcref:TyconRef) = - let chooser (vref:ValRef) = - match vref.MemberInfo with - // The 'when' condition is a workaround for the fact that values providing - // override and interface implementations are published in inferred module types - // These cannot be selected directly via the "." notation. - // However, it certainly is useful to be able to publish these values, as we can in theory - // optimize code to make direct calls to these methods. - | Some membInfo when not (ValRefIsExplicitImpl g vref) -> - f membInfo vref - | _ -> - None - - match optFilter with - | None -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.chooseRange chooser - | Some nm -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.find nm |> List.choose chooser - -/// Check whether a name matches an optional filter -let checkFilter optFilter (nm:string) = match optFilter with None -> true | Some n2 -> nm = n2 - -/// Try to select an F# value when querying members, and if so return a MethInfo that wraps the F# value. -let TrySelectMemberVal g optFilter typ pri _membInfo (vref:ValRef) = - if checkFilter optFilter vref.LogicalName then - Some(FSMeth(g,typ,vref,pri)) - else - None - -/// Query the immediate methods of an F# type, not taking into account inherited methods. The optFilter -/// parameter is an optional name to restrict the set of properties returned. -let GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ = - let minfos = - - match metadataOfTy g typ with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let st = info.ProvidedType - let meths = - match optFilter with - | Some name -> st.PApplyArray ((fun st -> st.GetMethods() |> Array.filter (fun mi -> mi.Name = name) ), "GetMethods", m) - | None -> st.PApplyArray ((fun st -> st.GetMethods()), "GetMethods", m) - [ for mi in meths -> ProvidedMeth(amap,mi.Coerce(m),None,m) ] -#endif - | ILTypeMetadata (_,tdef) -> - let mdefs = tdef.Methods - let mdefs = (match optFilter with None -> mdefs.AsList | Some nm -> mdefs.FindByName nm) - mdefs |> List.map (fun mdef -> MethInfo.CreateILMeth(amap, m, typ, mdef)) - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - if not (isAppTy g typ) then [] - else SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter typ None) (tcrefOfAppTy g typ) - let minfos = minfos |> List.filter (IsMethInfoAccessible amap m ad) - minfos - -/// A helper type to help collect properties. -/// -/// Join up getters and setters which are not associated in the F# data structure -type PropertyCollector(g,amap,m,typ,optFilter,ad) = - - let hashIdentity = - Microsoft.FSharp.Collections.HashIdentity.FromFunctions - (fun (pinfo:PropInfo) -> hash pinfo.PropertyName) - (fun pinfo1 pinfo2 -> - pinfo1.IsStatic = pinfo2.IsStatic && - PropInfosEquivByNameAndPartialSig EraseNone g amap m pinfo1 pinfo2 && - pinfo1.IsDefiniteFSharpOverride = pinfo2.IsDefiniteFSharpOverride ) - let props = new System.Collections.Generic.Dictionary(hashIdentity) - let add pinfo = - if props.ContainsKey(pinfo) then - match props.[pinfo], pinfo with - | FSProp (_,typ,Some vref1,_), FSProp (_,_,_,Some vref2) - | FSProp (_,typ,_,Some vref2), FSProp (_,_,Some vref1,_) -> - let pinfo = FSProp (g,typ,Some vref1,Some vref2) - props.[pinfo] <- pinfo - | _ -> - // This assert fires while editing bad code. We will give a warning later in check.fs - //assert ("unexpected case"= "") - () - else - props.[pinfo] <- pinfo - - member x.Collect(membInfo:ValMemberInfo,vref:ValRef) = - match membInfo.MemberFlags.MemberKind with - | MemberKind.PropertyGet -> - let pinfo = FSProp(g,typ,Some vref,None) - if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then - add pinfo - | MemberKind.PropertySet -> - let pinfo = FSProp(g,typ,None,Some vref) - if checkFilter optFilter vref.PropertyName && IsPropInfoAccessible g amap m ad pinfo then - add pinfo - | _ -> - () - - member x.Close() = [ for KeyValue(_,pinfo) in props -> pinfo ] - -/// Query the immediate properties of an F# type, not taking into account inherited properties. The optFilter -/// parameter is an optional name to restrict the set of properties returned. -let GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ = - let pinfos = - - match metadataOfTy g typ with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let st = info.ProvidedType - let matchingProps = - match optFilter with - | Some name -> - match st.PApply((fun st -> st.GetProperty name), m) with - | Tainted.Null -> [||] - | pi -> [|pi|] - | None -> - st.PApplyArray((fun st -> st.GetProperties()), "GetProperties", m) - matchingProps - |> Seq.map(fun pi -> ProvidedProp(amap,pi,m)) - |> List.ofSeq -#endif - | ILTypeMetadata (_,tdef) -> - let tinfo = ILTypeInfo.FromType g typ - let pdefs = tdef.Properties - let pdefs = match optFilter with None -> pdefs.AsList | Some nm -> pdefs.LookupByName nm - pdefs |> List.map (fun pd -> ILProp(g,ILPropInfo(tinfo,pd))) - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - - if not (isAppTy g typ) then [] - else - let propCollector = new PropertyCollector(g,amap,m,typ,optFilter,ad) - SelectImmediateMemberVals g None - (fun membInfo vref -> propCollector.Collect(membInfo,vref); None) - (tcrefOfAppTy g typ) |> ignore - propCollector.Close() - - let pinfos = pinfos |> List.filter (IsPropInfoAccessible g amap m ad) - pinfos - - -//--------------------------------------------------------------------------- -// - -/// Sets of methods up the hierarchy, ignoring duplicates by name and sig. -/// Used to collect sets of virtual methods, protected methods, protected -/// properties etc. -type HierarchyItem = - | MethodItem of MethInfo list list - | PropertyItem of PropInfo list list - | RecdFieldItem of RecdFieldInfo - | EventItem of EventInfo list - | ILFieldItem of ILFieldInfo list - -/// An InfoReader is an object to help us read and cache infos. -/// We create one of these for each file we typecheck. -/// -/// REVIEW: We could consider sharing one InfoReader across an entire compilation -/// run or have one global one for each (g,amap) pair. -type InfoReader(g:TcGlobals, amap:Import.ImportMap) = - - /// Get the declared IL fields of a type, not including inherited fields - let GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ = - let infos = - match metadataOfTy g typ with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let st = info.ProvidedType - match optFilter with - | None -> - [ for fi in st.PApplyArray((fun st -> st.GetFields()), "GetFields" , m) -> ProvidedField(amap,fi,m) ] - | Some name -> - match st.PApply ((fun st -> st.GetField name), m) with - | Tainted.Null -> [] - | fi -> [ ProvidedField(amap,fi,m) ] -#endif - | ILTypeMetadata (_,tdef) -> - let tinfo = ILTypeInfo.FromType g typ - let fdefs = tdef.Fields - let fdefs = match optFilter with None -> fdefs.AsList | Some nm -> fdefs.LookupByName nm - fdefs |> List.map (fun pd -> ILFieldInfo(tinfo,pd)) - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - [] - let infos = infos |> List.filter (IsILFieldInfoAccessible g amap m ad) - infos - - /// Get the declared events of a type, not including inherited events - let ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ = - let infos = - match metadataOfTy g typ with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let st = info.ProvidedType - match optFilter with - | None -> - [ for ei in st.PApplyArray((fun st -> st.GetEvents()), "GetEvents" , m) -> ProvidedEvent(amap,ei,m) ] - | Some name -> - match st.PApply ((fun st -> st.GetEvent name), m) with - | Tainted.Null -> [] - | ei -> [ ProvidedEvent(amap,ei,m) ] -#endif - | ILTypeMetadata (_,tdef) -> - let tinfo = ILTypeInfo.FromType g typ - let edefs = tdef.Events - let edefs = match optFilter with None -> edefs.AsList | Some nm -> edefs.LookupByName nm - [ for edef in edefs do - let einfo = ILEventInfo(tinfo,edef) - if IsILEventInfoAccessible g amap m ad einfo then - yield ILEvent(g,einfo) ] - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - [] - infos - - /// Make a reference to a record or class field - let MakeRecdFieldInfo g typ (tcref:TyconRef) fspec = - RecdFieldInfo(argsOfAppTy g typ,tcref.MakeNestedRecdFieldRef fspec) - - /// Get the F#-declared record fields or class 'val' fields of a type - let GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,_ad) _m typ = - match tryDestAppTy g typ with - | None -> [] - | Some tcref -> - // Note;secret fields are not allowed in lookups here, as we're only looking - // up user-visible fields in name resolution. - match optFilter with - | Some nm -> - match tcref.GetFieldByName nm with - | Some rfield when not rfield.IsCompilerGenerated -> [MakeRecdFieldInfo g typ tcref rfield] - | _ -> [] - | None -> - [ for fdef in tcref.AllFieldsArray do - if not fdef.IsCompilerGenerated then - yield MakeRecdFieldInfo g typ tcref fdef ] - - - /// The primitive reader for the method info sets up a hierarchy - let GetIntrinsicMethodSetsUncached ((optFilter,ad,allowMultiIntfInst),m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ :: acc) g amap m allowMultiIntfInst typ [] - - /// The primitive reader for the property info sets up a hierarchy - let GetIntrinsicPropertySetsUncached ((optFilter,ad,allowMultiIntfInst),m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ :: acc) g amap m allowMultiIntfInst typ [] - - let GetIntrinsicILFieldInfosUncached ((optFilter,ad),m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] - - let GetIntrinsicEventInfosUncached ((optFilter,ad),m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] - - let GetIntrinsicRecdOrClassFieldInfosUncached ((optFilter,ad),m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m typ @ acc) g amap m AllowMultiIntfInstantiations.Yes typ [] - - let GetEntireTypeHierachyUncached (allowMultiIntfInst,m,typ) = - FoldEntireHierarchyOfType (fun typ acc -> typ :: acc) g amap m allowMultiIntfInst typ [] - - let GetPrimaryTypeHierachyUncached (allowMultiIntfInst,m,typ) = - FoldPrimaryHierarchyOfType (fun typ acc -> typ :: acc) g amap m allowMultiIntfInst typ [] - - /// The primitive reader for the named items up a hierarchy - let GetIntrinsicNamedItemsUncached ((nm,ad),m,typ) = - if nm = ".ctor" then None else // '.ctor' lookups only ever happen via constructor syntax - let optFilter = Some nm - FoldPrimaryHierarchyOfType (fun typ acc -> - let minfos = GetImmediateIntrinsicMethInfosOfType (optFilter,ad) g amap m typ - let pinfos = GetImmediateIntrinsicPropInfosOfType (optFilter,ad) g amap m typ - let finfos = GetImmediateIntrinsicILFieldsOfType (optFilter,ad) m typ - let einfos = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ - let rfinfos = GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter,ad) m typ - match acc with - | Some(MethodItem(inheritedMethSets)) when nonNil minfos -> Some(MethodItem (minfos::inheritedMethSets)) - | _ when nonNil minfos -> Some(MethodItem ([minfos])) - | Some(PropertyItem(inheritedPropSets)) when nonNil pinfos -> Some(PropertyItem(pinfos::inheritedPropSets)) - | _ when nonNil pinfos -> Some(PropertyItem([pinfos])) - | _ when nonNil finfos -> Some(ILFieldItem(finfos)) - | _ when nonNil einfos -> Some(EventItem(einfos)) - | _ when nonNil rfinfos -> - match rfinfos with - | [single] -> Some(RecdFieldItem(single)) - | _ -> failwith "Unexpected multiple fields with the same name" // Because an explicit name (i.e., nm) was supplied, there will be only one element at most. - | _ -> acc) - g amap m - AllowMultiIntfInstantiations.Yes - typ - None - - /// Make a cache for function 'f' keyed by type (plus some additional 'flags') that only - /// caches computations for monomorphic types. - - let MakeInfoCache f (flagsEq : System.Collections.Generic.IEqualityComparer<_>) = - new MemoizationTable<_,_> - (compute=f, - // Only cache closed, monomorphic types (closed = all members for the type - // have been processed). Generic type instantiations could be processed if we had - // a decent hash function for these. - canMemoize=(fun (_flags,(_:range),typ) -> - match stripTyEqns g typ with - | TType_app(tcref,[]) -> tcref.TypeContents.tcaug_closed - | _ -> false), - - keyComparer= - { new System.Collections.Generic.IEqualityComparer<_> with - member x.Equals((flags1,_,typ1),(flags2,_,typ2)) = - // Ignoring the ranges - that's OK. - flagsEq.Equals(flags1,flags2) && - match stripTyEqns g typ1, stripTyEqns g typ2 with - | TType_app(tcref1,[]),TType_app(tcref2,[]) -> tyconRefEq g tcref1 tcref2 - | _ -> false - member x.GetHashCode((flags,_,typ)) = - // Ignoring the ranges - that's OK. - flagsEq.GetHashCode flags + - (match stripTyEqns g typ with - | TType_app(tcref,[]) -> hash tcref.LogicalName - | _ -> 0) }) - - - let hashFlags0 = - { new System.Collections.Generic.IEqualityComparer<_> with - member x.GetHashCode((filter: string option, ad: AccessorDomain, _allowMultiIntfInst1)) = hash filter + AccessorDomain.CustomGetHashCode ad - member x.Equals((filter1, ad1, allowMultiIntfInst1), (filter2,ad2, allowMultiIntfInst2)) = - (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) && allowMultiIntfInst1 = allowMultiIntfInst2 } - - let hashFlags1 = - { new System.Collections.Generic.IEqualityComparer<_> with - member x.GetHashCode((filter: string option,ad: AccessorDomain)) = hash filter + AccessorDomain.CustomGetHashCode ad - member x.Equals((filter1,ad1), (filter2,ad2)) = (filter1 = filter2) && AccessorDomain.CustomEquals(g,ad1,ad2) } - - let hashFlags2 = - { new System.Collections.Generic.IEqualityComparer<_> with - member x.GetHashCode((nm: string,ad: AccessorDomain)) = hash nm + AccessorDomain.CustomGetHashCode ad - member x.Equals((nm1,ad1), (nm2,ad2)) = (nm1 = nm2) && AccessorDomain.CustomEquals(g,ad1,ad2) } - - let methodInfoCache = MakeInfoCache GetIntrinsicMethodSetsUncached hashFlags0 - let propertyInfoCache = MakeInfoCache GetIntrinsicPropertySetsUncached hashFlags0 - let recdOrClassFieldInfoCache = MakeInfoCache GetIntrinsicRecdOrClassFieldInfosUncached hashFlags1 - let ilFieldInfoCache = MakeInfoCache GetIntrinsicILFieldInfosUncached hashFlags1 - let eventInfoCache = MakeInfoCache GetIntrinsicEventInfosUncached hashFlags1 - let namedItemsCache = MakeInfoCache GetIntrinsicNamedItemsUncached hashFlags2 - - let entireTypeHierarchyCache = MakeInfoCache GetEntireTypeHierachyUncached HashIdentity.Structural - let primaryTypeHierarchyCache = MakeInfoCache GetPrimaryTypeHierachyUncached HashIdentity.Structural - - member x.g = g - member x.amap = amap - - /// Read the raw method sets of a type, including inherited ones. Cache the result for monomorphic types - member x.GetRawIntrinsicMethodSetsOfType (optFilter,ad,allowMultiIntfInst,m,typ) = - methodInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,typ)) - - /// Read the raw property sets of a type, including inherited ones. Cache the result for monomorphic types - member x.GetRawIntrinsicPropertySetsOfType (optFilter,ad,allowMultiIntfInst,m,typ) = - propertyInfoCache.Apply(((optFilter,ad,allowMultiIntfInst),m,typ)) - - /// Read the record or class fields of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetRecordOrClassFieldsOfType (optFilter,ad,m,typ) = - recdOrClassFieldInfoCache.Apply(((optFilter,ad),m,typ)) - - /// Read the IL fields of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetILFieldInfosOfType (optFilter,ad,m,typ) = - ilFieldInfoCache.Apply(((optFilter,ad),m,typ)) - - member x.GetImmediateIntrinsicEventsOfType (optFilter,ad,m,typ) = ComputeImmediateIntrinsicEventsOfType (optFilter,ad) m typ - - /// Read the events of a type, including inherited ones. Cache the result for monomorphic types. - member x.GetEventInfosOfType (optFilter,ad,m,typ) = - eventInfoCache.Apply(((optFilter,ad),m,typ)) - - /// Try and find a record or class field for a type. - member x.TryFindRecdOrClassFieldInfoOfType (nm,m,typ) = - match recdOrClassFieldInfoCache.Apply((Some nm,AccessibleFromSomewhere),m,typ) with - | [] -> None - | [single] -> Some single - | flds -> - // multiple fields with the same name can come from different classes, - // so filter them by the given type name - match tryDestAppTy g typ with - | None -> None - | Some tcref -> - match flds |> List.filter (fun rfinfo -> tyconRefEq g tcref rfinfo.TyconRef) with - | [] -> None - | [single] -> Some single - | _ -> failwith "unexpected multiple fields with same name" // Because it should have been already reported as duplicate fields - - /// Try and find an item with the given name in a type. - member x.TryFindNamedItemOfType (nm,ad,m,typ) = - namedItemsCache.Apply(((nm,ad),m,typ)) - - /// Get the super-types of a type, including interface types. - member x.GetEntireTypeHierachy (allowMultiIntfInst,m,typ) = - entireTypeHierarchyCache.Apply((allowMultiIntfInst,m,typ)) - - /// Get the super-types of a type, excluding interface types. - member x.GetPrimaryTypeHierachy (allowMultiIntfInst,m,typ) = - primaryTypeHierarchyCache.Apply((allowMultiIntfInst,m,typ)) - - -//------------------------------------------------------------------------- -// Constructor infos - - -/// Get the declared constructors of any F# type -let GetIntrinsicConstructorInfosOfType (infoReader:InfoReader) m ty = - let g = infoReader.g - let amap = infoReader.amap - if isAppTy g ty then - match metadataOfTy g ty with -#if EXTENSIONTYPING - | ProvidedTypeMetadata info -> - let st = info.ProvidedType - [ for ci in st.PApplyArray((fun st -> st.GetConstructors()), "GetConstructors", m) do - yield ProvidedMeth(amap,ci.Coerce(m),None,m) ] -#endif - | ILTypeMetadata _ -> - let tinfo = ILTypeInfo.FromType g ty - tinfo.RawMetadata.Methods.FindByName ".ctor" - |> List.filter (fun md -> match md.mdKind with MethodKind.Ctor -> true | _ -> false) - |> List.map (fun mdef -> MethInfo.CreateILMeth (amap, m, ty, mdef)) - - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - let tcref = tcrefOfAppTy g ty - tcref.MembersOfFSharpTyconByName - |> NameMultiMap.find ".ctor" - |> List.choose(fun vref -> - match vref.MemberInfo with - | Some membInfo when (membInfo.MemberFlags.MemberKind = MemberKind.Constructor) -> Some vref - | _ -> None) - |> List.map (fun x -> FSMeth(g,ty,x,None)) - else [] - -//------------------------------------------------------------------------- -// Collecting methods and properties taking into account hiding rules in the hierarchy - - -/// Indicates if we prefer overrides or abstract slots. -type FindMemberFlag = - /// Prefer items toward the top of the hierarchy, which we do if the items are virtual - /// but not when resolving base calls. - | IgnoreOverrides - /// Get overrides instead of abstract slots when measuring whether a class/interface implements all its required slots. - | PreferOverrides - -/// The input list is sorted from most-derived to least-derived type, so any System.Object methods -/// are at the end of the list. Return a filtered list where prior/subsequent members matching by name and -/// that are in the same equivalence class have been removed. We keep a name-indexed table to -/// be more efficient when we check to see if we've already seen a particular named method. -type private IndexedList<'T>(itemLists: 'T list list, itemsByName: NameMultiMap<'T>) = - - /// Get the item sets - member x.Items = itemLists - - /// Get the items with a particular name - member x.ItemsWithName(nm) = NameMultiMap.find nm itemsByName - - /// Add new items, extracting the names using the given function. - member x.AddItems(items,nmf) = IndexedList<'T>(items::itemLists,List.foldBack (fun x acc -> NameMultiMap.add (nmf x) x acc) items itemsByName ) - - /// Get an empty set of items - static member Empty = IndexedList<'T>([],NameMultiMap.empty) - - /// Filter a set of new items to add according to the content of the list. Only keep an item - /// if it passes 'keepTest' for all matching items already in the list. - member x.FilterNewItems keepTest nmf itemsToAdd = - // Have we already seen an item with the same name and that is in the same equivalence class? - // If so, ignore this one. Note we can check against the original incoming 'ilist' because we are assuming that - // none the elements of 'itemsToAdd' are equivalent. - itemsToAdd |> List.filter (fun item -> List.forall (keepTest item) (x.ItemsWithName(nmf item))) - -/// Add all the items to the IndexedList, preferring the ones in the super-types. This is used to hide methods -/// in super classes and/or hide overrides of methods in subclasses. -/// -/// Assume no items in 'items' are equivalent according to 'equivTest'. This is valid because each step in a -/// .NET class hierarchy introduces a consistent set of methods, none of which hide each other within the -/// given set. This is an important optimization because it means we don't have filter for equivalence between the -/// large overload sets introduced by methods like System.WriteLine. -/// -/// Assume items can be given names by 'nmf', where two items with different names are -/// not equivalent. - -let private FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf keepTest itemLists = - let rec loop itemLists = - match itemLists with - | [] -> IndexedList.Empty - | items :: itemsInSuperTypes -> - let ilist = loop itemsInSuperTypes - let itemsToAdd = ilist.FilterNewItems keepTest nmf items - ilist.AddItems(itemsToAdd,nmf) - (loop itemLists).Items - -/// Add all the items to the IndexedList, preferring the ones in the sub-types. -let private FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf keepTest itemLists = - let rec loop itemLists (indexedItemsInSubTypes:IndexedList<_>) = - match itemLists with - | [] -> List.rev indexedItemsInSubTypes.Items - | items :: itemsInSuperTypes -> - let itemsToAdd = items |> List.filter (fun item -> keepTest item (indexedItemsInSubTypes.ItemsWithName(nmf item))) - let ilist = indexedItemsInSubTypes.AddItems(itemsToAdd,nmf) - loop itemsInSuperTypes ilist - - loop itemLists IndexedList.Empty - -let private ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes nmf equivTest itemLists = - FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 items -> not (items |> List.exists (fun item2 -> equivTest item1 item2))) itemLists - -/// Filter the overrides of methods or properties, either keeping the overrides or keeping the dispatch slots. -let private FilterOverrides findFlag (isVirt:'a->bool,isNewSlot,isDefiniteOverride,isFinal,equivSigs,nmf:'a->string) items = - let equivVirts x y = isVirt x && isVirt y && equivSigs x y - - match findFlag with - | PreferOverrides -> - items - // For each F#-declared override, get rid of any equivalent abstract member in the same type - // This is because F# abstract members with default overrides give rise to two members with the - // same logical signature in the same type, e.g. - // type ClassType1() = - // abstract VirtualMethod1: string -> int - // default x.VirtualMethod1(s) = 3 - - |> List.map (fun items -> - let definiteOverrides = items |> List.filter isDefiniteOverride - items |> List.filter (fun item -> (isDefiniteOverride item || not (List.exists (equivVirts item) definiteOverrides)))) - - // only keep virtuals that are not signature-equivalent to virtuals in subtypes - |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes nmf equivVirts - | IgnoreOverrides -> - let equivNewSlots x y = isNewSlot x && isNewSlot y && equivSigs x y - items - // Remove any F#-declared overrides. THese may occur in the same type as the abstract member (unlike with .NET metadata) - // Include any 'newslot' declared methods. - |> List.map (List.filter (fun x -> not (isDefiniteOverride x))) - - // Remove any virtuals that are signature-equivalent to virtuals in subtypes, except for newslots - // That is, keep if it's - /// (a) not virtual - // (b) is a new slot or - // (c) not equivalent - // We keep virtual finals around for error detection later on - |> FilterItemsInSubTypesBasedOnItemsInSuperTypes nmf (fun newItem priorItem -> - (isVirt newItem && isFinal newItem) || not (isVirt newItem) || isNewSlot newItem || not (equivVirts newItem priorItem) ) - - // Remove any abstract slots in supertypes that are (a) hidden by another newslot and (b) implemented - // We leave unimplemented ones around to give errors, e.g. for - // [] - // type PA() = - // abstract M : int -> unit - // - // [] - // type PB<'a>() = - // inherit PA() - // abstract M : 'a -> unit - // - // [] - // type PC() = - // inherit PB() - // // Here, PA.M and PB.M have the same signature, so PA.M is unimplementable. - // // REVIEW: in future we may give a friendly error at this point - // - // type PD() = - // inherit PC() - // override this.M(x:int) = () - - |> FilterItemsInSuperTypesBasedOnItemsInSubTypes nmf (fun item1 superTypeItems -> - not (isNewSlot item1 && - superTypeItems |> List.exists (equivNewSlots item1) && - superTypeItems |> List.exists (fun item2 -> isDefiniteOverride item1 && equivVirts item1 item2))) - - -/// Filter the overrides of methods, either keeping the overrides or keeping the dispatch slots. -let private FilterOverridesOfMethInfos findFlag g amap m minfos = - FilterOverrides findFlag ((fun (minfo:MethInfo) -> minfo.IsVirtual),(fun minfo -> minfo.IsNewSlot),(fun minfo -> minfo.IsDefiniteFSharpOverride),(fun minfo -> minfo.IsFinal),MethInfosEquivByNameAndSig EraseNone true g amap m,(fun minfo -> minfo.LogicalName)) minfos - -/// Filter the overrides of properties, either keeping the overrides or keeping the dispatch slots. -let private FilterOverridesOfPropInfos findFlag g amap m props = - FilterOverrides findFlag ((fun (pinfo:PropInfo) -> pinfo.IsVirtualProperty),(fun pinfo -> pinfo.IsNewSlot),(fun pinfo -> pinfo.IsDefiniteFSharpOverride),(fun _ -> false),PropInfosEquivByNameAndSig EraseNone g amap m, (fun pinfo -> pinfo.PropertyName)) props - -/// Exclude methods from super types which have the same signature as a method in a more specific type. -let ExcludeHiddenOfMethInfos g amap m (minfos:MethInfo list list) = - minfos - |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes - (fun minfo -> minfo.LogicalName) - (fun m1 m2 -> - // only hide those truly from super classes - not (tyconRefEq g (tcrefOfAppTy g m1.EnclosingType) (tcrefOfAppTy g m2.EnclosingType)) && - MethInfosEquivByNameAndPartialSig EraseNone true g amap m m1 m2) - - |> List.concat - -/// Exclude properties from super types which have the same name as a property in a more specific type. -let ExcludeHiddenOfPropInfos g amap m pinfos = - pinfos - |> ExcludeItemsInSuperTypesBasedOnEquivTestWithItemsInSubTypes (fun (pinfo:PropInfo) -> pinfo.PropertyName) (PropInfosEquivByNameAndPartialSig EraseNone g amap m) - |> List.concat - -/// Get the sets of intrinsic methods in the hierarchy (not including extension methods) -let GetIntrinsicMethInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m typ = - infoReader.GetRawIntrinsicMethodSetsOfType(optFilter,ad,allowMultiIntfInst,m,typ) - |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m - -/// Get the sets intrinsic properties in the hierarchy (not including extension properties) -let GetIntrinsicPropInfoSetsOfType (infoReader:InfoReader) (optFilter,ad,allowMultiIntfInst) findFlag m typ = - infoReader.GetRawIntrinsicPropertySetsOfType(optFilter,ad,allowMultiIntfInst,m,typ) - |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m - -/// Get the flattened list of intrinsic methods in the hierarchy -let GetIntrinsicMethInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ = - GetIntrinsicMethInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ |> List.concat - -/// Get the flattened list of intrinsic properties in the hierarchy -let GetIntrinsicPropInfosOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ = - GetIntrinsicPropInfoSetsOfType infoReader (optFilter,ad,allowMultiIntfInst) findFlag m typ |> List.concat - -/// Perform type-directed name resolution of a particular named member in an F# type -let TryFindIntrinsicNamedItemOfType (infoReader:InfoReader) (nm,ad) findFlag m typ = - match infoReader.TryFindNamedItemOfType(nm, ad, m, typ) with - | Some item -> - match item with - | PropertyItem psets -> Some(PropertyItem (psets |> FilterOverridesOfPropInfos findFlag infoReader.g infoReader.amap m)) - | MethodItem msets -> Some(MethodItem (msets |> FilterOverridesOfMethInfos findFlag infoReader.g infoReader.amap m)) - | _ -> Some(item) - | None -> None - -/// Try to detect the existence of a method on a type. -/// Used for -/// -- getting the GetEnumerator, get_Current, MoveNext methods for enumerable types -/// -- getting the Dispose method when resolving the 'use' construct -/// -- getting the various methods used to desugar the computation expression syntax -let TryFindIntrinsicMethInfo infoReader m ad nm ty = - GetIntrinsicMethInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty - -/// Try to find a particular named property on a type. Only used to ensure that local 'let' definitions and property names -/// are distinct, a somewhat adhoc check in tc.fs. -let TryFindPropInfo infoReader m ad nm ty = - GetIntrinsicPropInfosOfType infoReader (Some nm,ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m ty - -//------------------------------------------------------------------------- -// Helpers related to delegates and events -//------------------------------------------------------------------------- - -/// The Invoke MethInfo, the function argument types, the function return type -/// and the overall F# function type for the function type associated with a .NET delegate type -[] -type SigOfFunctionForDelegate = SigOfFunctionForDelegate of MethInfo * TType list * TType * TType - -/// Given a delegate type work out the minfo, argument types, return type -/// and F# function type by looking at the Invoke signature of the delegate. -let GetSigOfFunctionForDelegate (infoReader:InfoReader) delty m ad = - let g = infoReader.g - let amap = infoReader.amap - let invokeMethInfo = - match GetIntrinsicMethInfosOfType infoReader (Some "Invoke",ad,AllowMultiIntfInstantiations.Yes) IgnoreOverrides m delty with - | [h] -> h - | [] -> error(Error(FSComp.SR.noInvokeMethodsFound (),m)) - | h :: _ -> warning(InternalError(FSComp.SR.moreThanOneInvokeMethodFound (),m)); h - - let minst = [] // a delegate's Invoke method is never generic - let compiledViewOfDelArgTys = - match invokeMethInfo.GetParamTypes(amap, m, minst) with - | [args] -> args - | _ -> error(Error(FSComp.SR.delegatesNotAllowedToHaveCurriedSignatures (),m)) - let fsharpViewOfDelArgTys = - match compiledViewOfDelArgTys with - | [] -> [g.unit_ty] - | _ -> compiledViewOfDelArgTys - let delRetTy = invokeMethInfo.GetFSharpReturnTy(amap, m, minst) - CheckMethInfoAttributes g m None invokeMethInfo |> CommitOperationResult - let fty = mkIteratedFunTy fsharpViewOfDelArgTys delRetTy - SigOfFunctionForDelegate(invokeMethInfo,compiledViewOfDelArgTys,delRetTy,fty) - -/// Try and interpret a delegate type as a "standard" .NET delegate type associated with an event, with a "sender" parameter. -let TryDestStandardDelegateTyp (infoReader:InfoReader) m ad delTy = - let g = infoReader.g - let (SigOfFunctionForDelegate(_,compiledViewOfDelArgTys,delRetTy,_)) = GetSigOfFunctionForDelegate infoReader delTy m ad - match compiledViewOfDelArgTys with - | senderTy :: argTys when (isObjTy g senderTy) && not (List.exists (isByrefTy g) argTys) -> Some(mkTupledTy g argTys,delRetTy) - | _ -> None - - -/// Indicates if an event info is associated with a delegate type that is a "standard" .NET delegate type -/// with a sender parameter. -// -/// In the F# design, we take advantage of the following idiom to simplify away the bogus "object" parameter of the -/// of the "Add" methods associated with events. If you want to access it you -/// can use AddHandler instead. - -/// The .NET Framework guidelines indicate that the delegate type used for -/// an event should take two parameters, an "object source" parameter -/// indicating the source of the event, and an "e" parameter that -/// encapsulates any additional information about the event. The type of -/// the "e" parameter should derive from the EventArgs class. For events -/// that do not use any additional information, the .NET Framework has -/// already defined an appropriate delegate type: EventHandler. -/// (from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkEventsTutorial.asp) -let IsStandardEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = - let dty = einfo.GetDelegateType(infoReader.amap,m) - match TryDestStandardDelegateTyp infoReader m ad dty with - | Some _ -> true - | None -> false - -/// Get the (perhaps tupled) argument type accepted by an event -let ArgsTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = - let amap = infoReader.amap - let dty = einfo.GetDelegateType(amap,m) - match TryDestStandardDelegateTyp infoReader m ad dty with - | Some(argtys,_) -> argtys - | None -> error(nonStandardEventError einfo.EventName m) - -/// Get the type of the event when looked at as if it is a property -/// Used when displaying the property in Intellisense -let PropTypOfEventInfo (infoReader:InfoReader) m ad (einfo:EventInfo) = - let g = infoReader.g - let amap = infoReader.amap - let delTy = einfo.GetDelegateType(amap,m) - let argsTy = ArgsTypOfEventInfo infoReader m ad einfo - mkIEventType g delTy argsTy - - diff --git a/src/fsharp/vs/ServiceDeclarations.fs b/src/fsharp/vs/ServiceDeclarations.fs index 5c4d52645f7..13eff5bcb83 100644 --- a/src/fsharp/vs/ServiceDeclarations.fs +++ b/src/fsharp/vs/ServiceDeclarations.fs @@ -8,25 +8,29 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open System +open System.Collections.Generic open System.IO open System.Text -open System.Collections.Generic + open Microsoft.FSharp.Core.Printf open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics -open Microsoft.FSharp.Compiler.PrettyNaming -open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.Range + +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Layout +open Microsoft.FSharp.Compiler.Lib +open Microsoft.FSharp.Compiler.PrettyNaming +open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops -open Microsoft.FSharp.Compiler.Lib -open Microsoft.FSharp.Compiler.Layout +open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.SourceCodeServices.ItemDescriptionIcons module EnvMisc2 = diff --git a/src/fsharp/vs/ServiceDeclarations.fsi b/src/fsharp/vs/ServiceDeclarations.fsi index 31a72e6742e..1961d37411f 100755 --- a/src/fsharp/vs/ServiceDeclarations.fsi +++ b/src/fsharp/vs/ServiceDeclarations.fsi @@ -12,6 +12,7 @@ open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Infos open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops diff --git a/src/fsharp/vs/Symbols.fs b/src/fsharp/vs/Symbols.fs index eaa0c25dd72..195a1dc3217 100644 --- a/src/fsharp/vs/Symbols.fs +++ b/src/fsharp/vs/Symbols.fs @@ -9,6 +9,9 @@ open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.AttributeChecking +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.CompileOps @@ -502,7 +505,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member __.Attributes = if isUnresolved() then makeReadOnlyCollection[] else - AttributeChecking.GetAttribInfosOfEntity cenv.g cenv.amap range0 entity + GetAttribInfosOfEntity cenv.g cenv.amap range0 entity |> List.map (fun a -> FSharpAttribute(cenv, a)) |> makeReadOnlyCollection @@ -799,7 +802,7 @@ and FSharpAccessibility(a:Accessibility, ?isProtected) = override x.ToString() = stringOfAccess a -and [] FSharpAccessibilityRights(thisCcu: CcuThunk, ad:Infos.AccessorDomain) = +and [] FSharpAccessibilityRights(thisCcu: CcuThunk, ad:AccessorDomain) = member internal __.ThisCcu = thisCcu member internal __.Contents = ad @@ -1621,11 +1624,11 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let m = range0 match d with | E einfo -> - AttributeChecking.GetAttribInfosOfEvent cenv.amap m einfo |> List.map (fun a -> FSharpAttribute(cenv, a)) + GetAttribInfosOfEvent cenv.amap m einfo |> List.map (fun a -> FSharpAttribute(cenv, a)) | P pinfo -> - AttributeChecking.GetAttribInfosOfProp cenv.amap m pinfo |> List.map (fun a -> FSharpAttribute(cenv, a)) + GetAttribInfosOfProp cenv.amap m pinfo |> List.map (fun a -> FSharpAttribute(cenv, a)) | M minfo -> - AttributeChecking.GetAttribInfosOfMethod cenv.amap m minfo |> List.map (fun a -> FSharpAttribute(cenv, a)) + GetAttribInfosOfMethod cenv.amap m minfo |> List.map (fun a -> FSharpAttribute(cenv, a)) | V v -> v.Attribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) |> makeReadOnlyCollection diff --git a/src/fsharp/vs/Symbols.fsi b/src/fsharp/vs/Symbols.fsi index 6e9f9400448..86b13d3df24 100644 --- a/src/fsharp/vs/Symbols.fsi +++ b/src/fsharp/vs/Symbols.fsi @@ -13,10 +13,11 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices open System.Collections.Generic open Microsoft.FSharp.Compiler -open Microsoft.FSharp.Compiler.TcGlobals -open Microsoft.FSharp.Compiler.Tast -open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.AccessibilityLogic open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.Tast +open Microsoft.FSharp.Compiler.TcGlobals module internal Impl = type internal cenv = @@ -420,8 +421,8 @@ and [] internal FSharpField = /// Represents the rights of a compilation to access symbols and [] internal FSharpAccessibilityRights = - internal new : CcuThunk * Infos.AccessorDomain -> FSharpAccessibilityRights - member internal Contents : Infos.AccessorDomain + internal new : CcuThunk * AccessorDomain -> FSharpAccessibilityRights + member internal Contents : AccessorDomain /// Indicates the accessibility of a symbol, as seen by the F# language and [] internal FSharpAccessibility = diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index e96d691a20c..90f0c9d827c 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -15,32 +15,36 @@ open System.Collections.Generic open Microsoft.FSharp.Core.Printf open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL +open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library + +open Microsoft.FSharp.Compiler.AccessibilityLogic +open Microsoft.FSharp.Compiler.Ast +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.MSBuildResolver -open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics open Microsoft.FSharp.Compiler.PrettyNaming - -open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Parser open Microsoft.FSharp.Compiler.Range -open Microsoft.FSharp.Compiler.Ast -open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Lexhelp -open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.Layout open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.Tastops.DebugPrint -open Microsoft.FSharp.Compiler.Lib -open Microsoft.FSharp.Compiler.AbstractIL.IL -open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.TypeChecker +open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Infos +open Microsoft.FSharp.Compiler.InfoReader open Microsoft.FSharp.Compiler.NameResolution +open Microsoft.FSharp.Compiler.TypeChecker + open Internal.Utilities.Collections open Internal.Utilities.Debug open Internal.Utilities open Internal.Utilities.StructuredFormat + open Microsoft.FSharp.Compiler.SourceCodeServices.ItemDescriptionsImpl [] diff --git a/src/update.cmd b/src/update.cmd index ceb4462f4c9..366619821c2 100644 --- a/src/update.cmd +++ b/src/update.cmd @@ -8,15 +8,11 @@ setlocal if /i "%1" == "debug" goto :ok if /i "%1" == "release" goto :ok -if /i "%1" == "vsdebug" goto :ok -if /i "%1" == "vsrelease" goto :ok echo adding required strong name verification skipping, and NGening built binaries echo Usage: echo update.cmd debug [-ngen] echo update.cmd release [-ngen] -echo update.cmd vsdebug [-ngen] -echo update.cmd vsrelease [-ngen] exit /b 1 :ok diff --git a/tests/RunTests.cmd b/tests/RunTests.cmd index 140fbd34de3..1c634fad0e7 100644 --- a/tests/RunTests.cmd +++ b/tests/RunTests.cmd @@ -60,7 +60,7 @@ set HOSTED_COMPILER=1 rem path to fsc.exe which will be used by tests set FSCBINPATH=%~dp0..\%FLAVOR%\net40\bin -ECHO FSCBINPATH% +ECHO %FSCBINPATH% rem folder where test logs/results will be dropped set RESULTSDIR=%~dp0TestResults diff --git a/tests/fsharp/FSharp.Tests.fsproj b/tests/fsharp/FSharp.Tests.fsproj index cc09622d025..9fb41bcc3cf 100644 --- a/tests/fsharp/FSharp.Tests.fsproj +++ b/tests/fsharp/FSharp.Tests.fsproj @@ -67,6 +67,7 @@ + diff --git a/tests/fsharp/FSharpTestSuiteAsserts.fs b/tests/fsharp/FSharpTestSuiteAsserts.fs new file mode 100644 index 00000000000..f862421f6cd --- /dev/null +++ b/tests/fsharp/FSharpTestSuiteAsserts.fs @@ -0,0 +1,22 @@ +module FSharpTestSuiteAsserts + +open PlatformHelpers +open FSharpTestSuiteTypes + +let requireVSUltimate cfg = attempt { + do! match cfg.INSTALL_SKU with + | Some (Ultimate) -> Success + | x -> + // IF /I "%INSTALL_SKU%" NEQ "ULTIMATE" ( + // echo Test not supported except on Ultimate + NUnitConf.skip (sprintf "Test not supported except on Ultimate, was %A" x) + // exit /b 0 + // ) + } + +let requireENCulture () = attempt { + do! match System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName with + | "en" -> Success + | c -> + NUnitConf.skip (sprintf "Test not supported except en Culture, was %s" c) + } diff --git a/tests/fsharp/core/.gitignore b/tests/fsharp/core/.gitignore index 34c12b24af2..71c2b74eda1 100644 --- a/tests/fsharp/core/.gitignore +++ b/tests/fsharp/core/.gitignore @@ -56,3 +56,11 @@ fsi-reload/load1.exe fsi-reload/load2.exe quotesInMultipleModules/module2-staticlink.exe + +load-script/out.stderr.txt +load-script/out.stdout.txt + +members/basics/tmptest.exe +members/basics/tmptest.fs +members/basics/tmptest.fsi +members/basics/tmptest1.exe diff --git a/tests/fsharp/core/control/test.fsx b/tests/fsharp/core/control/test.fsx index 0ef8971a32c..25da1fff98a 100644 --- a/tests/fsharp/core/control/test.fsx +++ b/tests/fsharp/core/control/test.fsx @@ -1844,6 +1844,8 @@ module CheckNoPumpingBecauseWeTrampolineSynchronousCode = Application.Exit() } |> Async.StartImmediate) + form.WindowState <- FormWindowState.Minimized + form.ShowInTaskbar <- false Application.Run form // Set the synchronization context back to its original value System.Threading.SynchronizationContext.SetSynchronizationContext(null); diff --git a/tests/fsharp/core/fsi-shadowcopy/test1.fsx b/tests/fsharp/core/fsi-shadowcopy/test1.fsx index 6b1f4c531ba..3e34e651775 100644 --- a/tests/fsharp/core/fsi-shadowcopy/test1.fsx +++ b/tests/fsharp/core/fsi-shadowcopy/test1.fsx @@ -5,7 +5,10 @@ open System;; open System.Diagnostics;; let compiled wait = - let c = Process.Start(Environment.GetEnvironmentVariable("FSC"), "Library1.fs --target:library") + let psi = ProcessStartInfo(Environment.GetEnvironmentVariable("FSC"), "Library1.fs --target:library") + psi.CreateNoWindow <- true + psi.UseShellExecute <- false + let c = Process.Start(psi) c.WaitForExit(wait) |> ignore if c.ExitCode = 0 then true else false;; diff --git a/tests/fsharp/core/fsi-shadowcopy/test2.fsx b/tests/fsharp/core/fsi-shadowcopy/test2.fsx index 1da068cbefd..34da503c636 100644 --- a/tests/fsharp/core/fsi-shadowcopy/test2.fsx +++ b/tests/fsharp/core/fsi-shadowcopy/test2.fsx @@ -5,7 +5,10 @@ open System;; open System.Diagnostics;; let compiled wait = - let c = Process.Start(Environment.GetEnvironmentVariable("FSC"), "Library1.fs --target:library") + let psi = ProcessStartInfo(Environment.GetEnvironmentVariable("FSC"), "Library1.fs --target:library") + psi.CreateNoWindow <- true + psi.UseShellExecute <- false + let c = Process.Start(psi) c.WaitForExit(wait) |> ignore if c.ExitCode = 0 then true else false;; diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 502b941e219..c51f82cd296 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -7,20 +7,10 @@ open NUnit.Framework open NUnitConf open PlatformHelpers open FSharpTestSuiteTypes +open FSharpTestSuiteAsserts let testContext = FSharpTestSuite.testContext -let requireVSUltimate cfg = attempt { - do! match cfg.INSTALL_SKU with - | Some (Ultimate) -> Success - | x -> - // IF /I "%INSTALL_SKU%" NEQ "ULTIMATE" ( - // echo Test not supported except on Ultimate - NUnitConf.skip (sprintf "Test not supported except on Ultimate, was %A" x) - // exit /b 0 - // ) - } - module Access = [] let access p = check (attempt { @@ -667,7 +657,6 @@ module Printing = // if NOT EXIST z.output.test.200.bsl COPY z.output.test.200.txt z.output.test.200.bsl // %PRDIFF% z.output.test.200.txt z.output.test.200.bsl > z.output.test.200.diff [] - [] //not enough [] [] [] @@ -676,6 +665,8 @@ module Printing = let printing flag diffFileOut expectedFileOut diffFileErr expectedFileErr = check (attempt { let { Directory = dir; Config = cfg } = testContext () + do! requireENCulture () + let exec p = Command.exec dir cfg.EnvironmentVariables { Output = Inherit; Input = None; } p >> checkResult let peverify = Commands.peverify exec cfg.PEVERIFY "/nologo" let copy from' = Commands.copy_y dir from' >> checkResult diff --git a/tests/fsharp/project.json b/tests/fsharp/project.json index 593a76fd005..afb8dcafab1 100644 --- a/tests/fsharp/project.json +++ b/tests/fsharp/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1-rc2-23911", "NETStandard.Library": "1.5.0-rc2-23911", - "Microsoft.NETCore.Runtime.CoreCLR": "1.0.1-rc2-23911", + "Microsoft.NETCore.Runtime.CoreCLR": "1.0.2-rc2-23911", "Microsoft.NETCore.TestHost": "1.0.0-rc2-23911", "Microsoft.NETCore.ConsoleHost": "1.0.0-rc2-23911", "System.Collections.Immutable":"1.2.0-rc2-23911", @@ -18,7 +18,7 @@ "System.Security.Cryptography.Algorithms": "4.1.0-rc2-23911", "System.Security.Cryptography.Primitives": "4.0.0-rc2-23911", "System.Threading.Thread": "4.0.0-rc2-23911", - "System.Threading.ThreadPool": "4.0.10-rc2-23911", + "System.Threading.ThreadPool": "4.0.10-rc2-23911" }, "runtimes": { "win7-x86": { }, diff --git a/tests/fsharp/regression/656/run.bat b/tests/fsharp/regression/656/run.bat deleted file mode 100644 index 672c716c37d..00000000000 --- a/tests/fsharp/regression/656/run.bat +++ /dev/null @@ -1,33 +0,0 @@ -@if "%_echo%"=="" echo off - -setlocal -dir build.ok > NUL ) || ( - @echo 'build.ok' not found. - goto :ERROR -) - -call %~d0%~p0..\..\..\config.bat - - if exist test.ok (del /f /q test.ok) - %CLIX% pack%ILX_CONFIG%.exe - if NOT EXIST test.ok goto SetError - -:Ok -echo Ran fsharp %~f0 ok. -endlocal -exit /b 0 - -:Skip -echo Skipped %~f0 -endlocal -exit /b 0 - - -:Error -echo Test Script Failed (perhaps test did not emit test.ok signal file?) -endlocal -exit /b %ERRORLEVEL% - -:SetError -set NonexistentErrorLevel 2> nul -goto Error diff --git a/tests/fsharp/regression/tests_regression.fs b/tests/fsharp/regression/tests_regression.fs index d575128164c..a68cb384623 100644 --- a/tests/fsharp/regression/tests_regression.fs +++ b/tests/fsharp/regression/tests_regression.fs @@ -98,28 +98,11 @@ module ``656`` = do! peverify "pack.exe" } - let run cfg dir = attempt { - - let exec p = Command.exec dir cfg.EnvironmentVariables { Output = Inherit; Input = None; } p >> checkResult - let fileguard = (Commands.getfullpath dir) >> FileGuard.create - - // if exist test.ok (del /f /q test.ok) - use testOkFile = fileguard "test.ok" - - // %CLIX% pack.exe - do! exec ("."/"pack.exe") "" - - // if NOT EXIST test.ok goto SetError - do! testOkFile |> NUnitConf.checkGuardExists - } - [] let ``656`` () = check (attempt { let { Directory = dir; Config = cfg } = testContext () do! build cfg dir - - do! run cfg dir }) diff --git a/tests/fsharp/typeProviders/tests_typeProviders.fs b/tests/fsharp/typeProviders/tests_typeProviders.fs index 119f827a0df..40b4e2d6b81 100644 --- a/tests/fsharp/typeProviders/tests_typeProviders.fs +++ b/tests/fsharp/typeProviders/tests_typeProviders.fs @@ -7,20 +7,10 @@ open NUnit.Framework open FSharpTestSuiteTypes open NUnitConf open PlatformHelpers +open FSharpTestSuiteAsserts let testContext = FSharpTestSuite.testContext -let requireVSUltimate cfg = attempt { - do! match cfg.INSTALL_SKU with - | Some (Ultimate) -> Success - | x -> - // IF /I "%INSTALL_SKU%" NEQ "ULTIMATE" ( - // echo Test not supported except on Ultimate - NUnitConf.skip (sprintf "Test not supported except on Ultimate, was %A" x) - // exit /b 0 - // ) - } - module DiamondAssembly = let build cfg dir = attempt { @@ -361,6 +351,8 @@ module NegTests = let negTests name = check (attempt { let { Directory = dir; Config = cfg } = testContext () + do! requireENCulture () + let exec p = Command.exec dir cfg.EnvironmentVariables { Output = Inherit; Input = None; } p >> checkResult let fsc = Commands.fsc exec cfg.FSC let del = Commands.rm dir diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/CallIntrinsics.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/CallIntrinsics.il.netfx4.bsl similarity index 100% rename from tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/CallIntrinsics.il.bsl rename to tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/CallIntrinsics.il.netfx4.bsl diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/env.lst index 71cd4d55470..8cb36bef519 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TypeProviders/env.lst @@ -1 +1 @@ -Expensive,NoCrossVer SOURCE=CallIntrinsics.fsx PRECMD="\$FSC_PIPE -a --nowarn:1204,40,1203,26 provider.fsx" SCFLAGS="-r:provider.dll -a -g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd CallIntrinsics.dll" # CallIntrinsics.fsx +Expensive,NoCrossVer SOURCE=CallIntrinsics.fsx PRECMD="\$FSC_PIPE -a --nowarn:1204,40,1203,26 provider.fsx" SCFLAGS="-r:provider.dll -a -g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd CallIntrinsics.dll NetFx40" # CallIntrinsics.fsx diff --git a/tests/fsharpqa/Source/test.lst b/tests/fsharpqa/Source/test.lst index e72df7c3c56..d9120a3e79c 100644 --- a/tests/fsharpqa/Source/test.lst +++ b/tests/fsharpqa/Source/test.lst @@ -27,7 +27,7 @@ CodeGen01,NoMT,CodeGen CodeGen\EmittedIL\SteppingMatch CodeGen01,NoMT,CodeGen CodeGen\EmittedIL\TailCalls CodeGen01,NoMT,CodeGen CodeGen\EmittedIL\TestFunctions CodeGen01,NoMT,CodeGen CodeGen\EmittedIL\Tuples -NoHostedCompiler,CodeGen01,NoMT CodeGen\EmittedIL\TypeProviders +NoHostedCompiler,CodeGen01,NoMT,EmittedIL_TypeProviders CodeGen\EmittedIL\TypeProviders CodeGen01,NoMT,CodeGen CodeGen\StringEncoding CodeGen01,NoMT,CodeGen CodeGen\Structure diff --git a/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj b/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj index b84850c4f94..f7e0b484202 100644 --- a/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj +++ b/vsintegration/deployment/EnableOpenSource/EnableOpenSource.csproj @@ -50,14 +50,14 @@ False True - + Program $(DevEnvDir)devenv.exe /rootsuffix FSharp /log FSharp true - + Program $(DevEnvDir)devenv.exe /rootsuffix FSharp /log diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index baab1d9b51f..753edb01480 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -1353,7 +1353,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. result // Fulfill HostObject contract with Fsc task, and enable 'capture' of compiler flags for the project. - member x.Compile(compile:System.Converter, flags:string[], sources:string[]) = + member x.Compile(compile:Func, flags:string[], sources:string[]) = // Note: This method may be called from non-UI thread! The Fsc task in FSharp.Build.dll invokes this method via reflection, and // the Fsc task is typically created by MSBuild on a background thread. So be careful. #if DEBUG @@ -1370,7 +1370,7 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. // This is the first time, so set up interface for language service to talk to us projectSite.Open(x.CreateRunningProjectSite()) if actuallyBuild then - compile.Invoke(0) + compile.Invoke() else 0 @@ -1990,32 +1990,32 @@ See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. | ApplicationDefinition = 4 | Page = 5 | Resource = 6 - + and public FSharpBuildActionPropertyDescriptor internal (prop : PropertyDescriptor) = inherit PropertyDescriptor(prop) - + override this.DisplayName = SR.BuildAction - + override this.ComponentType = typeof - + override this.PropertyType = typeof - + override this.IsReadOnly = false - + override this.GetEditor(editorBaseType : Type) = this.CreateInstance(editorBaseType) - + override this.Converter = null - + override this.CanResetValue(o : obj) = prop.CanResetValue(o) - + override this.GetValue (o : obj) = prop.GetValue(o) - + override this.SetValue (o : obj, value : obj) = prop.SetValue(o, value) - + override this.ResetValue (o : obj) = prop.ResetValue(o) - + override this.ShouldSerializeValue(o : obj) = prop.ShouldSerializeValue(o) and diff --git a/vsintegration/src/fsharp.common.props b/vsintegration/src/fsharp.common.props index 416175402a0..48c922d9577 100644 --- a/vsintegration/src/fsharp.common.props +++ b/vsintegration/src/fsharp.common.props @@ -14,11 +14,11 @@ ..\.. net40 - + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin - + true full false diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index 1a50ad15b4d..4b7b87019ea 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -44,13 +44,13 @@ module internal Salsa = { new System.IDisposable with member this.Dispose() = actuallyBuild <- true } member th.Results = capturedFlags, capturedSources - member th.Compile(compile:System.Converter, flags:string[], sources:string[]) = + member th.Compile(compile:Func, flags:string[], sources:string[]) = use t = Trace.Call("MSBuild", "Compile", fun _ -> "Host compile invoke by Fsc task") Trace.PrintLine("MSBuild", fun _ -> sprintf "flags=%A" flags) capturedFlags <- flags capturedSources <- sources if actuallyBuild then - compile.Invoke(0) + compile.Invoke() else 0 interface ITaskHost diff --git a/vsintegration/tests/unittests/Tests.Build.fs b/vsintegration/tests/unittests/Tests.Build.fs index a6a1fd3713e..0c2d32b7df6 100644 --- a/vsintegration/tests/unittests/Tests.Build.fs +++ b/vsintegration/tests/unittests/Tests.Build.fs @@ -41,7 +41,7 @@ type MyLogger(f : string -> unit) = type FauxHostObject() = let mutable myFlags : string[] = null let mutable mySources : string[] = null - member x.Compile(compile:System.Converter, flags:string[], sources:string[]) = + member x.Compile(compile:Func, flags:string[], sources:string[]) = myFlags <- flags mySources <- sources 0 diff --git a/vsintegration/tests/unittests/Tests.ProjectSystem.MultiTargeting.fs b/vsintegration/tests/unittests/Tests.ProjectSystem.MultiTargeting.fs index 9cd81a48d70..0cd5d5815fc 100644 --- a/vsintegration/tests/unittests/Tests.ProjectSystem.MultiTargeting.fs +++ b/vsintegration/tests/unittests/Tests.ProjectSystem.MultiTargeting.fs @@ -30,8 +30,8 @@ type MultiTargeting() = let dirName = Path.GetDirectoryName(projFile) let libDirName = Directory.CreateDirectory(Path.Combine(dirName, "lib")).FullName let codeBase = (new Uri(Assembly.GetExecutingAssembly().EscapedCodeBase)).LocalPath |> Path.GetDirectoryName - let refLibPath = Path.Combine(libDirName, "FSharp.Core.Unittests.dll") - File.Copy(Path.Combine(codeBase, "FSharp.Core.Unittests.dll"), refLibPath) + let refLibPath = Path.Combine(libDirName, "VisualFSharp.Unittests.dll") + File.Copy(Path.Combine(codeBase, "VisualFSharp.Unittests.dll"), refLibPath) File.AppendAllText(projFile, TheTests.FsprojTextWithProjectReferencesAndOtherFlags([], [refLibPath], [], null, "", "v4.0")) refLibPath From 7a68444ebf912ca8a010f4e4a5c0aeadb4002bef Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Sun, 1 May 2016 00:10:31 +0300 Subject: [PATCH 121/334] fix merge --- src/fsharp/MethodCalls.fs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index 43731c50ae2..14c41717483 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -62,15 +62,17 @@ type CalledArg = { Position: (int * int) IsParamArray : bool OptArgInfo : OptionalArgInfo + CallerInfoInfo : CallerInfoInfo IsOutArg: bool ReflArgInfo: ReflectedArgInfo NameOpt: Ident option CalledArgumentType : TType } -let CalledArg(pos,isParamArray,optArgInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = +let CalledArg(pos,isParamArray,optArgInfo,callerInfoInfo,isOutArg,nameOpt,reflArgInfo,calledArgTy) = { Position=pos IsParamArray=isParamArray OptArgInfo =optArgInfo + CallerInfoInfo = callerInfoInfo IsOutArg=isOutArg ReflArgInfo=reflArgInfo NameOpt=nameOpt @@ -198,10 +200,11 @@ type CalledMethArgSet<'T> = let MakeCalledArgs amap m (minfo:MethInfo) minst = // Mark up the arguments with their position, so we can sort them back into order later let paramDatas = minfo.GetParamDatas(amap, m, minst) - paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,nmOpt,reflArgInfo,typeOfCalledArg)) -> + paramDatas |> List.mapiSquared (fun i j (ParamData(isParamArrayArg,isOutArg,optArgInfo,callerInfoFlags,nmOpt,reflArgInfo,typeOfCalledArg)) -> { Position=(i,j) IsParamArray=isParamArrayArg OptArgInfo=optArgInfo + CallerInfoInfo = callerInfoFlags IsOutArg=isOutArg ReflArgInfo=reflArgInfo NameOpt=nmOpt From 7650c850d0cda9a16e94109f2c10aed271e4d434 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 3 May 2016 20:42:14 +0300 Subject: [PATCH 122/334] fix caller member name and add warning when no caller member name --- src/fsharp/FSComp.txt | 1 + src/fsharp/TypeChecker.fs | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 445fdcce777..4dda406d858 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1294,3 +1294,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long" 3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory" 3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" +3198,tcNoCallerMemberName,"There is no caller member name" \ No newline at end of file diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 2276413f89a..1addfb9d54e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9214,8 +9214,13 @@ and TcMethodApplication emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> emptyPreBinder,Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) - | CallerMemberName when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty && env.eCallerMemberName.IsSome -> - emptyPreBinder,Expr.Const(Const.String(env.eCallerMemberName.Value), mMethExpr, currCalledArgTy) + | CallerMemberName when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> + let name = match env.eCallerMemberName with + | Some(name) -> name + | None -> + warning(Error(FSComp.SR.tcNoCallerMemberName(), mMethExpr)) + System.String.Empty + emptyPreBinder,Expr.Const(Const.String(name), mMethExpr, currCalledArgTy) | _ -> emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) @@ -9254,8 +9259,13 @@ and TcMethodApplication | CallerFilePath when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) - | CallerMemberName when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty && env.eCallerMemberName.IsSome -> - let memberNameExpr = Expr.Const(Const.String(env.eCallerMemberName.Value), mMethExpr, calledNonOptTy) + | CallerMemberName when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> + let name = match env.eCallerMemberName with + | Some(name) -> name + | None -> + warning(Error(FSComp.SR.tcNoCallerMemberName(), mMethExpr)) + System.String.Empty + let memberNameExpr = Expr.Const(Const.String(name), mMethExpr, calledNonOptTy) emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[memberNameExpr],mMethExpr) | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) From 445123ec036f6513946340350602e711469cc033 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Tue, 3 May 2016 20:42:50 +0300 Subject: [PATCH 123/334] add tests for caller member name --- .../Imported/CallerInfo/CSharpLib.cs | 9 ++++- .../Imported/CallerInfo/CallerFilePath.fs | 6 +-- .../Imported/CallerInfo/CallerLineNumber.fs | 6 +-- .../Imported/CallerInfo/CallerMemberName.fs | 37 +++++++++++++++++++ .../Imported/CallerInfo/ViaInteractive.fsx | 2 +- .../Imported/CallerInfo/env.lst | 1 + 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs index 44750e38379..627c9b30181 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs @@ -15,10 +15,15 @@ public static string FilePath([CallerFilePath] string filePath = "dummy1") { return filePath; } + + public static string MemberName([CallerMemberName] string memberName = "dummy1") + { + return memberName; + } - public static Tuple AllInfo(int normalArg, [CallerFilePath] string filePath = "dummy2", [CallerLineNumber] int line = 778) + public static Tuple AllInfo(int normalArg, [CallerFilePath] string filePath = "dummy2", [CallerLineNumber] int line = 778, [CallerMemberName] string memberName = "dummy3") { - return new Tuple(filePath, line); + return new Tuple(filePath, line, memberName); } } diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index 1353ac55783..a807e51b4b5 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -49,17 +49,17 @@ module Program = | x -> failwithf "Unexpected: %A" x match CallerInfoTest.AllInfo(21) with - | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x # 345 "qwerty1" match CallerInfoTest.AllInfo(123) with - | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty1" path -> () + | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty1" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x # 456 "qwerty2" match CallerInfoTest.AllInfo(123) with - | (path, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty2" path -> () + | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty2" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs index 665af31c99e..4692802480b 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerLineNumber.fs @@ -23,7 +23,7 @@ module Program = failwith "Unexpected C# CallerLineNumber" match CallerInfoTest.AllInfo(21) with - | (_, 25) -> () + | (_, 25, _) -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x if (typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerInfoAttribute).LineNumber <> 5 then @@ -39,11 +39,11 @@ module Program = # 345 "qwerty" match CallerInfoTest.AllInfo(123) with - | (_, 345) -> () + | (_, 345, _) -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x # 456 "qwerty" match CallerInfoTest.AllInfo(123) with - | (_, 456) -> () + | (_, 456, _) -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs new file mode 100644 index 00000000000..5854c470412 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -0,0 +1,37 @@ +namespace Test + +open System.Runtime.CompilerServices +open CSharpLib + +type MyTy() = + static member GetCallerMemberName([] ?memberName : string) = + memberName + +module Program = + [] + let main (_:string[]) = + if MyTy.GetCallerMemberName() <> Some("main") then + failwith "Unexpected F# CallerMemberName" + + if MyTy.GetCallerMemberName("foo") <> Some("foo") then + failwith "Unexpected F# CallerMemberName" + + if CallerInfoTest.MemberName() <> "main" then + failwith "Unexpected C# CallerMemberName" + + if CallerInfoTest.MemberName("foo") <> "foo" then + failwith "Unexpected C# CallerMemberName" + + match CallerInfoTest.AllInfo(21) with + | (_, _, "main") -> () + | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x + + let getCallerLineNumber = CallerInfoTest.MemberName + + if () |> CallerInfoTest.MemberName <> "main" then + failwith "Unexpected C# CallerLineNumber" + + if getCallerLineNumber () <> "getCallerLineNumber" then + failwith "Unexpected C# CallerLineNumber" + + 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx index 4e8821372b9..2357128cabf 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx @@ -24,7 +24,7 @@ if MyTy.GetCallerLineNumber() <> Some(23) then failwith "Unexpected F# CallerLineNumber" match CallerInfoTest.AllInfo(21) with -| (path, 26) when matchesPath checkPath path -> () +| (path, 26, "") when matchesPath checkPath path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x #q \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index db596ffae40..72380e030b9 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -1,5 +1,6 @@ SOURCE=CallerLineNumber.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerLineNumber.fs SOURCE=CallerFilePath.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerFilePath.fs + SOURCE=CallerMemberName.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerMemberName.fs SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs SOURCE=E_MultipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MultipleAttrs.fs From bcd02f7d0f1a4c5c55e29ca0c73b5dbeddf0e289 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 3 May 2016 17:07:53 -0700 Subject: [PATCH 124/334] Moved F# language service to code attributes --- .../RegisterFsharpPackage.pkgdef | 18 ---------------- .../FSharpLanguageService.fs | 2 ++ .../FSharp.LanguageService/FSharpPackage.fs | 18 +++++++++++++++- .../FSharp.ProjectSystem.FSharp/Project.fs | 21 +------------------ 4 files changed, 20 insertions(+), 39 deletions(-) diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef index aeedcb9c730..41f001ffb5a 100644 --- a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -23,24 +23,6 @@ ".ml"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" ".mli"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -[$RootKey$\Languages\Language Services\F#] -"Package"="{871d2a70-12a2-4e42-9440-425dd92a4116}" -"LangResID"="100" -"MatchBracesAtCaret"="1" -"ShowCompletion"="1" -"CodeSenseDelay"="100" -"ShowMatchingBrace"="1" -"MatchBraces"="1" -"EnableAsyncCompletion"="1" -"QuickInfo"="1" -"DefaultToInsertSpaces"="1" -"CodeSense"="1" -"Default to Non Hot URLs"="1" -"EnableCommenting"="1" -"ShowSmartIndent"="1" -"ShowBraceCompletion"="1" -@="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" - [$RootKey$\Services\{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}] "Name"="F#" @="{871d2a70-12a2-4e42-9440-425dd92a4116}" diff --git a/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs b/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs index 54b2110fbd5..7cbf383230e 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs +++ b/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs @@ -28,9 +28,11 @@ module internal FSharpCommonConstants = module internal FSharpConstants = + [] let fsharpLanguageName = "F#" // These are the IDs from fslangservice.dll + [] let packageGuidString = "871D2A70-12A2-4e42-9440-425DD92A4116" [] let languageServiceGuidString = FSharpCommonConstants.languageServiceGuidString diff --git a/vsintegration/src/FSharp.LanguageService/FSharpPackage.fs b/vsintegration/src/FSharp.LanguageService/FSharpPackage.fs index fb61e0e854a..bcede51e0cf 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharpPackage.fs +++ b/vsintegration/src/FSharp.LanguageService/FSharpPackage.fs @@ -8,6 +8,7 @@ open System.ComponentModel.Design open System.Runtime.InteropServices open Microsoft.VisualStudio open Microsoft.VisualStudio.Shell +open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.OLE.Interop @@ -16,7 +17,22 @@ open Microsoft.VisualStudio.OLE.Interop [] type internal SVsSettingsPersistenceManager = class end -[] +[] +[, + strLanguageName = FSharpConstants.fsharpLanguageName, + languageResourceID = 100, + MatchBraces = true, + MatchBracesAtCaret = true, + ShowCompletion = true, + ShowMatchingBrace = true, + ShowSmartIndent = true, + EnableAsyncCompletion = true, + QuickInfo = true, + DefaultToInsertSpaces = true, + CodeSense = true, + DefaultToNonHotURLs = true, + EnableCommenting = true, + CodeSenseDelay = 100)>] type internal FSharpPackage() as self = inherit Package() diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs index baab1d9b51f..c817ed92784 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Project.fs @@ -167,27 +167,8 @@ namespace Microsoft.VisualStudio.FSharp.ProjectSystem // FSharpProjectFactory // .... - type (* start of very large set of mutually recursive OO types *) - -(* -See also ...\SetupAuthoring\FSharp\Registry\FSProjSys_Registration.wxs, e.g. - - - - - - - - - - - - - -*) + type [, - (* NOTE: search for FSHARP-TOOLS-INTERACTIVE-LINK *) - (* NOTE: the cat/sub-cat names appear in an error message in sessions.ml, fix up any changes there *) "F# Tools", "F# Interactive", // category/sub-category on Tools>Options... 6000s, 6001s, // resource id for localisation of the above true)>] // true = supports automation From b0689b2534944ca7c3234ddee1e204489de2a4d3 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 3 May 2016 17:47:21 -0700 Subject: [PATCH 125/334] Added file extensions to code attributes --- .../RegisterFsharpPackage.pkgdef | 16 ---------------- .../FSharpLanguageService.fs | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef index 41f001ffb5a..f1c59dcff6d 100644 --- a/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef +++ b/vsintegration/VisualFSharpVsix/RegisterFsharpPackage.pkgdef @@ -7,22 +7,6 @@ ".fsx"="VisualStudio.fsx.15.0" ".fsproj"="VisualStudio.Launcher.fsproj.15.0" -[$RootKey$\Editors\{8B382828-6202-11d1-8870-0000F87579D2}\Extensions] -"fs"="97" -"fsi"="97" -"fsscript"="97" -"fsx"="97" -"ml"="97" -"mli"="97" - -[$RootKey$\Languages\File Extensions] -".fs"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -".fsi"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -".fsscript"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -".fsx"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -".ml"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" -".mli"="{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}" - [$RootKey$\Services\{bc6dd5a5-d4d6-4dab-a00d-a51242dbaf1b}] "Name"="F#" @="{871d2a70-12a2-4e42-9440-425dd92a4116}" diff --git a/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs b/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs index 7cbf383230e..b600690644f 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs +++ b/vsintegration/src/FSharp.LanguageService/FSharpLanguageService.fs @@ -314,6 +314,21 @@ type internal FSharpViewFilter(mgr:CodeWindowManager,view:IVsTextView) = [] + +[, ".fs")>] +[, ".fsi")>] +[, ".fsx")>] +[, ".fsscript")>] +[, ".ml")>] +[, ".mli")>] + +[] +[] +[] +[] +[] +[] + type internal FSharpLanguageService() as fls = inherit LanguageService() From 8297fb29c2b2a1da28618d1e68723270ee489d52 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 5 May 2016 12:38:18 -0700 Subject: [PATCH 126/334] Remove TypeProviders item templates --- .../ODataServiceConnection.csproj | 42 ------------------- .../SqlDataConnection.csproj | 42 ------------------- .../SqlEntityConnection.csproj | 42 ------------------- .../WsdlServiceConnection.csproj | 42 ------------------- .../Source.extension.vsixmanifest | 4 -- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 28 ------------- ...rp-vsintegration-item-templates-build.proj | 4 -- 7 files changed, 204 deletions(-) delete mode 100644 vsintegration/ItemTemplates/ODataServiceConnection/ODataServiceConnection.csproj delete mode 100644 vsintegration/ItemTemplates/SqlDataConnection/SqlDataConnection.csproj delete mode 100644 vsintegration/ItemTemplates/SqlEntityConnection/SqlEntityConnection.csproj delete mode 100644 vsintegration/ItemTemplates/WsdlServiceConnection/WsdlServiceConnection.csproj diff --git a/vsintegration/ItemTemplates/ODataServiceConnection/ODataServiceConnection.csproj b/vsintegration/ItemTemplates/ODataServiceConnection/ODataServiceConnection.csproj deleted file mode 100644 index 874f8fb662d..00000000000 --- a/vsintegration/ItemTemplates/ODataServiceConnection/ODataServiceConnection.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Library - $(NoWarn);2008 - false - false - true - false - None - - - ..\..\..\src - {17716af4-d439-4c74-8326-475fb1847df2} - ItemTemplates - ODataServiceConnection - true - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\ODataServiceConnection.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\ODataServiceConnection.fs.lci - false - false - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/SqlDataConnection/SqlDataConnection.csproj b/vsintegration/ItemTemplates/SqlDataConnection/SqlDataConnection.csproj deleted file mode 100644 index d10d26c6271..00000000000 --- a/vsintegration/ItemTemplates/SqlDataConnection/SqlDataConnection.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Library - $(NoWarn);2008 - false - false - true - false - None - - - ..\..\..\src - {35e83edf-cc5a-441d-8949-17aacc463ca4} - ItemTemplates - SqlDataConnection - true - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\SqlDataConnection.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\SqlDataConnection.fs.lci - false - false - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/SqlEntityConnection/SqlEntityConnection.csproj b/vsintegration/ItemTemplates/SqlEntityConnection/SqlEntityConnection.csproj deleted file mode 100644 index 40f93c24f82..00000000000 --- a/vsintegration/ItemTemplates/SqlEntityConnection/SqlEntityConnection.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Library - $(NoWarn);2008 - false - false - true - false - None - - - ..\..\..\src - {a2cda945-ef31-4c37-a063-bd1e2b3938eb} - ItemTemplates - SqlEntityConnection - true - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\SqlEntityConnection.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\SqlEntityConnection.fs.lci - false - false - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/WsdlServiceConnection/WsdlServiceConnection.csproj b/vsintegration/ItemTemplates/WsdlServiceConnection/WsdlServiceConnection.csproj deleted file mode 100644 index c8b70f81d14..00000000000 --- a/vsintegration/ItemTemplates/WsdlServiceConnection/WsdlServiceConnection.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Library - $(NoWarn);2008 - false - false - true - false - None - - - ..\..\..\src - {7fdf9571-b7df-4f09-bd5e-12bddf4fa520} - ItemTemplates - WsdlServiceConnection - true - - - - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\WsdlServiceConnection.fs.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\WsdlServiceConnection.fs.lci - false - false - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index b2de135809b..c67f85f5bd8 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -32,13 +32,9 @@ - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index b5372b5ee8a..5f0a3613593 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -157,13 +157,6 @@ false TemplateProjectOutputGroup%3b - - {17716AF4-D439-4C74-8326-475FB1847DF2} - ODataServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - {A333B85A-DC23-49B6-9797-B89A7951E92D} ScriptFile @@ -178,20 +171,6 @@ false TemplateProjectOutputGroup%3b - - {35E83EDF-CC5A-441D-8949-17AACC463CA4} - SqlDataConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - - - {A2CDA945-EF31-4C37-A063-BD1E2B3938EB} - SqlEntityConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - {D11FC318-8F5D-4C8C-9287-AB40A016D13C} TextFile @@ -199,13 +178,6 @@ false TemplateProjectOutputGroup%3b - - {7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} - WsdlServiceConnection - ItemTemplates - false - TemplateProjectOutputGroup%3b - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} XMLFile diff --git a/vsintegration/fsharp-vsintegration-item-templates-build.proj b/vsintegration/fsharp-vsintegration-item-templates-build.proj index 02be2f2e58a..7ccfbc8c296 100644 --- a/vsintegration/fsharp-vsintegration-item-templates-build.proj +++ b/vsintegration/fsharp-vsintegration-item-templates-build.proj @@ -7,13 +7,9 @@ - - - - From 64f7d96322bc942ad7aefd71549861ebf9b0f509 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 5 May 2016 16:11:25 -0700 Subject: [PATCH 127/334] Added NetCore259Project to vsix --- src/Microbuild.Settings.targets | 9 +++++--- .../FSharp.LanguageService.Compiler.fsproj | 1 + .../NetCore259Project.csproj | 2 -- .../Source.extension.vsixmanifest | 2 +- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 10 ++++++--- .../manifest/templateManifest0.noloc.vstman | 21 +++++++++++++++++++ .../fsharp-vsintegration-vsix-build.proj | 17 ++++++++++++--- 7 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman diff --git a/src/Microbuild.Settings.targets b/src/Microbuild.Settings.targets index 3b8a37cca01..7383b4f35ae 100644 --- a/src/Microbuild.Settings.targets +++ b/src/Microbuild.Settings.targets @@ -163,15 +163,18 @@ - + + + ENU + + + LocLanguages="$(Languages)" /> diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index 733da453365..7272e01b5a3 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -28,6 +28,7 @@ true true true + v4.6 diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index f22fa9187fe..686edfbb897 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index c67f85f5bd8..f5a06f9d019 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -25,7 +25,6 @@ - @@ -36,5 +35,6 @@ + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 5f0a3613593..9ebaddfd4e1 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -43,8 +43,10 @@ Properties FSharp true + 14.0 False True + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} Program @@ -65,16 +67,19 @@ 15.4.1.0 cs 14.0 - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} + + Always + true + Designer Always true - RegisterFsharpPackage.pkgdef + RegisterFsharpPackage.pkgdef @@ -218,7 +223,6 @@ NetCore259Project ProjectTemplates false - TemplateProjectOutputGroup%3b {DB374A0C-7560-479F-9B21-D37C81F7624F} diff --git a/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman b/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman new file mode 100644 index 00000000000..432a48c60b8 --- /dev/null +++ b/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman @@ -0,0 +1,21 @@ + + + NetCore259Project\NetCore259Project + NETCore259PortableLibrary.vstemplate + + + + + + Microsoft.FSharp.NETCore259PortableLibrary + FSharp + 4.5 + 1 + true + PortableLibrary + true + true + + + + \ No newline at end of file diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index 99f456f9f7b..fc1fa57e940 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -5,9 +5,20 @@ - + + + + + + + + + + - + + + + - From c5e88dee83a211aa0e417f69f0f3d78bad130636 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 6 May 2016 11:49:35 -0700 Subject: [PATCH 128/334] Added other project templates/item templates to vsix --- .../ItemTemplates/AppConfig/AppConfig.csproj | 1 - .../ItemTemplates/CodeFile/CodeFile.csproj | 2 - .../ScriptFile/ScriptFile.csproj | 2 - .../SignatureFile/SignatureFile.csproj | 2 - .../ItemTemplates/TextFile/TextFile.csproj | 2 - .../ItemTemplates/XMLFile/XMLFile.csproj | 2 - .../ConsoleProject/ConsoleProject.csproj | 2 - .../LibraryProject/LibraryProject.csproj | 2 - .../NetCore78Project/NetCore78Project.csproj | 2 - .../NetCoreProject/NetCoreProject.csproj | 2 - .../PortableLibraryProject.csproj | 2 - .../SilverlightProject.csproj | 2 - .../TutorialProject/TutorialProject.csproj | 2 - .../Source.extension.vsixmanifest | 29 +++--- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 97 +++++++++++++------ .../manifest/templateManifest0.noloc.vstman | 21 ---- 16 files changed, 86 insertions(+), 86 deletions(-) delete mode 100644 vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman diff --git a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj index eb988028ea7..3291c931d36 100644 --- a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj +++ b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj @@ -29,5 +29,4 @@ - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index 3d5e86e9cf7..1878943a362 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -29,6 +29,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index 67038452d5a..81f19113812 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -29,6 +29,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index 71c2c4b2c49..1768ada4162 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -29,6 +29,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index 237a0c863f9..a3ff9ad0849 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -29,6 +29,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index eef81385701..ab0e9c4faa3 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -29,6 +29,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index 38a9c2647fa..1dcfa606324 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index 7cfbafee8a3..7cf51d301c8 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index d10aa78cda4..962f4f8df36 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 84032598e75..888ef4ada76 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 64350513dd6..47fb1eab272 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index b6a0b5542b2..2fa165570a2 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -46,6 +46,4 @@ - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 92055b683e8..2dfc1492bb2 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -38,6 +38,4 @@ - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index f5a06f9d019..1aee2c892ed 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -14,6 +14,7 @@ + @@ -22,19 +23,21 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 9ebaddfd4e1..d1541abeb46 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -69,10 +69,80 @@ 14.0 + + Always + true + ProjectTemplates\SilverlightProject.zip + + + Always + true + ProjectTemplates\NetCoreProject.zip + + + Always + true + ProjectTemplates\NetCore78Project.zip + Always true + ProjectTemplates\NetCore259Project.zip + + + Always + true + ProjectTemplates\PortableLibraryProject.zip + + + Always + true + ProjectTemplates\TutorialProject.zip + + Always + true + ProjectTemplates\ConsoleProject.zip + + + Always + true + ProjectTemplates\LibraryProject.zip + + + + + Always + true + ItemTemplates\AppConfig.zip + + + Always + true + ItemTemplates\CodeFile.zip + + + Always + true + ItemTemplates\ScriptFile.zip + + + Always + true + ItemTemplates\SignatureFile.zip + + + Always + true + ItemTemplates\TextFile.zip + + + Always + true + ItemTemplates\XMLFile.zip + + + Designer @@ -151,99 +221,72 @@ {6BA13AA4-C25F-480F-856B-8E8000299A72} AppConfig - ItemTemplates false - TemplateProjectOutputGroup%3b {12AC2813-E895-4AAA-AE6C-94E21DA09F64} CodeFile - ItemTemplates false - TemplateProjectOutputGroup%3b {A333B85A-DC23-49B6-9797-B89A7951E92D} ScriptFile - ItemTemplates false - TemplateProjectOutputGroup%3b {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} SignatureFile - ItemTemplates false - TemplateProjectOutputGroup%3b {D11FC318-8F5D-4C8C-9287-AB40A016D13C} TextFile - ItemTemplates false - TemplateProjectOutputGroup%3b {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} XMLFile - ItemTemplates false - TemplateProjectOutputGroup%3b {604F0DAA-2D33-48DD-B162-EDF0B672803D} ConsoleProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} LibraryProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} NetCoreProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} NetCore78Project - ProjectTemplates false - TemplateProjectOutputGroup%3b {D9D95330-3626-4199-B7AF-17B8E4AF6D87} NetCore259Project - ProjectTemplates false {DB374A0C-7560-479F-9B21-D37C81F7624F} PortableLibraryProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} SilverlightProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} TutorialProject - ProjectTemplates false - TemplateProjectOutputGroup%3b {65e0e82a-eace-4787-8994-888674c2fe87} diff --git a/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman b/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman deleted file mode 100644 index 432a48c60b8..00000000000 --- a/vsintegration/VisualFSharpVsix/manifest/templateManifest0.noloc.vstman +++ /dev/null @@ -1,21 +0,0 @@ - - - NetCore259Project\NetCore259Project - NETCore259PortableLibrary.vstemplate - - - - - - Microsoft.FSharp.NETCore259PortableLibrary - FSharp - 4.5 - 1 - true - PortableLibrary - true - true - - - - \ No newline at end of file From 4f914e29f3c59ba4cb485067a0949f96de2540a4 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 6 May 2016 12:37:58 -0700 Subject: [PATCH 129/334] Added WIX setup projects --- build-everything.proj | 7 + build.cmd | 12 +- packages.config | 3 + setup/Common.Wix.Properties.wxs | 145 + setup/FSharp.SDK/FSharp.SDK.wixproj | 66 + setup/FSharp.SDK/FSharp.SDK.wxs | 44 + .../Compiler_OtherResources.wxs | 46 + .../Compiler_PrivateAssemblies.wxs | 65 + .../Compiler_PublicAssemblies.wxs | 39 + .../component-groups/Compiler_SDK.wxs | 147 + .../Langpack_ManagedFiles.wxs | 174 ++ .../component-groups/Redist_ManagedFiles.wxs | 190 ++ setup/FSharp.Setup.props | 23 + setup/FSharp.Wix.Extensions/AssemblyInfo.cs | 6 + .../FSharp.Wix.Extensions.csproj | 45 + .../FSharpPreprocessorExtension.cs | 96 + .../FSharpWixExtension.cs | 17 + setup/fsharp-setup-build.proj | 42 + setup/resources/Microsoft.FSharp.Shim.targets | 5 + .../Microsoft.Portable.FSharp.Shim.targets | 5 + setup/resources/ThirdPartyNotices.txt | 30 + setup/resources/eula/VF_EULA.CHS.rtf | 894 ++++++ setup/resources/eula/VF_EULA.CHT.rtf | 897 ++++++ setup/resources/eula/VF_EULA.CSY.rtf | 692 +++++ setup/resources/eula/VF_EULA.DEU.rtf | 770 ++++++ setup/resources/eula/VF_EULA.ENU.rtf | 692 +++++ setup/resources/eula/VF_EULA.ESN.rtf | 783 ++++++ setup/resources/eula/VF_EULA.FRA.rtf | 772 ++++++ setup/resources/eula/VF_EULA.ITA.rtf | 782 ++++++ setup/resources/eula/VF_EULA.JPN.rtf | 1043 +++++++ setup/resources/eula/VF_EULA.KOR.rtf | 2421 +++++++++++++++++ setup/resources/eula/VF_EULA.PLK.rtf | 692 +++++ setup/resources/eula/VF_EULA.PTB.rtf | 787 ++++++ setup/resources/eula/VF_EULA.RUS.rtf | 949 +++++++ setup/resources/eula/VF_EULA.TRK.rtf | 692 +++++ 35 files changed, 14072 insertions(+), 1 deletion(-) create mode 100644 setup/Common.Wix.Properties.wxs create mode 100644 setup/FSharp.SDK/FSharp.SDK.wixproj create mode 100644 setup/FSharp.SDK/FSharp.SDK.wxs create mode 100644 setup/FSharp.SDK/component-groups/Compiler_OtherResources.wxs create mode 100644 setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs create mode 100644 setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs create mode 100644 setup/FSharp.SDK/component-groups/Compiler_SDK.wxs create mode 100644 setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs create mode 100644 setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs create mode 100644 setup/FSharp.Setup.props create mode 100644 setup/FSharp.Wix.Extensions/AssemblyInfo.cs create mode 100644 setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj create mode 100644 setup/FSharp.Wix.Extensions/FSharpPreprocessorExtension.cs create mode 100644 setup/FSharp.Wix.Extensions/FSharpWixExtension.cs create mode 100644 setup/fsharp-setup-build.proj create mode 100644 setup/resources/Microsoft.FSharp.Shim.targets create mode 100644 setup/resources/Microsoft.Portable.FSharp.Shim.targets create mode 100644 setup/resources/ThirdPartyNotices.txt create mode 100644 setup/resources/eula/VF_EULA.CHS.rtf create mode 100644 setup/resources/eula/VF_EULA.CHT.rtf create mode 100644 setup/resources/eula/VF_EULA.CSY.rtf create mode 100644 setup/resources/eula/VF_EULA.DEU.rtf create mode 100644 setup/resources/eula/VF_EULA.ENU.rtf create mode 100644 setup/resources/eula/VF_EULA.ESN.rtf create mode 100644 setup/resources/eula/VF_EULA.FRA.rtf create mode 100644 setup/resources/eula/VF_EULA.ITA.rtf create mode 100644 setup/resources/eula/VF_EULA.JPN.rtf create mode 100644 setup/resources/eula/VF_EULA.KOR.rtf create mode 100644 setup/resources/eula/VF_EULA.PLK.rtf create mode 100644 setup/resources/eula/VF_EULA.PTB.rtf create mode 100644 setup/resources/eula/VF_EULA.RUS.rtf create mode 100644 setup/resources/eula/VF_EULA.TRK.rtf diff --git a/build-everything.proj b/build-everything.proj index 6702f515511..4c370b0d1fc 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -37,6 +37,10 @@ + + + + @@ -44,6 +48,7 @@ + @@ -53,6 +58,7 @@ + @@ -62,5 +68,6 @@ + diff --git a/build.cmd b/build.cmd index e51f54f7b28..9810e3c2ebf 100644 --- a/build.cmd +++ b/build.cmd @@ -13,7 +13,7 @@ echo Build and run a subset of test suites echo. echo Usage: echo. -echo build.cmd ^ +echo build.cmd ^ echo. echo No arguments default to 'build' echo. @@ -99,6 +99,15 @@ if /i '%ARG%' == 'all' ( set SKIP_EXPENSIVE_TESTS=0 ) +if /i '%ARG%' == 'microbuild' ( + set BUILD_PROTO=1 + set BUILD_NET40=1 + set BUILD_CORECLR=1 + set BUILD_PORTABLE=1 + set BUILD_VS=1 + set BUILD_SETUP=1 +) + if /i '%ARG%' == 'proto' ( set BUILD_PROTO=1 ) @@ -232,6 +241,7 @@ echo BUILD_NET40=%BUILD_NET40% echo BUILD_CORECLR=%BUILD_CORECLR% echo BUILD_PORTABLE=%BUILD_PORTABLE% echo BUILD_VS=%BUILD_VS% +echo BUILD_SETUP=%BUILD_SETUP% echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_CONFIG_LOWERCASE=%BUILD_CONFIG_LOWERCASE% echo. diff --git a/packages.config b/packages.config index 176d60691ff..c8c0d183d1d 100644 --- a/packages.config +++ b/packages.config @@ -13,4 +13,7 @@ + + + diff --git a/setup/Common.Wix.Properties.wxs b/setup/Common.Wix.Properties.wxs new file mode 100644 index 00000000000..bb590d7d31d --- /dev/null +++ b/setup/Common.Wix.Properties.wxs @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj new file mode 100644 index 00000000000..8f008813dbc --- /dev/null +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -0,0 +1,66 @@ + + + + + $(MSBuildProjectDirectory)\..\.. + $(FSharpTreeRoot)\setup + + + + + + + FSharp.SDK + da0da41f-0e00-4598-8eee-b29d31b0ca04 + Package + net + true + false + true + false + + + + $(DefineConstants);Lang=$(Lang) + $(DefineConstants);BinariesDir=$(BinariesDir) + $(DefineConstants);FSharpTreeRoot=$(FSharpTreeRoot) + $(DefineConstants);FSharpCoreRedistDir=$(FSharpCoreRedistDir) + $(DefineConstants);FSharpTypeProvidersRedistDir=$(FSharpTypeProvidersRedistDir) + + + + + WixNetFxExtension + + + FSharp.Wix.Extensions + $(BinariesDir)\setup\FSharp.Wix.Extensions.dll + + + + + + + + + + + + + + + + + + + MicrosoftSHA1 + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/FSharp.SDK.wxs b/setup/FSharp.SDK/FSharp.SDK.wxs new file mode 100644 index 00000000000..5559097ca49 --- /dev/null +++ b/setup/FSharp.SDK/FSharp.SDK.wxs @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Compiler_OtherResources.wxs b/setup/FSharp.SDK/component-groups/Compiler_OtherResources.wxs new file mode 100644 index 00000000000..5ce60020850 --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Compiler_OtherResources.wxs @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs b/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs new file mode 100644 index 00000000000..895e101e3cd --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs b/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs new file mode 100644 index 00000000000..de1a877d160 --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs b/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs new file mode 100644 index 00000000000..c80c5774d3d --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs b/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs new file mode 100644 index 00000000000..b28240f206e --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs b/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs new file mode 100644 index 00000000000..4ee6b6e7892 --- /dev/null +++ b/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.Setup.props b/setup/FSharp.Setup.props new file mode 100644 index 00000000000..b3030a02d99 --- /dev/null +++ b/setup/FSharp.Setup.props @@ -0,0 +1,23 @@ + + + + + 2.0 + 3.10 + 3.10.0.1503 + $(SetupRootFolder)\..\packages\WiX.Toolset.2015.$(WiXToolset2015Version)\tools\wix + $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Core.Redist.1.0.0 + $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Type.Providers.Redist.1.0.0 + + + net40 + Debug + AnyCPU + + + $(SetupRootFolder)\..\$(Configuration) + obj\$(Configuration)\ + $(BinariesDir)\setup + $(BinariesDir)\setup\$(Lang) + + diff --git a/setup/FSharp.Wix.Extensions/AssemblyInfo.cs b/setup/FSharp.Wix.Extensions/AssemblyInfo.cs new file mode 100644 index 00000000000..0faf5e1a2ee --- /dev/null +++ b/setup/FSharp.Wix.Extensions/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using FSharp.WIX.Extensions; +using Microsoft.Tools.WindowsInstallerXml; + +[assembly: AssemblyDefaultWixExtension(typeof(FSharpWixExtension))] diff --git a/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj b/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj new file mode 100644 index 00000000000..cc0710faa1b --- /dev/null +++ b/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj @@ -0,0 +1,45 @@ + + + + + $(MSBuildProjectDirectory)\.. + + + + + + + CSharp + 15.0 + 4.4.1.0 + cs + + + + Library + FSharp.Wix.Extensions + {321E6C2C-9E1C-4506-B1C0-1F81DCAEF207} + v4.5 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/FSharp.Wix.Extensions/FSharpPreprocessorExtension.cs b/setup/FSharp.Wix.Extensions/FSharpPreprocessorExtension.cs new file mode 100644 index 00000000000..27e7663be5a --- /dev/null +++ b/setup/FSharp.Wix.Extensions/FSharpPreprocessorExtension.cs @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Tools.WindowsInstallerXml; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace FSharp.WIX.Extensions +{ + public class FSharpPreprocessorExtension : PreprocessorExtension + { + private readonly string[] prefixes = new string[] { "fsharp" }; + + private readonly List supportedLanguages = new List() + { + new CultureInfo(1028), // CHT + new CultureInfo(1029), // CSY + new CultureInfo(1031), // DEU + new CultureInfo(1033), // ENU + new CultureInfo(1036), // FRA + new CultureInfo(1040), // ITA + new CultureInfo(1041), // JPN + new CultureInfo(1042), // KOR + new CultureInfo(1045), // PLK + new CultureInfo(1046), // PTB + new CultureInfo(1049), // RUS + new CultureInfo(1055), // TRK + new CultureInfo(2052), // CHS + new CultureInfo(3082), // ESN + }; + + public override string[] Prefixes + { + get { return this.prefixes; } + } + + public override string EvaluateFunction(string prefix, string function, string[] args) + { + if (prefixes.Contains(prefix)) + { + switch (function) + { + case "guid": + return this.Guid(args); + case "localeToId": + return this.LocaleToId(args); + case "localeToCulture": + return this.LocaleToCulture(args); + } + } + + return null; + } + + private string Guid(string[] args) + { + var input = string.Join("|", args); + var bytes = Encoding.Default.GetBytes(input); + var output = MD5.Create().ComputeHash(bytes); + + return new Guid(output).ToString(); + } + + private string LocaleToId(string[] args) + { + return this.GetSupportedLanguage(args).LCID.ToString(); + } + + private string LocaleToCulture(string[] args) + { + return this.GetSupportedLanguage(args).Name; + } + + private CultureInfo GetSupportedLanguage(string[] args) + { + if (args.Length != 1) + { + throw new ArgumentException("Exactly one argument (locale) should be provided."); + } + + var language = this.supportedLanguages.FirstOrDefault(l => l.ThreeLetterWindowsLanguageName.ToString() == args[0]); + + if (language == null) + { + throw new ArgumentException($"Locale '{args[0]}' is not supported."); + } + else + { + return language; + } + } + } +} diff --git a/setup/FSharp.Wix.Extensions/FSharpWixExtension.cs b/setup/FSharp.Wix.Extensions/FSharpWixExtension.cs new file mode 100644 index 00000000000..9ae8c1a2da5 --- /dev/null +++ b/setup/FSharp.Wix.Extensions/FSharpWixExtension.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Tools.WindowsInstallerXml; + +namespace FSharp.WIX.Extensions +{ + public class FSharpWixExtension : WixExtension + { + private readonly Lazy preprocessorExtension = new Lazy(); + + public override PreprocessorExtension PreprocessorExtension + { + get { return this.preprocessorExtension.Value; } + } + } +} diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj new file mode 100644 index 00000000000..1f957273c00 --- /dev/null +++ b/setup/fsharp-setup-build.proj @@ -0,0 +1,42 @@ + + + + + . + net40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup/resources/Microsoft.FSharp.Shim.targets b/setup/resources/Microsoft.FSharp.Shim.targets new file mode 100644 index 00000000000..b08b2a619f0 --- /dev/null +++ b/setup/resources/Microsoft.FSharp.Shim.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/setup/resources/Microsoft.Portable.FSharp.Shim.targets b/setup/resources/Microsoft.Portable.FSharp.Shim.targets new file mode 100644 index 00000000000..e47c9ca059b --- /dev/null +++ b/setup/resources/Microsoft.Portable.FSharp.Shim.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/setup/resources/ThirdPartyNotices.txt b/setup/resources/ThirdPartyNotices.txt new file mode 100644 index 00000000000..edacc372f78 --- /dev/null +++ b/setup/resources/ThirdPartyNotices.txt @@ -0,0 +1,30 @@ +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This file provides information regarding components that are being relicensed to you by Microsoft under Microsoft's software licensing terms. Microsoft reserves all rights not expressly granted herein. + +Microsoft is offering you a license to use the following components with Microsoft Visual F# subject to the terms of the Microsoft software license terms for Microsoft Visual F# software products (the “Microsoft Program”). + +1. Visual F# Tools (https://visualfsharp.codeplex.com) + + +%% Visual F# Tools NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Microsoft Open Technologies would like to thank its contributors, a list +of whom are at https://visualfsharp.codeplex.com/wikipage?title=Contributors. + +Licensed under the Apache License, Version 2.0 (the "License"); you +may not use this file except in compliance with the License. You may +obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the License for the specific language governing permissions +and limitations under the License. + +========================================= +END OF Visual F# Tools NOTICES AND INFORMATION \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.CHS.rtf b/setup/resources/eula/VF_EULA.CHS.rtf new file mode 100644 index 00000000000..5b0f5a8aa04 --- /dev/null +++ b/setup/resources/eula/VF_EULA.CHS.rtf @@ -0,0 +1,894 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff40\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1042\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt Meiryo};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f102\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f113\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f169\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f697\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f698\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f700\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f701\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f702\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f703\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f704\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f705\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f717\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f718\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f720\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f721\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f722\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f723\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f724\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f725\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f809\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt Meiryo};}{\f807\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt Meiryo};}{\f808\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt Meiryo};} +{\f810\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt Meiryo};}{\f811\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt Meiryo};}{\f814\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt Meiryo};} +{\f829\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f1037\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f1038\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f1040\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f1041\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f1044\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f1045\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f1097\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f1098\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};} +{\f1100\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f1101\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f1102\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};} +{\f1103\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f1104\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f1105\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};} +{\f1106\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f1719\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f1717\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};} +{\f1718\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f1720\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f1721\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};} +{\f1724\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f1829\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f2387\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};} +{\f2388\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f2390\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f2391\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};} +{\f2394\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;} +{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;} +{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1042\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1042 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 2;}{\s25\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 1;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink105 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon24 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\*\cs56 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\s57\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af40\afs19\alang1025 \ltrch\fcs0 \i\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext57 +Bullet 4 Italics;}{\*\cs58 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{ +\s64\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext64 \slink65 \ssemihidden endnote text;}{\*\cs65 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink64 \slocked \ssemihidden Endnote Text Char;}{\*\cs66 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s67\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext67 \slink68 \ssemihidden annotation text;}{\*\cs68 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink67 \slocked \ssemihidden +Comment Text Char;}{\*\cs69 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s70\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext70 Char;}{\*\cs71 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af40\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 page number;}{\*\cs77 \additive \rtlch\fcs1 \ab\af169 \ltrch\fcs0 \b\f169\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Heading 2 Char1;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon67 \snext67 \slink84 \ssemihidden \sunhideused annotation subject;}{\*\cs84 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20 \sbasedon68 \slink83 \slocked \ssemihidden Comment Subject Char;}{\s85\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext85 \slink86 footer;} +{\*\cs86 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink85 \slocked Footer Char;}{\*\cs87 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{ +\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f169\hich\af169\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af40\afs24\alang1025 \ltrch\fcs0 \b\f169\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f40\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f40 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\*\cs105 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 +\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab0\af40\afs19 \ltrch\fcs0 +\b0\f40\fs19 \sbasedon105 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f40\hich\af40\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}{\*\cs111 \additive +\rtlch\fcs1 \af0 \ltrch\fcs0 \cf15 \sbasedon10 \ssemihidden \styrsid8981218 Placeholder Text;}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240 +\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462} +{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 +\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 +\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 +\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 +\b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4 +\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 } +{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \s5\fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \s6 +\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 +\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 +\s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 +\s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af169\afs20 \ltrch\fcs0 \b\i0\f169\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 +\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\strike0\f169\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af169\afs20 \ltrch\fcs0 \b0\i0\f169\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 } +{\listname ;}\listid974869818}{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li7557\lin7557 }{\listname ;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid21120\rsid85979\rsid462051\rsid1835841\rsid2638226\rsid2841351\rsid3755635\rsid4131158\rsid4684770\rsid5519702\rsid5858028\rsid6300238\rsid7224083\rsid8981218\rsid9124819\rsid9196108\rsid9914850\rsid10114904\rsid10249654\rsid10819051 +\rsid11029699\rsid11210801\rsid11473598\rsid11758563\rsid11828113\rsid12330181\rsid12799225\rsid14316686\rsid14356214\rsid14375208\rsid14446677\rsid14506910\rsid14961098\rsid15081085\rsid15166692\rsid15231075\rsid15489648\rsid15548830\rsid15758611 +\rsid15946277\rsid16280961\rsid16647996\rsid16734057}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18} +{\revtim\yr2013\mo9\dy25\hr16\min6}{\version1}{\edmins0}{\nofpages2}{\nofwords398}{\nofchars2273}{\nofcharsws2666}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14506910 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14506910 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14506910 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14506910 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 +\insrsid85979 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid85979 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid85979 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid85979 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid85979 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid85979 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 +\hich\af40\dbch\af13\loch\f40 MICROSOFT }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-28817\'c8\'ed\u20214\'bc\'fe\u-29768\'d0\'ed\u21487\'bf\'c9 +\u26465\'cc\'f5\u27454\'bf\'ee}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid8981218\charrsid14961098 \hich\af40\dbch\af13\loch\f40 +MICROSOFT VISUAL F#}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-28711 +\'d5\'e2\u20123\'d0\'a9\u-29768\'d0\'ed\u21487\'bf\'c9\u26465\'cc\'f5\u27454\'bf\'ee\u26159\'ca\'c7}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 + Microsoft Corporation}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-248\'a3\'a8\u25110\'bb\'f2\u24744\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da +\u22320\'b5\'d8\u30340\'b5\'c4}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Microsoft Corporation }{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20851\'b9\'d8\u-32684\'c1\'aa\loch\af40\hich\af40\dbch\f13 \u20844\'b9\'ab\u21496\'cb\'be\u-247\'a3\'a9\u19982\'d3\'eb\u24744\'c4\'fa +\u20043\'d6\'ae\u-27148\'bc\'e4\u-28738\'b4\'ef\u25104\'b3\'c9\u30340\'b5\'c4\u21327\'d0\'ad\u-29778\'d2\'e9\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw-3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid11828113\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u-29705\'c7\'eb\u-27131\'d4\'c4\u-29701\'b6\'c1\u26465\'cc\'f5\u27454\'bf\'ee\u20869\'c4\'da\u23481\'c8\'dd\u12290 +\'a1\'a3\u-28711\'d5\'e2\u20123\'d0\'a9\u26465\'cc\'f5\u27454\'bf\'ee\u-28670\'ca\'ca\u29992\'d3\'c3\u20110\'d3\'da\u19978\'c9\'cf\u-28688\'ca\'f6\u-28817\'c8\'ed\u20214\'bc\'fe\u-244\'a3\'ac\u21253\'b0\'fc\u25324\'c0\'a8\u24744\'c4\'fa\u29992\'d3\'c3 +\u26469\'c0\'b4\u25509\'bd\'d3\u25910\'ca\'d5\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u30340\'b5\'c4\u20171\'bd\'e9\u-29400\'d6\'ca\u-248\'a3\'a8\u22914\'c8\'e7\u26377\'d3\'d0\u-247\'a3\'a9\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw-3\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u-28711\'d5\'e2\u20123\'d0\'a9\u26465\'cc\'f5\u27454\'bf\'ee\u20063\'d2\'b2\u-28670\'ca\'ca\u29992\'d3\'c3 +\u20110\'d3\'da}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\expnd0\expndtw-3\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw-3\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u20026\'ce\'aa\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u25552\'cc\'e1\u20379\'b9\'a9\u30340\'b5\'c4 +\u20219\'c8\'ce\u20309\'ba\'ce}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u26356\'b8\'fc +\u26032\'d0\'c2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-30619\'b2\'b9\u20805\'b3\'e4\u31243\'b3\'cc\u24207\'d0\'f2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22522\'bb\'f9\u20110\'d3\'da}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Internet }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 +\loch\af40\hich\af40\dbch\f13 \uc2\u30340\'b5\'c4\u26381\'b7\'fe\u21153\'ce\'f1\u21644\'ba\'cd}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25903\'d6\'a7\u25345\'b3\'d6\u26381\'b7\'fe\u21153\'ce\'f1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u-248\'a3\'a8\u-27036\'b3\'fd\u-26786\'b7\'c7\u-28711\'d5\'e2\u20123\'d0\'a9\u-26503\'cf\'ee\u30446\'c4\'bf\u-27068\'b8\'bd\u24102\'b4\'f8\u26377\'d3\'d0\u20854\'c6\'e4\u20182\'cb\'fb\u26465\'cc\'f5\u27454\'bf\'ee\u12290\'a1\'a3}{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22914\'c8\'e7\u26524\'b9\'fb\u30830\'c8\'b7\u23454\'ca\'b5\u-27068\'b8\'bd\u24102\'b4\'f8\u26377 +\'d3\'d0\u20854\'c6\'e4\u20182\'cb\'fb\u26465\'cc\'f5\u27454\'bf\'ee\u-244\'a3\'ac\u24212\'d3\'a6\u-28555\'d7\'f1\u23432\'ca\'d8\u-28509\'c4\'c7\u20123\'d0\'a9\u26465\'cc\'f5\u27454\'bf\'ee\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 )}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 + +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20351\'ca\'b9\u29992\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u-244 +\'a3\'ac\u21363\'bc\'b4\u-30616\'b1\'ed\u31034\'ca\'be\u24744\'c4\'fa\u25509\'bd\'d3\u21463\'ca\'dc\u-28711\'d5\'e2\u20123\'d0\'a9\u26465\'cc\'f5\u27454\'bf\'ee\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22914\'c8\'e7\u26524\'b9\'fb\u24744\'c4\'fa\u19981\'b2\'bb\u25509\'bd\'d3\u21463\'ca\'dc\u-28711\'d5\'e2\u20123\'d0\'a9\u26465 +\'cc\'f5\u27454\'bf\'ee\u-244\'a3\'ac\u-29705\'c7\'eb\u19981\'b2\'bb\u-30335\'d2\'aa\u20351\'ca\'b9\u29992\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u22914\'c8\'e7\u26524\'b9\'fb\u24744\'c4\'fa\u-28555\'d7\'f1\u23432\'ca\'d8\u-28711\'d5\'e2\u20123\'d0\'a9\u-29768\'d0\'ed\u21487\'bf\'c9\u26465\'cc\'f5\u27454\'bf\'ee\u-244\'a3\'ac\u21017\'d4\'f2\u23558\'bd\'ab\u25317\'d3\'b5\u26377\'d3\'d0\u20197 +\'d2\'d4\u19979\'cf\'c2\u27704\'d3\'c0\u20037\'be\'c3\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8981218 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u23433\'b0\'b2\u-30523\'d7\'b0\u21644\'ba\'cd\u20351\'ca\'b9\u29992\'d3\'c3\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24744\'c4\'fa\u21487\'bf\'c9\u20197\'d2\'d4\u22312\'d4\'da\u24744\'c4\'fa\u30340\'b5\'c4\u-29762\'c9\'e8\u22791\'b1\'b8 +\u19978\'c9\'cf\u23433\'b0\'b2\u-30523\'d7\'b0\u21644\'ba\'cd\u20351\'ca\'b9\u29992\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u20219\'c8\'ce\u24847\'d2\'e2\u25968\'ca\'fd\u-28209\'c1\'bf\u30340\'b5\'c4\u21103\'b8\'b1\u26412\'b1\'be\u26469 +\'c0\'b4\u-29762\'c9\'e8\u-29791\'bc\'c6\u12289\'a1\'a2\loch\af40\hich\af40\dbch\f13 \u24320\'bf\'aa\u21457\'b7\'a2\u21644\'ba\'cd\u27979\'b2\'e2\u-29739\'ca\'d4\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u12290\'a1\'a3}{\rtlch\fcs1 +\ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20854\'c6\'e4\u20182\'cb\'fb\u-29768\'d0\'ed\u21487\'bf\'c9\u-30335\'d2\'aa\u27714\'c7\'f3\u21644\'ba\'cd}{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25110\'bb\'f2\u20351\'ca\'b9\u29992\'d3\'c3\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \cs56\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 +\loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21253\'b0\'fc\u21547\'ba\'ac\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u12290\'a1\'a3\u22914\'c8\'e7\u26524\'b9\'fb\u24744\'c4\'fa\u-28555 +\'d7\'f1\u23432\'ca\'d8\u19979\'cf\'c2\u-28688\'ca\'f6\u26465\'cc\'f5\u27454\'bf\'ee\u-244\'a3\'ac\u21017\'d4\'f2\u21487\'bf\'c9\u20197\'d2\'d4\u22312\'d4\'da\u24744\'c4\'fa\u24320\'bf\'aa\u21457\'b7\'a2\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u20013 +\'d6\'d0\u20998\'b7\'d6\u21457\'b7\'a2\u-28711\'d5\'e2\u20123\'d0\'a9\u20195\'b4\'fa\u30721\'c2\'eb\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u20351\'ca\'b9\u29992\'d3\'c3\u26435\'c8\'a8\u21033\'c0\'fb\u21644\'ba\'cd\u20998\'b7\'d6\u21457\'b7\'a2\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\cs58\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u19979\'cf\'c2\u21015\'c1\'d0\u20195\'b4\'fa\u30721\'c2\'eb\u21644\'ba\'cd\u25991\'ce\'c4\u26412\'b1\'be\u25991\'ce\'c4 +\u20214\'bc\'fe\u20026\'ce\'aa}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \cs58\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8220\'a1\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\cs58\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\cs58\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8221\'a1\'b1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\cs58\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 REDIST.TXT }{ +\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25991\'ce\'c4\u20214\'bc\'fe}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\ulnone\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u12290\'a1\'a3\u24744\'c4\'fa\u21487\'bf\'c9\u20197\'d2\'d4\u22797\'b8\'b4\u21046\'d6\'c6\u21644\'ba\'cd\u20998\'b7\'d6\u21457 +\'b7\'a2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\ulnone\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 REDIST.TXT }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\ulnone\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25991\'ce\'c4\u20214\'bc\'fe\u20013\'d6\'d0\u21015\'c1\'d0\u20986\'b3\'f6\u30340\'b5\'c4\u23545\'b6\'d4\u-29599\'cf\'f3\u20195 +\'b4\'fa\u30721\'c2\'eb\u24418\'d0\'ce\u24335\'ca\'bd\u30340\'b5\'c4\u20195\'b4\'fa\u30721\'c2\'eb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u20998\'b7\'d6\u21457\'b7\'a2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\ulnone\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u12290\'a1\'a3\u24744\'c4\'fa\u21487\'bf\'c9\u20197\'d2\'d4\u20801\'d4\'ca\u-29768\'d0\'ed\u24744\'c4\'fa\u30340\'b5\'c4 +\u31243\'b3\'cc\u24207\'d0\'f2\u20998\'b7\'d6\u-27392\'cf\'fa\u21830\'c9\'cc\u23558\'bd\'ab\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u20316\'d7\'f7\u20026\'ce\'aa\u-28711\'d5\'e2\u20123\'d0\'a9\u31243\'b3\'cc\u24207 +\'d0\'f2\u30340\'b5\'c4\u19968\'d2\'bb\u-28440\'b2\'bf\u20998\'b7\'d6\u-28709\'bd\'f8\u-30644\'d0\'d0\u22797\'b8\'b4\u21046\'d6\'c6\u21644\'ba\'cd\u20998\'b7\'d6\u21457\'b7\'a2\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u20998\'b7\'d6\u21457\'b7\'a2\u-30335\'d2\'aa\u27714\'c7\'f3\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \cs58\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u23545\'b6\'d4\u20110\'d3\'da\u24744\'c4\'fa\u20998\'b7\'d6\u21457\'b7\'a2\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u-244\'a3\'ac\u24744\'c4\'fa\u24517\'b1\'d8\u-26501 +\'d0\'eb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u22312\'d4\'da\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u20013\'d6\'d0\u20026\'ce\'aa\u20854\'c6\'e4\u28155\'cc\'ed\u21152\'bc\'d3\u-28211\'d6\'d8\u-30335\'d2\'aa\u30340\'b5\'c4\u20027\'d6\'f7\u-30335\'d2\'aa\u21151\'b9\'a6\u-32515 +\'c4\'dc\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u23545\'b6\'d4\u20110\'d3\'da\u20219\'c8\'ce\u20309\'ba\'ce\u25991\'ce\'c4\u20214\'bc\'fe\u25193\'c0\'a9\u23637 +\'d5\'b9\u21517\'c3\'fb\u20026\'ce\'aa}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 .lib }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u30340\'b5\'c4\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u-244\'a3\'ac\u20165\'bd\'f6\u20998 +\'b7\'d6\u21457\'b7\'a2\u-28646\'cd\'a8\u-28729\'b9\'fd\u-27394\'c1\'b4\u25509\'bd\'d3\u22120\'c6\'f7\u19982\'d3\'eb\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u19968\'d2\'bb\u-29321\'c6\'f0\u-28720\'d4\'cb\u-30644\'d0\'d0\u19978\'c9\'cf +\u-28688\'ca\'f6\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u30340\'b5\'c4\u32467\'bd\'e1\u26524\'b9\'fb\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20165\'bd\'f6\u20998\'b7\'d6\u21457\'b7\'a2\u20316\'d7\'f7\u20026\'ce\'aa\u23433\'b0\'b2\u-30523\'d7\'b0\u31243 +\'b3\'cc\u24207\'d0\'f2\u30340\'b5\'c4\u19968\'d2\'bb\u-28440\'b2\'bf\u20998\'b7\'d6\u21253\'b0\'fc\u21547\'ba\'ac\u22312\'d4\'da\u23433\'b0\'b2\u-30523\'d7\'b0\u31243\'b3\'cc\u24207\'d0\'f2\u20013\'d6\'d0\u30340\'b5\'c4\u26410\'ce\'b4\u32463\'be\'ad +\u20462\'d0\'de\u25913\'b8\'c4\u30340\'b5\'c4\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 + +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-30335\'d2\'aa\u27714\'c7\'f3\u20998\'b7\'d6\u-27392\'cf\'fa\u21830\'c9\'cc\u21450\'bc\'b0\u22806\'cd\'e2\u-28440 +\'b2\'bf\u26368\'d7\'ee\u32456\'d6\'d5\u29992\'d3\'c3\u25143\'bb\'a7\u21516\'cd\'ac\u24847\'d2\'e2\u-28555\'d7\'f1\u23432\'ca\'d8\u20445\'b1\'a3\u25252\'bb\'a4\u26465\'cc\'f5\u27454\'bf\'ee\u19988\'c7\'d2\u20445\'b1\'a3\u25252\'bb\'a4\u-31997\'b7\'b6 +\u22260\'ce\'a7\u19981\'b2\'bb\u24471\'b5\'c3\u23567\'d0\'a1\u20110\'d3\'da\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 + +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22312\'d4\'da\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u19978\'c9\'cf\u26174\'cf\'d4\u31034 +\'ca\'be\u26377\'d3\'d0\u25928\'d0\'a7\u30340\'b5\'c4\u29256\'b0\'e6\u26435\'c8\'a8\u22768\'c9\'f9\u26126\'c3\'f7\u-229\'a3\'bb\u20197\'d2\'d4\u21450\'bc\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u23545\'b6\'d4\u20110\'d3\'da\u19982\'d3\'eb\u20998\'b7\'d6\u21457\'b7\'a2\u25110\'bb\'f2\u20351\'ca\'b9\u29992 +\'d3\'c3\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u26377\'d3\'d0\u20851\'b9\'d8\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u32034\'cb\'f7\u-29356\'c5\'e2\u-244\'a3\'ac\u20026\'ce\'aa}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25552\'cc\'e1\u20379\'b9\'a9\u-28759\'b1\'e7\u25252\'bb\'a4\u12289\'a1\'a2\u-30619\'b2\'b9\u20607\'b3\'a5\u-244\'a3\'ac\u21253 +\'b0\'fc\u25324\'c0\'a8\u25903\'d6\'a7\u20184\'b8\'b6\u24459\'c2\'c9\u24072\'ca\'a6\u-29383\'b7\'d1\u-244\'a3\'ac\u24182\'b2\'a2\u20351\'ca\'b9}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20813\'c3\'e2\u21463\'ca\'dc\u25439\'cb\'f0\u23475\'ba\'a6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe1033\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20998\'b7\'d6 +\u21457\'b7\'a2\u-27056\'cf\'de\u21046\'d6\'c6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \cs58\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24744\'c4\'fa\u19981\'b2\'bb\u24471 +\'b5\'c3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u25913\'b8\'c4\u21464\'b1\'e4\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u20013\'d6\'d0\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u29256\'b0\'e6\u26435\'c8\'a8\u12289\'a1\'a2\u21830\'c9\'cc\u26631\'b1\'ea\u25110 +\'bb\'f2\u19987\'d7\'a8\u21033\'c0\'fb\u22768\'c9\'f9\u26126\'c3\'f7\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\expnd0\expndtw3\cf17\lang2052\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid2841351 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u22312\'d4\'da\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u21517\'c3\'fb\u31216 +\'b3\'c6\u20013\'d6\'d0\u20351\'ca\'b9\u29992\'d3\'c3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u30340\'b5\'c4\u21830\'c9\'cc\u26631\'b1\'ea\u-244\'a3\'ac\u25110\'bb\'f2\u-32763\'d5\'df\u20197\'d2\'d4\u20854 +\'c6\'e4\u20182\'cb\'fb\u26041\'b7\'bd\u24335\'ca\'bd\u26263\'b0\'b5\u31034\'ca\'be\u24744\'c4\'fa\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u26469\'c0\'b4\u-32278\'d7\'d4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u25110\'bb\'f2\u32463\'be\'ad}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw3\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u-29788\'c8\'cf\u21487\'bf\'c9\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw3\dbch\af13\insrsid4684770\charrsid2841351 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20998\'b7\'d6\u21457\'b7\'a2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8220\'a1\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8221\'a1\'b1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20197\'d2\'d4\u20415\'b1\'e3\u22312\'d4\'da}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Windows }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24179\'c6\'bd\u21488\'cc\'a8\u20197\'d2\'d4\u22806\'cd\'e2\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u24179\'c6\'bd\u21488 +\'cc\'a8\u19978\'c9\'cf\u-28720\'d4\'cb\u-30644\'d0\'d0\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22312\'d4\'da\u24694\'b6\'f1\u24847\'d2\'e2\u30340\'b5\'c4\u12289\'a1\'a2\u27450\'c6\'db\u-25961\'c6\'ad\u24615 +\'d0\'d4\u30340\'b5\'c4\u25110\'bb\'f2\u-26786\'b7\'c7\u27861\'b7\'a8\u30340\'b5\'c4\u31243\'b3\'cc\u24207\'d0\'f2\u20013\'d6\'d0\u21253\'b0\'fc\u25324\'c0\'a8\u21487\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u-229\'a3\'bb\u25110 +\'bb\'f2\u-32763\'d5\'df}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\cf17\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20462\'d0\'de\u25913\'b8\'c4\u25110\'bb\'f2\u20998\'b7\'d6\u21457\'b7\'a2\u20219\'c8\'ce\u20309\'ba\'ce\u21487 +\'bf\'c9\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u30340\'b5\'c4\u28304\'d4\'b4\u20195\'b4\'fa\u30721\'c2\'eb\u-244\'a3\'ac\u-32268\'d6\'c2\u20351\'ca\'b9\u20854\'c6\'e4\u20219\'c8\'ce\u20309\'ba\'ce\u-28440\'b2\'bf\u20998\'b7\'d6 +\u21463\'ca\'dc\u21040\'b5\'bd}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \uc2\u8220\'a1\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25490\'c5\'c5\u-27036\'b3\'fd\u-29768\'d0\'ed\u21487\'bf\'c9}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \uc2\u8221\'a1\'b1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u30340\'b5\'c4\u21046\'d6\'c6\u32422\'d4\'bc\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25490\'c5\'c5\u-27036\'b3\'fd\u-29768\'d0\'ed\u21487\'bf\'c9\u25351\'d6\'b8\u-30335\'d2\'aa\u27714\'c7\'f3\u20197\'d2\'d4 +\u22914\'c8\'e7\u19979\'cf\'c2\u-30268\'b9\'e6\u23450\'b6\'a8\u20026\'ce\'aa\u20351\'ca\'b9\u29992\'d3\'c3\u12289\'a1\'a2\u20462\'d0\'de\u25913\'b8\'c4\u25110\'bb\'f2\u20998\'b7\'d6\u21457\'b7\'a2\u26465\'cc\'f5\u20214\'bc\'fe\u30340\'b5\'c4\u-29768 +\'d0\'ed\u21487\'bf\'c9\u-230\'a3\'ba}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u20197\'d2\'d4\u28304\'d4\'b4\u20195\'b4\'fa\u30721\'c2\'eb\u24418\'d0\'ce\u24335\'ca\'bd\u20844\'b9\'ab\u24067\'b2\'bc\u25110\'bb\'f2\u20998\'b7\'d6\u21457\'b7\'a2\u20195\'b4\'fa\u30721\'c2\'eb\u-229\'a3\'bb\u25110\'bb\'f2}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20854\'c6\'e4\u20182\'cb\'fb\u20154\'c8\'cb\u26377\'d3\'d0\u26435\'c8\'a8\u23545\'b6\'d4\u20854\'c6\'e4\u-28709 +\'bd\'f8\u-30644\'d0\'d0\u20462\'d0\'de\u25913\'b8\'c4\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \hich\af40\dbch\af13\loch\f40 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u31243\'b3\'cc\u24207\'d0\'f2\u21644\'ba\'cd\u-28646\'cd\'a8\u30693\'d6\'aa\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21253\'b0\'fc\u25324\'c0\'a8\u30340\'b5\'c4\u20854\'c6\'e4\u20182\'cb\'fb +\u31532\'b5\'da\u19977\'c8\'fd\loch\af40\hich\af40\dbch\f13 \u26041\'b7\'bd\u20195\'b4\'fa\u30721\'c2\'eb\u30001\'d3\'c9}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 +\hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u26681\'b8\'f9\u25454\'be\'dd\u26412\'b1\'be +\u-29768\'d0\'ed\u21487\'bf\'c9\u21327\'d0\'ad\u-29778\'d2\'e9\u21521\'cf\'f2\u24744\'c4\'fa\u25480\'ca\'da\u20104\'d3\'e8\u-29768\'d0\'ed\u21487\'bf\'c9\u-244\'a3\'ac\u-32756\'b6\'f8\u24182\'b2\'a2\u-26786\'b7\'c7\u30001\'d3\'c9\u20219\'c8\'ce\u20309 +\'ba\'ce\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u26681\'b8\'f9\u25454\'be\'dd\u20854\'c6\'e4\u20182\'cb\'fb\u19968\'d2\'bb\u20123\'d0\'a9\u-29768\'d0\'ed\u21487\'bf\'c9\u26465\'cc\'f5\u27454\'bf\'ee\u21521\'cf\'f2\u24744\'c4\'fa\u25480\'ca\'da +\u20104\'d3\'e8\u-29768\'d0\'ed\u21487\'bf\'c9\u12290\'a1\'a3\loch\af40\hich\af40\dbch\f13 \u-29705\'c7\'eb\u27880\'d7\'a2\u24847\'d2\'e2\u-244\'a3\'ac\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21253\'b0\'fc\u25324\'c0\'a8\u30340\'b5\'c4\u27492 +\'b4\'cb\u31867\'c0\'e0\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u20195\'b4\'fa\u30721\'c2\'eb\u-248\'a3\'a8\u22914\'c8\'e7\u26524\'b9\'fb\u26377\'d3\'d0\u-247\'a3\'a9\u20063\'d2\'b2\u21487\'bf\'c9\u22312\'d4\'da}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 ThirdPartyNotices.txt }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25991\'ce\'c4\u20214\'bc\'fe\u20013\'d6\'d0\u25214\'d5\'d2\u21040\'b5\'bd\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 +\ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid11758563\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29768\'d0\'ed\u21487\'bf\'c9\u-31997\'b7\'b6\u22260\'ce\'a7\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21482\'d6\'bb\u25480\'ca\'da\u20104\'d3\'e8\u20351\'ca\'b9\u29992\'d3\'c3 +\u-29768\'d0\'ed\u21487\'bf\'c9\u-244\'a3\'ac\u-32756\'b6\'f8\u-26786\'b7\'c7\u20986\'b3\'f6\u21806\'ca\'db\u12290\'a1\'a3\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u21482\'d6\'bb\u25480\'ca\'da\u20104\'d3\'e8\u24744\'c4\'fa\u20351\'ca\'b9\u29992 +\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u30340\'b5\'c4\u26576\'c4\'b3\u20123\'d0\'a9\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20445\'b1\'a3\u30041\'c1\'f4\u25152\'cb\'f9\u26377\'d3\'d0\u20854\'c6\'e4\u20182\'cb\'fb\u26435\'c8\'a8\u21033\'c0\'fb +\u12290\'a1\'a3\u-27036\'b3\'fd\u-26786\'b7\'c7\u-28670\'ca\'ca\u29992\'d3\'c3\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u-29365\'b8\'b3\u20104\'d3\'e8\u24744\'c4\'fa\u27492\'b4\'cb\u-26503\'cf\'ee\u-27056\'cf\'de\u21046\'d6\'c6\u20043\'d6\'ae\u22806 +\'cd\'e2\u30340\'b5\'c4\u26435\'c8\'a8\u21033\'c0\'fb\u-244\'a3\'ac\u21542\'b7\'f1\u21017\'d4\'f2\u24744\'c4\'fa\u21482\'d6\'bb\u-32515\'c4\'dc\u22312\'d4\'da\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u26126\'c3\'f7\u31034\'ca\'be\u20801\'d4\'ca +\u-29768\'d0\'ed\u30340\'b5\'c4\u-31997\'b7\'b6\u22260\'ce\'a7\u20869\'c4\'da\u20351\'ca\'b9\u29992\'d3\'c3\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u12290\'a1\'a3\u20026\'ce\'aa\u27492\'b4\'cb\u-244\'a3\'ac\u24744\'c4\'fa\u24517\'b1\'d8\u-26501 +\'d0\'eb\u-28555\'d7\'f1\u23432\'ca\'d8\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u20013\'d6\'d0\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u25216\'bc\'bc\u26415\'ca\'f5\u-27056\'cf\'de\u21046\'d6\'c6\u-244\'a3\'ac\u-28711\'d5\'e2\u20123\'d0\'a9 +\u-27056\'cf\'de\u21046\'d6\'c6\u21482\'d6\'bb\u20801\'d4\'ca\u-29768\'d0\'ed\u24744\'c4\'fa\u20197\'d2\'d4\u29305\'cc\'d8\u23450\'b6\'a8\u30340\'b5\'c4\u26041\'b7\'bd\u24335\'ca\'bd\u20351\'ca\'b9\u29992\'d3\'c3\u26412\'b1\'be\u-28817\'c8\'ed\u20214 +\'bc\'fe\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24744\'c4\'fa\u19981\'b2\'bb\loch\af40\hich\af40\dbch\f13 \u24471\'b5\'c3}{ +\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u32469\'c8\'c6\u-28729\'b9\'fd\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u20013\'d6\'d0\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u25216\'bc\'bc\u26415\'ca\'f5\u-27056\'cf\'de\u21046\'d6\'c6\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u23545\'b6\'d4\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u-28709\'bd\'f8\u-30644\'d0\'d0\u21453\'b7\'b4\u21521 +\'cf\'f2\u24037\'b9\'a4\u31243\'b3\'cc\u12289\'a1\'a2\u21453\'b7\'b4\u21521\'cf\'f2\u32534\'b1\'e0\u-29743\'d2\'eb\u25110\'bb\'f2\u21453\'b7\'b4\u27719\'bb\'e3\u32534\'b1\'e0\u-229\'a3\'bb\u23613\'be\'a1\u31649\'b9\'dc\u26377\'d3\'d0\u27492\'b4\'cb +\u-26503\'cf\'ee\u-27056\'cf\'de\u21046\'d6\'c6\u-244\'a3\'ac\u20294\'b5\'ab\u22914\'c8\'e7\u26524\'b9\'fb\u-28670\'ca\'ca\u29992\'d3\'c3\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u26126\'c3\'f7\u31034\'ca\'be\u20801\'d4\'ca\u-29768\'d0\'ed\u19978 +\'c9\'cf\u-28688\'ca\'f6\u27963\'bb\'ee\u21160\'b6\'af\u-244\'a3\'ac\u21017\'d4\'f2\u20165\'bd\'f6\u22312\'d4\'da\u-28670\'ca\'ca\u29992\'d3\'c3\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u26126\'c3\'f7\u31034\'ca\'be\u20801\'d4\'ca\u-29768\'d0\'ed +\u30340\'b5\'c4\u-31997\'b7\'b6\u22260\'ce\'a7\u20869\'c4\'da\u20174\'b4\'d3\u20107\'ca\'c2\u19978\'c9\'cf\u-28688\'ca\'f6\u27963\'bb\'ee\u21160\'b6\'af\u19981\'b2\'bb\u22312\'d4\'da\u27492\'b4\'cb\u-27056\'cf\'de\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u21046\'d6\'c6\u20316\'d7\'f7\u-29307\'b3\'ac\u-28729\'b9\'fd\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u25152 +\'cb\'f9\u-30268\'b9\'e6\u23450\'b6\'a8\u25110\'bb\'f2\u-28670\'ca\'ca\u29992\'d3\'c3\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u25152\'cb\'f9\u20801\'d4\'ca\u-29768\'d0\'ed\u25968\'ca\'fd\u-28209\'c1\'bf\u-248\'a3\'a8\u23613\'be\'a1\u31649\'b9\'dc +\u26377\'d3\'d0\u27492\'b4\'cb\u-26503\'cf\'ee\u-27056\'cf\'de\u21046\'d6\'c6\u-247\'a3\'a9\u30340\'b5\'c4\u-28817\'c8\'ed\u20214\'bc\'fe\u21103\'b8\'b1\u26412\'b1\'be\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u21457\'b7\'a2\u24067\'b2\'bc\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u20379\'b9\'a9\u20182\'cb\'fb\u20154 +\'c8\'cb\u22797\'b8\'b4\u21046\'d6\'c6\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20986\'b3\'f6\u31199\'d7\'e2\u12289\'a1\'a2\u31199\'d7\'e2\u-29375\'c1\'de\u25110\'bb\'f2\u20986\'b3\'f6\u20511 +\'bd\'e8\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u-229\'a3\'bb}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u23558\'bd\'ab\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u25110\'bb\'f2\u26412\'b1\'be\u21327\'d0\'ad\u-29778 +\'d2\'e9\u-28820\'d7\'aa\u-29783\'c8\'c3\u32473\'b8\'f8\u20219\'c8\'ce\u20309\'ba\'ce\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u-229\'a3\'bb\u25110\'bb\'f2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20351\'ca\'b9\u29992\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u25552\'cc\'e1\u20379\'b9\'a9\u21830 +\'c9\'cc\u19994\'d2\'b5\u-28817\'c8\'ed\u20214\'bc\'fe\u25176\'cd\'d0\u31649\'b9\'dc\u26381\'b7\'fe\u21153\'ce\'f1\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u22791\'b1\'b8\u20221\'b7\'dd\u21103\'b8\'b1\u26412\'b1\'be\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24744 +\'c4\'fa\u21487\'bf\'c9\u20197\'d2\'d4\u21046\'d6\'c6\u20316\'d7\'f7\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u30340\'b5\'c4\u19968\'d2\'bb\u20010\'b8\'f6\u22791\'b1\'b8\u20221\'b7\'dd\u21103\'b8\'b1\u26412\'b1\'be\u12290\'a1\'a3\u-29723\'b8\'c3 +\u21103\'b8\'b1\u26412\'b1\'be\u21482\'d6\'bb\u-32515\'c4\'dc\u29992\'d3\'c3\u20110\'d3\'da\u-28211\'d6\'d8\u26032\'d0\'c2\u23433\'b0\'b2\u-30523\'d7\'b0\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 +\ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 6.\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25991\'ce\'c4\u26723\'b5\'b5\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-32515\'c4\'dc\u22815\'b9\'bb\u21512\'ba\'cf\u27861\'b7\'a8\u-29761\'b7\'c3\u-27154\'ce\'ca\u24744\'c4\'fa\u30340\'b5\'c4 +\loch\af40\hich\af40\dbch\f13 \u-29791\'bc\'c6\u31639\'cb\'e3\u26426\'bb\'fa\u25110\'bb\'f2\u20869\'c4\'da\u-28440\'b2\'bf\u32593\'cd\'f8\u32476\'c2\'e7\u30340\'b5\'c4\u25152\'cb\'f9\u26377\'d3\'d0\u29992\'d3\'c3\u25143\'bb\'a7\u-28419\'b6\'bc\u21487 +\'bf\'c9\u20197\'d2\'d4\u22797\'b8\'b4\u21046\'d6\'c6\u-29723\'b8\'c3\u25991\'ce\'c4\u26723\'b5\'b5\u-244\'a3\'ac\u20294\'b5\'ab\u20165\'bd\'f6\u20379\'b9\'a9\u20869\'c4\'da\u-28440\'b2\'bf\u21442\'b2\'ce\u-32765\'bf\'bc\u20043\'d6\'ae\u29992\'d3\'c3 +\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 7.\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-28820\'d7\'aa\u31227\'d2\'c6\u21040\'b5\'bd\u21478\'c1\'ed\u19968\'d2\'bb\u-29762\'c9\'e8\u22791\'b1\'b8\u12290 +\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u24744\'c4\'fa\u21487\'bf\'c9\u20197\'d2\'d4\u21368\'d0\'b6\u-28803\'d4\'d8 +\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u-244\'a3\'ac\u28982\'c8\'bb\u21518\'ba\'f3\u23433\'b0\'b2\u-30523\'d7\'b0\u21040\'b5\'bd\u21478\'c1\'ed\u19968\'d2\'bb\u21488\'cc\'a8\u-29762\'c9\'e8\u22791\'b1\'b8\u19978\'c9\'cf\u-28709\'bd\'f8\u-30644 +\'d0\'d0\u20351\'ca\'b9\u29992\'d3\'c3\u-244\'a3\'ac\u20294\'b5\'ab\u19981\'b2\'bb\u24471\'b5\'c3\u-28646\'cd\'a8\u-28729\'b9\'fd\u27492\'b4\'cb\u26041\'b7\'bd\u27861\'b7\'a8\u22312\'d4\'da\u22810\'b6\'e0\u21488\'cc\'a8\u-29762\'c9\'e8\u22791\'b1\'b8 +\u19978\'c9\'cf\u20849\'b9\'b2\u20139\'cf\'ed\u27492\'b4\'cb\u-29768\'d0\'ed\u21487\'bf\'c9\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8981218 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20986\'b3\'f6\u21475\'bf\'da\u-27056\'cf\'de\u21046\'d6\'c6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21463\'ca\'dc\u32654\'c3\'c0\u22269\'b9\'fa\u20986\'b3\'f6\u21475\'bf\'da +\u27861\'b7\'a8\u24459\'c2\'c9\u21644\'ba\'cd\u27861\'b7\'a8\u-30268\'b9\'e6\u30340\'b5\'c4\u32422\'d4\'bc\u26463\'ca\'f8\u12290\'a1\'a3\u24744\'c4\'fa\u24517\'b1\'d8\u-26501\'d0\'eb\u-28555\'d7\'f1\u23432\'ca\'d8\u-28670\'ca\'ca\u29992\'d3\'c3\u20110 +\'d3\'da\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u30340\'b5\'c4\u25152\'cb\'f9\u26377\'d3\'d0\u22269\'b9\'fa\u20869\'c4\'da\u21644\'ba\'cd\u22269\'b9\'fa\u-27067\'bc\'ca\u20986\'b3\'f6\u21475\'bf\'da\u27861\'b7\'a8\u24459\'c2\'c9\u21644\'ba\'cd +\u27861\'b7\'a8\u-30268\'b9\'e6\u12290\'a1\'a3\u-28711\'d5\'e2\u20123\'d0\'a9\u27861\'b7\'a8\u24459\'c2\'c9\u21253\'b0\'fc\u25324\'c0\'a8\u23545\'b6\'d4\u30446\'c4\'bf\u30340\'b5\'c4\u22320\'b5\'d8\u12289\'a1\'a2\u26368\'d7\'ee\u32456\'d6\'d5\u29992 +\'d3\'c3\u25143\'bb\'a7\u21644\'ba\'cd\u26368\'d7\'ee\u32456\'d6\'d5\u29992\'d3\'c3\u-28652\'cd\'be\u30340\'b5\'c4\u21508\'b8\'f7\u31181\'d6\'d6\u-27056\'cf\'de\u21046\'d6\'c6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u26377\'d3\'d0\u20851\'b9\'d8\u-29722\'cf\'ea\u32454\'cf\'b8\u20449\'d0\'c5\u24687\'cf\'a2\u-244\'a3\'ac\u-29705\'c7\'eb +\u21442\'b2\'ce\u-27131\'d4\'c4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \hich\af40\dbch\af13\loch\f40 www.microsoft.com/exporting}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid8981218\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 +\cs73\b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25903\'d6\'a7\u25345\'b3\'d6\u26381\'b7\'fe\u21153\'ce\'f1\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u26159\'ca\'c7\u25353\'b0\'b4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8220\'a1\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u29616\'cf\'d6\u29366\'d7\'b4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \uc2\u8221\'a1\'b1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25552\'cc\'e1\u20379\'b9\'a9\u30340\'b5\'c4\u-244\'a3\'ac\u25152\'cb\'f9\u20197\'d2\'d4\u25105\'ce\'d2\u20204\'c3\'c7 +\u21487\'bf\'c9\u-32515\'c4\'dc\u19981\'b2\'bb\u20026\'ce\'aa\u20854\'c6\'e4\u25552\'cc\'e1\u20379\'b9\'a9\u25903\'d6\'a7\u25345\'b3\'d6\u26381\'b7\'fe\u21153\'ce\'f1\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 10.\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u23436\'cd\'ea\u25972\'d5\'fb\u21327\'d0\'ad\u-29778\'d2\'e9\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u26412\'b1\'be\loch\af40\hich\af40\dbch\f13 \u21327\'d0\'ad\u-29778\'d2\'e9\u20197\'d2\'d4\u21450\'bc\'b0\u24744\'c4\'fa +\u20351\'ca\'b9\u29992\'d3\'c3\u30340\'b5\'c4\u-30619\'b2\'b9\u20805\'b3\'e4\u31243\'b3\'cc\u24207\'d0\'f2\u12289\'a1\'a2\u26356\'b8\'fc\u26032\'d0\'c2\u12289\'a1\'a2\u22522\'bb\'f9\u20110\'d3\'da}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Internet }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u30340\'b5\'c4\u26381\'b7\'fe\u21153\'ce\'f1\u21644\'ba\'cd\u25903\'d6\'a7\u25345\'b3\'d6\u26381\'b7\'fe\u21153\'ce\'f1 +\u30340\'b5\'c4\u26377\'d3\'d0\u20851\'b9\'d8\u26465\'cc\'f5\u27454\'bf\'ee\u-244\'a3\'ac\u20849\'b9\'b2\u21516\'cd\'ac\u26500\'b9\'b9\u25104\'b3\'c9\u20102\'c1\'cb\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u21644\'ba\'cd\u25903\'d6\'a7\u25345 +\'b3\'d6\u26381\'b7\'fe\u21153\'ce\'f1\u30340\'b5\'c4\u23436\'cd\'ea\u25972\'d5\'fb\u21327\'d0\'ad\u-29778\'d2\'e9\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe1033\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp1033\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-28670\'ca\'ca\u29992\'d3\'c3\u27861\'b7\'a8\u24459\'c2\'c9\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u32654\'c3\'c0\u22269\'b9\'fa\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22914\'c8\'e7\u26524\'b9\'fb\u24744 +\'c4\'fa\u22312\'d4\'da\u32654\'c3\'c0\u22269\'b9\'fa\u-29395\'b9\'ba\u20080\'c2\'f2\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u-244\'a3\'ac\u21017\'d4\'f2\u23545\'b6\'d4\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u30340\'b5\'c4\u-30237\'bd\'e2 +\u-28214\'ca\'cd\u20197\'d2\'d4\u21450\'bc\'b0\u30001\'d3\'c9\u20110\'d3\'da\u-28707\'ce\'a5\u21453\'b7\'b4\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u-32756\'b6\'f8\u24341\'d2\'fd\u-29321\'c6\'f0\u30340\'b5\'c4\u32034\'cb\'f7\u-29356\'c5\'e2\u22343 +\'be\'f9\u20197\'d2\'d4\u21326\'bb\'aa\u30427\'ca\'a2\u-26497\'b6\'d9\u24030\'d6\'dd\u27861\'b7\'a8\u24459\'c2\'c9\u20026\'ce\'aa\u20934\'d7\'bc\u24182\'b2\'a2\u21463\'ca\'dc\u20854\'c6\'e4\u31649\'b9\'dc\u-28778\'cf\'bd\u-244\'a3\'ac\u-32756\'b6\'f8 +\u19981\'b2\'bb\u-32765\'bf\'bc\u-31151\'c2\'c7\u20914\'b3\'e5\u31361\'cd\'bb\u27861\'b7\'a8\u21407\'d4\'ad\u21017\'d4\'f2\u12290\'a1\'a3\u24744\'c4\'fa\u25152\'cb\'f9\u23621\'be\'d3\u20303\'d7\'a1\u30340\'b5\'c4\u24030\'d6\'dd\u30340\'b5\'c4\u27861 +\'b7\'a8\u24459\'c2\'c9\u31649\'b9\'dc\u-28778\'cf\'bd\u20854\'c6\'e4\u20182\'cb\'fb\u25152\'cb\'f9\u26377\'d3\'d0\u32034\'cb\'f7\u-29356\'c5\'e2\u-26503\'cf\'ee\u30446\'c4\'bf\u-244\'a3\'ac\u21253\'b0\'fc\u25324\'c0\'a8\u26681\'b8\'f9\u25454\'be\'dd +\u24030\'d6\'dd\u28040\'cf\'fb\u-29383\'b7\'d1\u-32763\'d5\'df\u20445\'b1\'a3\u25252\'bb\'a4\u27861\'b7\'a8\u12289\'a1\'a2\u19981\'b2\'bb\u27491\'d5\'fd\u24403\'b5\'b1\u31454\'be\'ba\u20105\'d5\'f9\u27861\'b7\'a8\u20197\'d2\'d4\u21450\'bc\'b0\u20405 +\'c7\'d6\u26435\'c8\'a8\u-30644\'d0\'d0\u20026\'ce\'aa\u25552\'cc\'e1\u20986\'b3\'f6\u30340\'b5\'c4\u30456\'cf\'e0\u20851\'b9\'d8\u32034\'cb\'f7\u-29356\'c5\'e2\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 b.\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u32654\'c3\'c0\u22269\'b9\'fa\u20197\'d2\'d4\u22806\'cd\'e2\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22914\'c8\'e7\u26524\'b9\'fb\u24744\'c4\'fa\u22312\'d4\'da\u20854\'c6\'e4\u20182\'cb\'fb\u20219\'c8\'ce\u20309\'ba\'ce +\u22269\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u-29395\'b9\'ba\u20080\'c2\'f2\u26412\'b1\'be\u-28817\'c8\'ed\u20214\'bc\'fe\u-244\'a3\'ac +\u21017\'d4\'f2\u24212\'d3\'a6\u-28555\'d7\'f1\u23432\'ca\'d8\u24744\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da\u22269\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 +\ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u27861\'b7\'a8\u24459\'c2\'c9\u25928\'d0\'a7\u21147\'c1\'a6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u26412 +\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u-30268\'b9\'e6\u23450\'b6\'a8\u20102\'c1\'cb\u26576\'c4\'b3\u20123\'d0\'a9\u21512\'ba\'cf\u27861\'b7\'a8\u26435\'c8\'a8\loch\af40\hich\af40\dbch\f13 \u21033\'c0\'fb\u12290\'a1\'a3\u26681\'b8\'f9\u25454\'be\'dd +\u24744\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da\u22269\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u-30268\'b9\'e6\u23450 +\'b6\'a8\u-244\'a3\'ac\u24744\'c4\'fa\u21487\'bf\'c9\u-32515\'c4\'dc\u20139\'cf\'ed\u26377\'d3\'d0\u20854\'c6\'e4\u20182\'cb\'fb\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3\u24744\'c4\'fa\u-28712\'bb\'b9\u21487\'bf\'c9\u-32515\'c4\'dc\u20139\'cf\'ed +\u26377\'d3\'d0\u19982\'d3\'eb\u24744\'c4\'fa\u30340\'b5\'c4\u-28817\'c8\'ed\u20214\'bc\'fe\u21334\'c2\'f4\u26041\'b7\'bd\u30456\'cf\'e0\u20851\'b9\'d8\u30340\'b5\'c4\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3\u22914\'c8\'e7\u26524\'b9\'fb\u24744 +\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da\u22269\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u19981\'b2\'bb\u20801 +\'d4\'ca\u-29768\'d0\'ed\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u25913\'b8\'c4\u21464\'b1\'e4\u24744\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da\u22269\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u27861\'b7\'a8\u24459\'c2\'c9\u-29365\'b8\'b3\u20104\'d3\'e8\u24744\'c4\'fa\u30340\'b5\'c4 +\u26435\'c8\'a8\u21033\'c0\'fb\u-244\'a3\'ac\u21017\'d4\'f2\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u23558\'bd\'ab\u19981\'b2\'bb\u25913\'b8\'c4\u21464\'b1\'e4\u24744\'c4\'fa\u25353\'b0\'b4\u29031\'d5\'d5\u25152\'cb\'f9\u22312\'d4\'da\u22269\'b9\'fa +\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b0\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u24212\'d3\'a6\u20139\'cf\'ed\u26377\'d3\'d0 +\u30340\'b5\'c4\u26435\'c8\'a8\u21033\'c0\'fb\u12290\'a1\'a3}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u20445\'b1\'a3\u-29759\'d6\'a4\u20813\'c3\'e2\u-29405\'d4\'f0\u26465\'cc\'f5\u27454\'bf\'ee\u12290\'a1\'a3\u-29723\'b8\'c3 +\u-28817\'c8\'ed\u20214\'bc\'fe\u25353\'b0\'b4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \uc2\u8220\'a1\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u29616\'cf\'d6\u29366\'d7\'b4}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\loch\af13\hich\af13\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \uc2\u8221\'a1\'b1}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25480\'ca\'da\u20104\'d3\'e8\u-29768\'d0\'ed\u21487\'bf\'c9\u12290\'a1\'a3\u24744\'c4\'fa\u-26501\'d0\'eb\u-32278\'d7\'d4 +\u-30644\'d0\'d0\u25215\'b3\'d0\u25285\'b5\'a3\u20351\'ca\'b9\u29992\'d3\'c3\u-29723\'b8\'c3\u-28817\'c8\'ed\u20214\'bc\'fe\u30340\'b5\'c4\u-26418\'b7\'e7\u-27031\'cf\'d5\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 MICROSOFT }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u19981\'b2\'bb\u25552\'cc\'e1\u20379\'b9\'a9\u20219\'c8\'ce\u20309\'ba\'ce\u26126\'c3\'f7\u31034\'ca\'be\u30340\'b5\'c4\u20445 +\'b1\'a3\u-29759\'d6\'a4\u12289\'a1\'a2\u20445\'b1\'a3\u-26980\'d5\'cf\u25110\'bb\'f2\u26465\'cc\'f5\u20214\'bc\'fe\u12290\'a1\'a3\u26681\'b8\'f9\u25454\'be\'dd\u24744\'c4\'fa\u24403\'b5\'b1\u22320\'b5\'d8\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9 +\u-244\'a3\'ac\u24744\'c4\'fa\u21487\'bf\'c9\u-32515\'c4\'dc\u20139\'cf\'ed\u26377\'d3\'d0\u26412\'b1\'be\u21327\'d0\'ad\u-29778\'d2\'e9\u26080\'ce\'de\u27861\'b7\'a8\u25913\'b8\'c4\u21464\'b1\'e4\u30340\'b5\'c4\u20854\'c6\'e4\u20182\'cb\'fb\u28040 +\'cf\'fb\u-29383\'b7\'d1\u-32763\'d5\'df\u26435\'c8\'a8\u21033\'c0\'fb\u25110\'bb\'f2\u27861\'b7\'a8\u23450\'b6\'a8\u20445\'b1\'a3\u-26980\'d5\'cf\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22312\'d4\'da\u24744\'c4\'fa\u24403\'b5\'b1\u22320\'b5\'d8\u27861\'b7\'a8\u24459\'c2\'c9\u20801\'d4\'ca\u-29768\'d0\'ed\u30340 +\'b5\'c4\u-31997\'b7\'b6\u22260\'ce\'a7\u20869\'c4\'da\u-244\'a3\'ac}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 MICROSOFT }{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u25490\'c5\'c5\u-27036\'b3\'fd\u26377\'d3\'d0\u20851\'b9\'d8\u-28670\'ca\'ca\u-27392\'cf\'fa\u24615 +\'d0\'d4\u12289\'a1\'a2\u-27512\'d5\'eb\u23545\'b6\'d4\u29305\'cc\'d8\u23450\'b6\'a8\u30446\'c4\'bf\u30340\'b5\'c4\u30340\'b5\'c4\u-28670\'ca\'ca\u29992\'d3\'c3\u24615\'d0\'d4\loch\af40\hich\af40\dbch\f13 \u21644\'ba\'cd\u19981\'b2\'bb\u20405\'c7\'d6 +\u26435\'c8\'a8\u30340\'b5\'c4\u-24872\'c4\'ac\u31034\'ca\'be\u20445\'b1\'a3\u-29759\'d6\'a4\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b\fs20\expnd0\expndtw4\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 +\loch\af40\hich\af40\dbch\f13 \uc2\u20197\'d2\'d4\u19979\'cf\'c2\u20869\'c4\'da\u23481\'c8\'dd\u-28670\'ca\'ca\u29992\'d3\'c3\u20110\'d3\'da\u28595\'b0\'c4\u22823\'b4\'f3\u21033\'c0\'fb\u20122\'d1\'c7}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b\fs20\expnd0\expndtw4\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 \hich\af40\dbch\af13\loch\f40 - }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\b\fs20\expnd0\expndtw4\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid2841351 \loch\af40\hich\af40\dbch\f13 \uc2\u24744\'c4\'fa\u20139\'cf\'ed\u26377\'d3\'d0\u12298\'a1\'b6\u28595\'b0\'c4\u22823\'b4\'f3\u21033\'c0\'fb +\u20122\'d1\'c7\u28040\'cf\'fb\u-29383\'b7\'d1\u-32763\'d5\'df\u27861\'b7\'a8\u12299\'a1\'b7\u-30268\'b9\'e6\u23450\'b6\'a8\u30340\'b5\'c4\u27861\'b7\'a8\u23450\'b6\'a8\u20445\'b1\'a3\u-26980\'d5\'cf\u-244\'a3\'ac\u-28711\'d5\'e2\u20123\'d0\'a9\u26465 +\'cc\'f5\u27454\'bf\'ee\u20013\'d6\'d0\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u-30268\'b9\'e6\u23450\'b6\'a8\u22343\'be\'f9\u26080\'ce\'de\u24847\'d2\'e2\u24433\'d3\'b0\u21709\'cf\'ec\u-28711\'d5\'e2\u20123\'d0\'a9\u26435\'c8\'a8\u21033\'c0\'fb +\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b\fs20\expnd0\expndtw4\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid2841351 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang2052\langfe2052\loch\af40\hich\af40\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u25439\'cb\'f0\u23475\'ba\'a6\u-30619\'b2\'b9\u20607\'b3\'a5\u-29405\'d4\'f0\u20219\'c8\'ce\u30340\'b5\'c4\u-27056\'cf\'de\u21046\'d6\'c6\u21644\'ba\'cd\u25490\'c5\'c5\u-27036\'b3\'fd\u26465\'cc\'f5\u27454\'bf\'ee\u12290\'a1\'a3\u24744\'c4\'fa\u21482 +\'d6\'bb\u-32515\'c4\'dc\u22240\'d2\'f2\u30452\'d6\'b1\u25509\'bd\'d3\u25439\'cb\'f0\u23475\'ba\'a6\u20174\'b4\'d3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 +\hich\af40\dbch\af13\loch\f40 MICROSOFT }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u21450\'bc\'b0\u20854\'c6\'e4\u20379\'b9\'a9 +\u24212\'d3\'a6\u21830\'c9\'cc\u22788\'b4\'a6\u-31817\'bb\'f1\u24471\'b5\'c3\u-28672\'cd\'cb\u27454\'bf\'ee\u-244\'a3\'ac\u19988\'c7\'d2\u-28672\'cd\'cb\u27454\'bf\'ee\u-28207\'bd\'f0\u-26467\'b6\'ee\u19978\'c9\'cf\u-27056\'cf\'de\u20026\'ce\'aa}{ +\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 5.00 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u32654\'c3\'c0\u20803\'d4\'aa\u12290\'a1\'a3\u24744\'c4\'fa\u19981\'b2\'bb\u-32515\'c4\'dc\u22240\'d2\'f2\u20854\'c6\'e4\u20182 +\'cb\'fb\u20219\'c8\'ce\u20309\'ba\'ce\u25439\'cb\'f0\u23475\'ba\'a6\u-31817\'bb\'f1\u24471\'b5\'c3\u-28672\'cd\'cb\u27454\'bf\'ee\u-244\'a3\'ac\u21253\'b0\'fc\u25324\'c0\'a8\u21518\'ba\'f3\u26524\'b9\'fb\u24615\'d0\'d4\u25439\'cb\'f0\u23475\'ba\'a6 +\u12289\'a1\'a2\u21033\'c0\'fb\u28070\'c8\'f3\u25439\'cb\'f0\u22833\'ca\'a7\u12289\'a1\'a2\u29305\'cc\'d8\u21035\'b1\'f0\u30340\'b5\'c4\u25439\'cb\'f0\u23475\'ba\'a6\u12289\'a1\'a2\u-27148\'bc\'e4\u25509\'bd\'d3\u25439\'cb\'f0\u23475\'ba\'a6\u25110 +\'bb\'f2\u-27068\'b8\'bd\u24102\'b4\'f8\u24615\'d0\'d4\u25439\'cb\'f0\u23475\'ba\'a6\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe1033\dbch\af13\langnp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u-29723\'b8\'c3 +\u-27056\'cf\'de\u21046\'d6\'c6\u-28670\'ca\'ca\u29992\'d3\'c3\u20110\'d3\'da\u-230\'a3\'ba}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u19982\'d3\'eb\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Internet }{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u31449\'d5\'be\u28857\'b5\'e3\u19978\'c9\'cf\u30340\'b5\'c4\u-28817\'c8\'ed\u20214\'bc\'fe\u12289 +\'a1\'a2\u26381\'b7\'fe\u21153\'ce\'f1\u12289\'a1\'a2\u20869\'c4\'da\u23481\'c8\'dd\u-248\'a3\'a8\u21253\'b0\'fc\u25324\'c0\'a8\u20195\'b4\'fa\u30721\'c2\'eb\u-247\'a3\'a9\u25110\'bb\'f2\u31532\'b5\'da\u19977\'c8\'fd\u26041\'b7\'bd\u31243\'b3\'cc\u24207 +\'d0\'f2\u30456\'cf\'e0\u20851\'b9\'d8\u30340\'b5\'c4\u20219\'c8\'ce\u20309\'ba\'ce\u24773\'c7\'e9\u20917\'bf\'f6\u-229\'a3\'bb\u20197\'d2\'d4\u21450\'bc\'b0}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\loch\af3\hich\af3\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40\afs20 +\ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22312\'d4\'da\u-28670\'ca\'ca\u29992\'d3\'c3\u30340\'b5\'c4\u27861\'b7\'a8\u24459\'c2\'c9\u20801\'d4\'ca\u-29768 +\'d0\'ed\u30340\'b5\'c4\u-31997\'b7\'b6\u22260\'ce\'a7\u20869\'c4\'da\u-244\'a3\'ac\u22240\'d2\'f2\u-28707\'ce\'a5\loch\af40\hich\af40\dbch\f13 \u32422\'d4\'bc\u12289\'a1\'a2\u-28707\'ce\'a5\u21453\'b7\'b4\u20445\'b1\'a3\u-29759\'d6\'a4\u12289\'a1\'a2 +\u20445\'b1\'a3\u-26980\'d5\'cf\u25110\'bb\'f2\u26465\'cc\'f5\u20214\'bc\'fe\u12289\'a1\'a2\u20005\'d1\'cf\u26684\'b8\'f1\u-29405\'d4\'f0\u20219\'c8\'ce\u12289\'a1\'a2\u-28729\'b9\'fd\u22833\'ca\'a7\u25110\'bb\'f2\u20854\'c6\'e4\u20182\'cb\'fb\u20405 +\'c7\'d6\u26435\'c8\'a8\u-30644\'d0\'d0\u20026\'ce\'aa\u24341\'d2\'fd\u-29321\'c6\'f0\u30340\'b5\'c4\u32034\'cb\'f7\u-29356\'c5\'e2\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 +\uc2\u21363\'bc\'b4\u20351\'ca\'b9}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \hich\af40\dbch\af13\loch\f40 Microsoft }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid11828113\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u30693\'d6\'aa\u-28589\'b5\'c0\u25110\'bb\'f2\u24212\'d3\'a6\u-29723\'b8\'c3\u30693\'d6\'aa\u-28589\'b5\'c0\u21487\'bf\'c9 +\u-32515\'c4\'dc\u20250\'bb\'e1\u20986\'b3\'f6\u29616\'cf\'d6\u25439\'cb\'f0\u23475\'ba\'a6\u-244\'a3\'ac\u27492\'b4\'cb\u-26503\'cf\'ee\u-27056\'cf\'de\u21046\'d6\'c6\u20063\'d2\'b2\u21516\'cd\'ac\u26679\'d1\'f9\u-28670\'ca\'ca\u29992\'d3\'c3\u12290 +\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u30001\'d3\'c9\u20110\'d3\'da\u24744\'c4\'fa\u25152\'cb\'f9\u22312\'d4\'da\u22269 +\'b9\'fa\u23478\'bc\'d2}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \hich\af40\dbch\af13\loch\f40 /}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang2052\langfe2052\dbch\af13\langnp2052\langfenp2052\insrsid15489648\charrsid14961098 \loch\af40\hich\af40\dbch\f13 \uc2\u22320\'b5\'d8\u21306\'c7\'f8\u21487\'bf\'c9\u-32515\'c4\'dc\u19981\'b2\'bb\u20801\'d4\'ca\u-29768\'d0\'ed\u25490\'c5\'c5 +\u-27036\'b3\'fd\u25110\'bb\'f2\u-27056\'cf\'de\u21046\'d6\'c6\u-27068\'b8\'bd\u24102\'b4\'f8\u25439\'cb\'f0\u23475\'ba\'a6\u12289\'a1\'a2\u21518\'ba\'f3\u26524\'b9\'fb\u24615\'d0\'d4\u25439\'cb\'f0\u23475\'ba\'a6\u25110\'bb\'f2\u20854\'c6\'e4\u20182 +\'cb\'fb\u25439\'cb\'f0\u23475\'ba\'a6\u30340\'b5\'c4\u-29356\'c5\'e2\u20607\'b3\'a5\u-29405\'d4\'f0\u20219\'c8\'ce\u-244\'a3\'ac\u22240\'d2\'f2\u27492\'b4\'cb\u19978\'c9\'cf\u-28688\'ca\'f6\u-27056\'cf\'de\u21046\'d6\'c6\u25110\'bb\'f2\u25490\'c5\'c5 +\u-27036\'b3\'fd\u26465\'cc\'f5\u27454\'bf\'ee\u21487\'bf\'c9\u-32515\'c4\'dc\u23545\'b6\'d4\u24744\'c4\'fa\u19981\'b2\'bb\u-28670\'ca\'ca\u29992\'d3\'c3\u12290\'a1\'a3}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe2052\dbch\af13\langfenp2052\insrsid4684770\charrsid14961098 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000001028 +ad23dbb9ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.CHT.rtf b/setup/resources/eula/VF_EULA.CHT.rtf new file mode 100644 index 00000000000..399d2e60ff2 --- /dev/null +++ b/setup/resources/eula/VF_EULA.CHT.rtf @@ -0,0 +1,897 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f14\fbidi \froman\fcharset136\fprq2{\*\panose 02020300000000000000}PMingLiU{\*\falt !Ps2OcuAe};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f366\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};} +{\f481\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f509\fbidi \froman\fcharset136\fprq2{\*\panose 02020300000000000000}@PMingLiU;} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f627\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f628\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f630\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f631\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f632\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f633\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f634\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f635\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f647\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f648\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f650\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f651\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f652\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f653\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f654\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f655\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f739\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f737\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f738\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f740\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f741\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f744\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f769\fbidi \froman\fcharset0\fprq2 PMingLiU Western{\*\falt !Ps2OcuAe};}{\f967\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f968\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f970\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f971\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f974\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f975\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f1007\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f1008\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};} +{\f1010\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f1011\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f1012\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};} +{\f1013\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f1014\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f1015\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};} +{\f1016\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f4287\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f4288\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};} +{\f4290\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f4291\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f4294\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};} +{\f5439\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f5437\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f5438\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f5440\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f5441\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f5444\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f5719\fbidi \froman\fcharset0\fprq2 @PMingLiU Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 \styrsid5976185 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af366 \ltrch\fcs0 \b\f366\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\sbasedon10 page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f366\hich\af366\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f366\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs107 \additive \rtlch\fcs1 +\ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon106 \slink105 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}{ +\s111\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\f38\hich\af38\dbch\af14\cgrid\langnp1028\langfenp1028 +\sbasedon0 \snext0 \slink112 \sunhideused \styrsid9711861 Salutation;}{\*\cs112 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\f38\hich\af38\dbch\af14\langnp1028\langfenp1028 \sbasedon10 \slink111 \slocked \styrsid9711861 +Salutation Char;}{\s113\ql \li4320\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin4320\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\f38\hich\af38\dbch\af14\cgrid\langnp1028\langfenp1028 +\sbasedon0 \snext113 \slink114 \styrsid9711861 Closing;}{\*\cs114 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\f38\hich\af38\dbch\af14\langnp1028\langfenp1028 \sbasedon10 \slink113 \slocked \styrsid9711861 Closing Char;}} +{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 +\b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 +\b0\i0\f366\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 +\b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4 +\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 } +{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \s5\fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \s6 +\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 +\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 } +{\listname ;}\listid974869818}{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li7557\lin7557 }{\listname ;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid161303\rsid462051\rsid1924811\rsid2508538\rsid2885526\rsid3490511\rsid3755635\rsid4684770\rsid5194178\rsid5519702\rsid5858028\rsid5911604\rsid5976185\rsid6571774\rsid7280171\rsid7496237\rsid8613930\rsid8995704\rsid9196108\rsid9336866 +\rsid9651127\rsid9711861\rsid9963773\rsid9984413\rsid10625809\rsid10703978\rsid10899258\rsid11349222\rsid11422587\rsid11758563\rsid11828113\rsid12676651\rsid12799225\rsid13507249\rsid13637954\rsid14356214\rsid14375208\rsid14446677\rsid15548830 +\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo9\dy24\hr20\min27}{\version1}{\edmins0}{\nofpages3} +{\nofwords416}{\nofchars2373}{\nofcharsws2784}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9984413 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9984413 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9984413 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9984413 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid7280171 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid7280171 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid7280171 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid7280171 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid7280171 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid7280171 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 MICROSOFT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28961\'b3\'6e\u-25900\'c5\'e9\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 +MICROSOFT VISUAL F#}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u26412\'a5\'bb\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u20418\'ab\'59\u19968\'a4\'40\u20221\'a5\'f7\u30001\'a5\'d1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20844\'a4\'bd\u21496\'a5\'71}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25110\'a9\'ce\u20854\'a8\'e4\u-27172\'c3\'f6\u20418\'ab\'59\u20225\'a5\'f8\u26989\'b7\'7e\u-244\'a1\'41\u-30314\'b5\'f8 +\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u23621\'a9\'7e\u20303\'a6\'ed\u30340\'aa\'ba\u22320\'a6\'61\u-24866\'c2\'49\u-32756\'a6\'d3\u23450\'a9\'77}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 ) }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-32249\'bb\'50\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u-27245\'b6\'a1\u25152\'a9\'d2 +\u25104\'a6\'a8\u31435\'a5\'df\u20043\'a4\'a7\u21332\'a8\'f3\u-29840\'c4\'b3\u12290\'a1\'43\u-30005\'bd\'d0\loch\af38\hich\af38\dbch\f14 \u20180\'a5\'4a\u32048\'b2\'d3\u-27215\'be\'5c\u-29824\'c5\'aa\u-28647\'b3\'6f\u20123\'a8\'c7\u25480\'b1\'c2\u27402 +\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u12290\'a1\'43\u-28647\'b3\'6f\u20123\'a8\'c7\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u-28567\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3\u19978\'a4\'57\u-28688\'ad\'7a\u-28961\'b3\'6e\u-25900\'c5\'e9 +\u-244\'a1\'41\u21253\'a5\'5d\u25324\'ac\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u25910\'a6\'ac\u21463\'a8\'fc\u30340\'aa\'ba\u23186\'b4\'43\u-25900\'c5\'e9}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22914\'a6\'70\u26524\'aa\'47\u26377\'a6\'b3\u30340\'aa\'ba\u-30095\'b8\'dc}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28647\'b3\'6f\u20123\'a8\'c7\u26781\'b1\'f8\u27454\'b4\'da\u20134\'a5\'e7\u-28567\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3 +\u20219\'a5\'f4\u20309\'a6\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20043\'a4\'a7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u26356\'a7\'f3\u26032\'b7\'73\u31243\'b5\'7b\u24335\'a6\'a1\u12289\'a1\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22686\'bc\'57\u-30500\'b8\'c9\u31243\'b5\'7b\u24335\'a6\'a1\u12289\'a1\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u32178\'ba\'f4\u-26981\'bb\'da\u32178\'ba\'f4\u-29201\'b8\'f4\u26381\'aa\'41\u21209\'b0\'c8\u-32249\'bb\'50}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25903\'a4\'e4\u25588\'b4\'a9\u26381\'aa\'41\u21209\'b0\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u20294\'a6\'fd\u-32027\'ad\'59\u19978\'a4\'57\u-28688\'ad\'7a\u-26619\'b6\'b5\u30446\'a5\'d8\u21478\'a5\'74\u-27068\'aa\'fe\u26377\'a6\'b3\u20854\'a8\'e4\u20182\'a5\'4c\u26781\'b1\'f8\u27454\'b4\'da\u-244\'a1\'41}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21063\'ab\'68\u20854\'a8\'e4\u20182\'a5\'4c\u26781\'b1\'f8\u27454\'b4\'da\u20778\'c0\'75\u20808\'a5\'fd\u-28567\'be\'41 +\u29992\'a5\'ce\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28961\'b3\'6e\u-25900\'c5\'e9\u19968\'a4\'40\u32147\'b8\'67\u20351\'a8\'cf\u29992 +\'a5\'ce\u-244\'a1\'41\u21363\'a7\'59\u-30616\'aa\'ed\u31034\'a5\'dc\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u21516\'a6\'50\u24847\'b7\'4e\u25509\'b1\'b5\u21463\'a8\'fc\u-28647\'b3\'6f\u20123\'a8\'c7\u25480\'b1\'c2\u27402\'c5\'76 +\u26781\'b1\'f8\u27454\'b4\'da\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-32027\'ad\'59\u12288\'a1\'40\u-29516 +\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u19981\'a4\'a3\u21516\'a6\'50\u24847\'b7\'4e\u-28647\'b3\'6f\u20123\'a8\'c7\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u-244\'a1\'41\u-30005\'bd\'d0\u19981\'a4\'a3\u-30335\'ad\'6e\u20351\'a8\'cf +\u29992\'a5\'ce\u-28961\'b3\'6e\u-25900\'c5\'e9\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-32027\'ad\'59\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u-28555\'bf\'ed\u23432\'a6\'75\u26412\'a5\'bb\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u-244\'a1\'41\u21063\'ab\'68\u12288\'a1\'40\u-29516\'b6\'51\u29992 +\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u20139\'a8\'c9\u26377\'a6\'b3\u20197\'a5\'48\u19979\'a4\'55\u21508\'a6\'55\u-26619\'b6\'b5\u27704\'a5\'c3\u20037\'a4\'5b\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10899258 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u23433\'a6\'77\u-30499\'b8\'cb\u-32249\'bb\'50\u20351\'a8\'cf\u29992\'a5\'ce\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u26044\'a9\'f3\u12288\'a1\'40\u-29516\'b6\'51 +\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u-30499\'b8\'cb\u32622\'b8\'6d\u23433\'a6\'77\u-30499\'b8\'cb\u-32249\'bb\'50\u20351\'a8\'cf\u29992\'a5\'ce\u20219\'a5\'f4\u20309\'a6\'f3\u25976\'bc\'c6\u30446\'a5\'d8\u30340\'aa\'ba\u-28961\'b3\'6e\u-25900 +\'c5\'e9\u25335\'ab\'fe\u-29539\'a8\'a9\u-244\'a1\'41\u20197\'a5\'48\u-30163\'b3\'5d\u-30200\'ad\'70\u12289\'a1\'42\u-27253\'b6\'7d\u30332\'b5\'6f\u21450\'a4\'ce\u28204\'b4\'fa\u-30106\'b8\'d5\u12288\'a1\'40\loch\af38\hich\af38\dbch\f14 \u-29516\'b6\'51 +\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u31243\'b5\'7b\u24335\'a6\'a1\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20854\'a8\'e4\u20182\'a5\'4c\u25480\'b1\'c2\u27402\'c5\'76\u-30335\'ad\'6e\u20214\'a5\'f3\u21450\'a4\'ce}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25110\'a9\'ce\u20351\'a8\'cf\u29992\'a5\'ce\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\loch\af38\hich\af38\dbch\f14 \uc2\u-32027\'ad\'59\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u-28555\'bf\'ed\u23432\'a6\'75\u20197\'a5\'48\u19979\'a4\'55\u26781\'b1\'f8\u27454\'b4\'da\u-244\'a1\'41\u21063\'ab\'68\u12288\'a1\'40\u-29516 +\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u26044\'a9\'f3\u-32278\'a6\'db\u24049\'a4\'76\u-27253\'b6\'7d\u30332\'b5\'6f\u30340\'aa\'ba\u31243\'b5\'7b\u24335\'a6\'a1\u20013\'a4\'a4\u25955\'b4\'b2\u24067\'a5\'ac\u-28961\'b3\'6e\u-25900\'c5\'e9 +\u21253\'a5\'5d\u21547\'a7\'74\u30340\'aa\'ba\u-28440\'b3\'a1\u20998\'a4\'c0\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u20351\'a8\'cf\u29992\'a5\'ce\u21450\'a4\'ce\u25955\'b4\'b2\u24067\'a5\'ac\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u19979\'a4\'55\u21015\'a6\'43\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u-32249\'bb\'50\u25991\'a4\'e5\u23383\'a6\'72 +\u27284\'c0\'c9\u28858\'ac\'b0\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 +REDIST.TXT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u27284\'c0\'c9\u26696\'ae\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u20197\'a5\'48\u30446\'a5\'d8 +\u30340\'aa\'ba\u30908\'bd\'58\u24418\'a7\'ce\u24335\'a6\'a1\u-244\'a1\'41\u-30457\'bd\'c6\u-30467\'bb\'73\u20006\'a8\'c3\u25955\'b4\'b2\u24067\'a5\'ac\u21015\'a6\'43\u31034\'a5\'dc\u26044\'a9\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 REDIST.TXT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u27284\'c0\'c9\u26696\'ae\'d7\u20013\'a4\'a4\u30340\'aa\'ba\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12290\'a1\'43}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u31532\'b2\'c4\u19977\'a4\'54\u20154\'a4\'48\u25955\'b4\'b2\u24067\'a5\'ac}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u21516\'a6\'50\u24847\'b7\'4e +\u31243\'b5\'7b\u24335\'a6\'a1\u32147\'b8\'67\u-27977\'be\'50\u21830\'b0\'d3\u23559\'b1\'4e\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u-30314\'b5\'f8\u28858\'ac\'b0\u12288 +\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u31243\'b5\'7b\u24335\'a6\'a1\u30340\'aa\'ba\u19968\'a4\'40\u-28440\'b3\'a1\u20998\'a4\'c0\u-244\'a1\'41\u-28622\'b6\'69\u-30644\'a6\'e6\u-30457\'bd\'c6\u-30467\'bb\'73\u-32249\'bb\'50 +\u25955\'b4\'b2\u24067\'a5\'ac\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u25955\'b4\'b2\u24067\'a5\'ac\u-30335\'ad\'6e\u20214\'a5\'f3\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-28195\'b0\'77\u23565\'b9\'ef\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25955\'b4\'b2\u24067\'a5\'ac\u30340\'aa\'ba\u20219\'a5\'f4\u20309\'a6\'f3\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335 +\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u-244\'a1\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24517\'a5\'b2\u-26616\'b6\'b7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u22312\'a6\'62\loch\af38\hich\af38\dbch\f14 \u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u30340\'aa\'ba\u31243\'b5\'7b\u24335\'a6\'a1\u20013\'a4\'a4\u-244\'a1\'41\u28858\'ac\'b0\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067 +\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u21152\'a5\'5b\u20837\'a4\'4a\u-28211\'ad\'ab\u-30335\'ad\'6e\u30340\'aa\'ba\u26032\'b7\'73\u21151\'a5\'5c\u-32515\'af\'e0\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28195\'b0\'77\u23565\'b9\'ef\u20219\'a5\'f4\u20309\'a6\'f3\u21103\'b0\'c6\u27284\'c0\'c9\u21517\'a6\'57\u28858 +\'ac\'b0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 .lib }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u30340\'aa\'ba\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301 +\'a1\'76\u-244\'a1\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20677\'b6\'c8\u24471\'b1\'6f\u25955\'b4\'b2\u24067\'a5\'ac\u-28657\'b3\'7a\u-28594\'b9\'4c\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u31243\'b5\'7b +\u24335\'a6\'a1\u20043\'a4\'a7\u-28637\'b3\'73\u32080\'b5\'b2\u22120\'be\'b9\u22519\'b0\'f5\u-30644\'a6\'e6\u-28647\'b3\'6f\u-26530\'c3\'fe\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301 +\'a1\'76\u25152\'a9\'d2\u29986\'b2\'a3\u29983\'a5\'cd\u30340\'aa\'ba\u32080\'b5\'b2\u26524\'aa\'47\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25955\'b4\'b2\u24067\'a5\'ac\u21253\'a5\'5d\u21547\'a7\'74\u26044\'a9\'f3\u26576\'ac\'59\u19968\'a4\'40\u23433 +\'a6\'77\u-30499\'b8\'cb\u31243\'b5\'7b\u24335\'a6\'a1\u20013\'a4\'a4\u30340\'aa\'ba\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u26178\'ae\'c9\u-244\'a1\'41\u20677\'b6\'c8 +\u-32515\'af\'e0\u20570\'b0\'b5\u28858\'ac\'b0\u-30094\'b8\'d3\u23433\'a6\'77\u-30499\'b8\'cb\u31243\'b5\'7b\u24335\'a6\'a1\u20043\'a4\'a7\u19968\'a4\'40\u-28440\'b3\'a1\u20998\'a4\'c0\u-28622\'b6\'69\u-30644\'a6\'e6\u25955\'b4\'b2\u24067\'a5\'ac\u-244 +\'a1\'41\u19988\'a5\'42\u19981\'a4\'a3\u24471\'b1\'6f\u32147\'b8\'67\u-28594\'b9\'4c\u20219\'a5\'f4\u20309\'a6\'f3\u20462\'ad\'d7\u25913\'a7\'ef\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-30335\'ad\'6e\u27714\'a8\'44\u25955\'b4\'b2\u24067\'a5\'ac\u-32763\'aa\'cc\u21450\'a4\'ce\u22806\'a5\'7e\u-28440 +\'b3\'a1\u32066\'b2\'d7\u31471\'ba\'dd\u20351\'a8\'cf\u29992\'a5\'ce\u-32763\'aa\'cc\u21516\'a6\'50\u24847\'b7\'4e\u12300\'a1\'75\u20445\'ab\'4f\u-29833\'c5\'40\u12302\'a1\'79\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u20803\'a4\'b8\u20214\'a5\'f3 +\u12303\'a1\'7a\u30340\'aa\'ba\u31243\'b5\'7b\u24230\'ab\'d7\u19981\'a4\'a3\u24471\'b1\'6f\u20302\'a7\'43\u26044\'a9\'f3\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u12301\'a1\'76\u20043\'a4\'a7\u30456\'ac\'db\u-27172\'c3\'f6\u26781\'b1\'f8\u27454 +\'b4\'da\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22312\'a6\'62\u31243\'b5\'7b\u24335\'a6\'a1\u20013\'a4\'a4\u-26513\'c5\'e3\u31034\'a5\'dc\u26377\'a6\'b3\u25928 +\'ae\'c4\u30340\'aa\'ba\u-31657\'b5\'db\u20316\'a7\'40\u27402\'c5\'76\loch\af38\hich\af38\dbch\f14 \u27161\'bc\'d0\loch\af38\hich\af38\dbch\f14 \u31034\'a5\'dc\u-229\'a1\'46\u21644\'a9\'4d}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-32027\'ad\'59\u22240\'a6\'5d\u25955\'b4\'b2\u24067\'a5\'ac\u25110\'a9\'ce\u20351\'a8\'cf\u29992\'a5\'ce\u12288 +\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u31243\'b5\'7b\u24335\'a6\'a1\u-32756\'a6\'d3\u20351\'a8\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28563\'be\'44\u20182\'a5\'4c\u20154\'a4\'48\u25552\'b4\'a3\u20986\'a5\'58\u32034\'af\'c1\u-29472\'bd\'df\u26178\'ae\'c9\u-244 +\'a1\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25033\'c0\'b3\u-29472\'bd\'df\loch\af38\hich\af38\dbch\f14 \u20767\'c0\'76}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20043\'a4\'a7\u25613\'b7\'6c\u22833\'a5\'a2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 \hich\af38\dbch\af14\loch\f38 (}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21253\'a5\'5d\u25324\'ac\'41\u24459\'ab\'df\u24107\'ae\'76\u-29509\'b6\'4f}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 )}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\loch\af38\hich\af38\dbch\f14 \uc2\u-244\'a1\'41\u20351\'a8\'cf\u20043\'a4\'a7\u20813\'a7\'4b\u-28563\'be\'44\u25613\'b7\'6c\u23475\'ae\'60\u-244\'a1\'41\u20006\'a8\'c3\u20986\'a5\'58\u-26782\'ad\'b1\u20195\'a5\'4e\u28858\'ac\'b0\u-28753\'c5\'47\u-29833 +\'c5\'40\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u25955\'b4\'b2\u24067\'a5\'ac\u-27056\'ad\'ad\u21046\'a8\'ee\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u19981\'a4\'a3\u24471\'b1\'6f}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-29814\'c5\'dc\u26356\'a7\'f3\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u20013\'a4\'a4\u20043\'a4\'a7\u20219\'a5\'f4\u20309\'a6\'f3\u-31657\'b5\'db\u20316\'a7\'40\u27402 +\'c5\'76\u12289\'a1\'42\u21830\'b0\'d3\u27161\'bc\'d0\u25110\'a9\'ce\u23560\'b1\'4d\u21033\'a7\'51\u27161\'bc\'d0\u31034\'a5\'dc\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26044\'a9\'f3\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u30340\'aa\'ba\u31243\'b5\'7b\u24335 +\'a6\'a1\u21517\'a6\'57\u31281\'ba\'d9\u20351\'a8\'cf\u29992\'a5\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u30340\'aa\'ba\u21830\'b0\'d3\u27161\'bc\'d0\u-244\'a1\'41\u25110\'a9\'ce\u26263\'b7\'74\u31034\'a5\'dc +\u31243\'b5\'7b\u24335\'a6\'a1\u20358\'a8\'d3\u-32278\'a6\'db}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25110\'a9\'ce\u32147\'b8\'67\u30001\'a5\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-32564\'ad\'49\u26360\'ae\'d1\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25955\'b4\'b2\u24067\'a5\'ac\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335 +\'a6\'a1\u30908\'bd\'58\u12301\'a1\'76\u20006\'a8\'c3\u26044\'a9\'f3\u-26786\'ab\'44}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Windows }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u30340\'aa\'ba\u24179\'a5\'ad\u21488\'a5\'78\u19978\'a4\'57\u22519\'b0\'f5\u-30644\'a6\'e6 +\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u23559\'b1\'4e\u12300\'a1\'75\u21487\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908 +\'bd\'58\u12301\'a1\'76\u32622\'b8\'6d\u26044\'a9\'f3\u24801\'b4\'63\u24847\'b7\'4e\u12289\'a1\'42\u27450\'b4\'db\u-26087\'c4\'46\u25110\'a9\'ce\u-28587\'b9\'48\u27861\'aa\'6b\u30340\'aa\'ba\u31243\'b5\'7b\u24335\'a6\'a1\u20013\'a4\'a4\u-229\'a1\'46 +\u25110\'a9\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20462\'ad\'d7\u25913\'a7\'ef\u25110\'a9\'ce\u25955\'b4\'b2\u24067\'a5\'ac\u20219\'a5\'f4\u20309\'a6\'f3\u21487 +\'a5\'69\u25955\'b4\'b2\u24067\'a5\'ac\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u30340\'aa\'ba\u21407\'ad\'ec\u22987\'a9\'6c\u30908\'bd\'58\u-244\'a1\'41\u20351\'a8\'cf\u20854\'a8\'e4\u20219\'a5\'f4\u20309\'a6\'f3\u-28440\'b3\'a1\u20998\'a4\'c0\u21463 +\'a8\'fc\u21040\'a8\'ec\u-27036\'b0\'a3\u22806\'a5\'7e\u25480\'b1\'c2\u27402\'c5\'76\u20043\'a4\'a7\u32004\'ac\'f9\u26463\'a7\'f4\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12300\'a1\'75\u-27036\'b0\'a3\u22806\'a5\'7e\u25480\'b1\'c2\u27402\'c5\'76\u12301\'a1\'76\u20418\'ab\'59\u25351\'ab\'fc\u22312 +\'a6\'62\loch\af38\hich\af38\dbch\f14 \u20351\'a8\'cf\u29992\'a5\'ce\u12289\'a1\'42\u20462\'ad\'d7\u25913\'a7\'ef\u25110\'a9\'ce\u25955\'b4\'b2\u24067\'a5\'ac\u26178\'ae\'c9\u-244\'a1\'41\u25033\'c0\'b3\u-28555\'bf\'ed\u23432\'a6\'75\u19979\'a4\'55\u21015 +\'a6\'43\u26781\'b1\'f8\u20214\'a5\'f3\u-230\'a1\'47}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u24517\'a5\'b2\u-26616\'b6\'b7\u20197\'a5\'48\u21407\'ad\'ec\u22987\'a9\'6c\u30908\'bd\'58\u24418\'a7\'ce\u24335\'a6\'a1\u25581\'b4\'a6\u-26830\'c5\'53\u25110\'a9\'ce\u25955\'b4\'b2\u24067\'a5\'ac\u-244 +\'a1\'41\u25110\'a9\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25552\'b4\'a3\u20379\'a8\'d1\u20182\'a5\'4c\u20154\'a4\'48\u20462\'ad\'d7\u25913\'a7\'ef\u30340\'aa\'ba\u27402\'c5\'76\u21033 +\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8\u24288\'bc\'74\u21830\'b0\'d3\u31243\'b5\'7b\u24335\'a6\'a1\u-32249\'bb\'50\u-32654\'c1\'6e\u26126\'a9\'fa\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26412\'a5\'bb\u-28961\'b3\'6e\u-25900\'c5\'e9\u21253\'a5\'5d\u21547\'a7\'74\u20043\'a4\'a7\u20854\'a8\'e4\u20182\'a5\'4c +\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8\u24288\'bc\'74\u21830\'b0\'d3\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u20418\'ab\'59\u30001\'a5\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26681\'ae\'da\u25818\'be\'da\u26412\'a5\'bb\u25480\'b1\'c2\u27402\'c5\'76\u21512\'a6\'58\u32004\'ac\'f9\u25480\'b1\'c2 +\u27402\'c5\'76\u20104\'a4\'a9\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u-244\'a1\'41\u-32756\'a6\'d3\u-26786\'ab\'44\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8\u24288\'bc\'74\u21830\'b0\'d3\u26681\'ae\'da\u25818\'be\'da\u20854 +\'a8\'e4\u20182\'a5\'4c\u25480\'b1\'c2\u27402\'c5\'76\u26781\'b1\'f8\u27454\'b4\'da\u25480\'b1\'c2\u27402\'c5\'76\u20104\'a4\'a9\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u12290\'a1\'43\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8 +\u24288\'bc\'74\u21830\'b0\'d3\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58\u30340\'aa\'ba\u-32654\'c1\'6e\u26126\'a9\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\hich\af38\dbch\af14\loch\f38 (}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22914\'a6\'70\u26524\'aa\'47\u26377\'a6\'b3\u30340 +\'aa\'ba\u-30095\'b8\'dc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 ) }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26371\'b7\'7c\u21253\'a5\'5d\u21547\'a7\'74\u26044\'a9\'f3\u-28961\'b3\'6e\u-25900\'c5\'e9\u20013\'a4\'a4\u-244\'a1\'41 +\u20006\'a8\'c3\u21487\'a5\'69\u26044\'a9\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 ThirdPartyNotices.txt }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u27284\'c0\'c9\u26696\'ae\'d7\u20013\'a4\'a4\u25214\'a7\'e4\u21040\'a8\'ec\u12290\'a1\'43}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid11758563\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25480\'b1\'c2\u27402\'c5\'76\u31684\'bd\'64\u22285\'b3\'f2\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28961\'b3\'6e\u-25900\'c5\'e9\u20418\'ab\'59\u25480\'b1\'c2\u27402\'c5\'76\u20351\'a8\'cf\u29992\'a5\'ce\u-244\'a1\'41 +\u-32756\'a6\'d3\u-26786\'ab\'44\u20986\'a5\'58\u21806\'b0\'e2\u-29469\'bd\'e6\u26039\'c2\'5f\u12290\'a1\'43\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u20677\'b6\'c8\u25552\'b4\'a3\u20379\'a8\'d1\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142 +\'a4\'e1\u20351\'a8\'cf\u29992\'a5\'ce\u-28961\'b3\'6e\u-25900\'c5\'e9\u30340\'aa\'ba\u-28440\'b3\'a1\u20998\'a4\'c0\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43\u20445\'ab\'4f\u30041\'af\'64\u25152\'a9\'d2\u26377\'a6\'b3\u20854\'a8\'e4\u20182\'a5\'4c +\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43\u-27036\'b0\'a3\u-26786\'ab\'44\u30456\'ac\'db\u-27172\'c3\'f6\u27861\'aa\'6b\u24459\'ab\'df\u-29466\'bd\'e1\u20104\'a4\'a9\u12288\'a1\'40\loch\af38\hich\af38\dbch\f14 \u-29516\'b6\'51\u29992\'a5\'ce\u25142 +\'a4\'e1\u-29307\'b6\'57\u20986\'a5\'58\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u-27056\'ad\'ad\u21046\'a8\'ee\u30340\'aa\'ba\u20854\'a8\'e4\u20182\'a5\'4c\u27402\'c5\'76\u21033\'a7\'51\u-244\'a1\'41\u21542\'a7\'5f\u21063\'ab\'68\u12288\'a1\'40 +\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20677\'b6\'c8\u24471\'b1\'6f\u22312\'a6\'62\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u26126\'a9\'fa\u31034\'a5\'dc\u-30159\'b3\'5c\u21487\'a5\'69\u20043\'a4\'a7\u31684\'bd\'64\u22285\'b3\'f2\u20839 +\'a4\'ba\u20351\'a8\'cf\u29992\'a5\'ce\u-28961\'b3\'6e\u-25900\'c5\'e9\u12290\'a1\'43\u22240\'a6\'5d\u27492\'a6\'b9\u-244\'a1\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24517\'a5\'b2\u-26616\'b6\'b7\u-28555\'bf\'ed\u23432\'a6\'75 +\u21482\'a5\'75\u20801\'a4\'b9\u-30159\'b3\'5c\u20197\'a5\'48\u29305\'af\'53\u23450\'a9\'77\u26041\'a4\'e8\u24335\'a6\'a1\u20351\'a8\'cf\u29992\'a5\'ce\u-28961\'b3\'6e\u-25900\'c5\'e9\u30340\'aa\'ba\u31185\'ac\'ec\u25216\'a7\'de\u20445\'ab\'4f\u-29833 +\'c5\'40\u25514\'b1\'b9\u26045\'ac\'49\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u19981\'a4\'a3\u24471\'b1\'6f}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-30321\'b3\'57\u-28545\'c1\'d7\u-28961\'b3\'6e\u-25900\'c5\'e9\u20013\'a4\'a4\u25152\'a9\'d2\u21253\'a5\'5d\u21547\'a7\'74\u30340\'aa\'ba\u31185\'ac\'ec\u25216\'a7\'de\u20445\'ab\'4f\u-29833\'c5\'40\u25514\'b1\'b9\u26045\'ac\'49\u-229\'a1\'46}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u23565\'b9\'ef\u-28961\'b3\'6e\u-25900\'c5\'e9\u-28622\'b6\'69\u-30644\'a6\'e6\u-28540\'c1\'d9\u21407\'ad\'ec\u24037\'a4\'75 +\u31243\'b5\'7b\u12289\'a1\'42\u-30237\'b8\'d1\u32232\'bd\'73\u25110\'a9\'ce\u21453\'a4\'cf\u21521\'a6\'56\u32068\'b2\'d5\u-29841\'c4\'b6\u-244\'a1\'41\u20294\'a6\'fd\u20760\'be\'a8\u31649\'ba\'de\u26377\'a6\'b3\u27492\'a6\'b9\u-27056\'ad\'ad\u21046 +\'a8\'ee\u30456\'ac\'db\u-27172\'c3\'f6\u27861\'aa\'6b\u24459\'ab\'df\u20173\'a4\'b4\u26126\'a9\'fa\u25991\'a4\'e5\u20801\'a4\'b9\u-30159\'b3\'5c\u-32763\'aa\'cc\u-244\'a1\'41\u19981\'a4\'a3\u22312\'a6\'62\u27492\'a6\'b9\u-27056\'ad\'ad\u-229\'a1\'46}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u28858\'ac\'b0\u-28961\'b3\'6e\u-25900\'c5\'e9\u-30467\'bb\'73\u20316\'a7\'40\u30340\'aa\'ba\u25335\'ab\'fe\u-29539\'a8\'a9 +\u25976\'bc\'c6\u-28209\'b6\'71\u-29307\'b6\'57\u-28594\'b9\'4c\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u25152\'a9\'d2\u26126\'a9\'fa\u23450\'a9\'77\u20043\'a4\'a7\u25976\'bc\'c6\u-28209\'b6\'71\u-244\'a1\'41\u25110\'a9\'ce\u30456\'ac\'db\u-27172 +\'c3\'f6\u27861\'aa\'6b\u24459\'ab\'df\u25152\'a9\'d2\u-30159\'b3\'5c\u21487\'a5\'69\u20043\'a4\'a7\u25976\'bc\'c6\u-28209\'b6\'71\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u23559\'b1\'4e\u-28961\'b3\'6e\u-25900\'c5\'e9\u30332\'b5\'6f\u20296\'a7\'47\u32102\'b5\'b9\u20854\'a8\'e4\u20182\'a5\'4c\u20154 +\'a4\'48\u-28622\'b6\'69\u-30644\'a6\'e6\u-30457\'bd\'c6\u-30467\'bb\'73\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20986\'a5\'58\u31199\'af\'b2\u12289\'a1\'42\u31199\'af\'b2\u-29501\'b8\'ee\u25110\'a9\'ce\u20986\'a5\'58\u20511\'ad\'c9\u-28961 +\'b3\'6e\u-25900\'c5\'e9\u-229\'a1\'46}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u23559\'b1\'4e\u-28961\'b3\'6e\u-25900\'c5\'e9\u25110\'a9\'ce\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u31227\'b2\'be +\u-28855\'c2\'e0\u32102\'b5\'b9\u20219\'a5\'f4\u20309\'a6\'f3\u31532\'b2\'c4\u19977\'a4\'54\u20154\'a4\'48\u-229\'a1\'46\u25110\'a9\'ce\u-32763\'aa\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21033\'a7\'51\u29992\'a5\'ce\u-28961\'b3\'6e\u-25900\'c5\'e9\u25552\'b4\'a3\u20379\'a8\'d1\u21830\'b0\'d3\u26989\'b7\'7e +\u-28961\'b3\'6e\u-25900\'c5\'e9\u20027\'a5\'44\u27231\'be\'f7\u26381\'aa\'41\u21209\'b0\'c8\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u20633\'b3\'c6\u20221\'a5\'f7\u25335\'ab\'fe\u-29539\'a8\'a9\loch\af38\hich\af38\dbch\f14 \u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\loch\af38\hich\af38\dbch\f14 \uc2\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u-30467\'bb\'73\u20316\'a7\'40\u19968\'a4\'40\u20221\'a5\'f7\u-28961\'b3\'6e\u-25900\'c5\'e9\u20633\'b3\'c6\u20221\'a5\'f7\u25335\'ab\'fe +\u-29539\'a8\'a9\u12290\'a1\'43\u-28647\'b3\'6f\u20221\'a5\'f7\u20633\'b3\'c6\u20221\'a5\'f7\u25335\'ab\'fe\u-29539\'a8\'a9\u21482\'a5\'75\u-32515\'af\'e0\u29992\'a5\'ce\u20358\'a8\'d3\u-28211\'ad\'ab\u26032\'b7\'73\u23433\'a6\'77\u-30499\'b8\'cb\u-28961 +\'b3\'6e\u-25900\'c5\'e9\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-30038\'bb\'a1\u26126\'a9\'fa\u25991\'a4\'e5\u20214\'a5\'f3\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20219\'a5\'f4\u20309\'a6\'f3\u26377\'a6\'b3\u27402\'c5\'76\u23384\'a6\'73\u21462\'a8\'fa\u12288\'a1\'40\u-29516\'b6\'51 +\u29992\'a5\'ce\u25142\'a4\'e1\u20043\'a4\'a7\u-26885\'b9\'71\u-32410\'b8\'a3\u25110\'a9\'ce\u20839\'a4\'ba\u-28440\'b3\'a1\u32178\'ba\'f4\u-29201\'b8\'f4\u30340\'aa\'ba\u20154\'a4\'48\u-244\'a1\'41\u30342\'ac\'d2\u24471\'b1\'6f\u22522\'b0\'f2\u26044 +\'a9\'f3\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20839\'a4\'ba\u-28440\'b3\'a1\u21443\'b0\'d1\u-32765\'a6\'d2\u20043\'a4\'a7\u30446\'a5\'d8\u30340\'aa\'ba\u-244\'a1\'41\u-30457\'bd\'c6\u-30467\'bb\'73\u21450\'a4\'ce\u20351\'a8\'cf +\u29992\'a5\'ce\u-30094\'b8\'d3\u-30038\'bb\'a1\u26126\'a9\'fa\u25991\'a4\'e5\u20214\'a5\'f3\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\expnd0\expndtw2\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \hich\af38\dbch\af14\loch\f38 7.\tab}}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\expnd0\expndtw2\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u31227\'b2\'be\u-28855\'c2\'e0\u-32269\'a6\'dc\u20854\'a8\'e4\u20182\'a5\'4c\u-30499 +\'b8\'cb\u32622\'b8\'6d\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\expnd0\expndtw2\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u12288\'a1\'40\u-29516\'b6\'51 +\u29992\'a5\'ce\u25142\'a4\'e1\u24471\'b1\'6f\u23559\'b1\'4e\u-28961\'b3\'6e\u-25900\'c5\'e9\u-30237\'b8\'d1\u-27036\'b0\'a3\u23433\'a6\'77\u-30499\'b8\'cb\u-244\'a1\'41\u20877\'a6\'41\u23433\'a6\'77\u-30499\'b8\'cb\u-32269\'a6\'dc\u20854\'a8\'e4\u20182 +\'a5\'4c\u-30499\'b8\'cb\u32622\'b8\'6d\u19978\'a4\'57\u20379\'a8\'d1\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20351\'a8\'cf\u29992\'a5\'ce\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u19981\'a4\'a3 +\u24471\'b1\'6f\u26044\'a9\'f3\u-30499\'b8\'cb\u32622\'b8\'6d\u-27245\'b6\'a1\u20849\'a6\'40\u29992\'a5\'ce\u27492\'a6\'b9\u25480\'b1\'c2\u27402\'c5\'76\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw2\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid9336866 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10899258 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20986\'a5\'58\u21475\'a4\'66\u-27056\'ad\'ad\u21046\'a8\'ee\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-28961\'b3\'6e\u-25900\'c5\'e9\u21463\'a8\'fc\u21040\'a8\'ec\u32654\'ac\'fc\u22283\'b0\'ea\u20986\'a5\'58\u21475\'a4\'66 +\u27861\'aa\'6b\u20196\'a5\'4f\u-30321\'b3\'57\u23450\'a9\'77\u20043\'a4\'a7\u-30321\'b3\'57\u31684\'bd\'64\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u24517\'a5\'b2\u-26616\'b6\'b7\u-28555\'bf\'ed\u23432\'a6\'75\u-28567 +\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3\u-28961\'b3\'6e\u-25900\'c5\'e9\u20043\'a4\'a7\u19968\'a4\'40\u20999\'a4\'c1\u26412\'a5\'bb\u22283\'b0\'ea\u21450\'a4\'ce\u22283\'b0\'ea\u-26981\'bb\'da\u20986\'a5\'58\u21475\'a4\'66\u27861\'aa\'6b\u20196\'a5\'4f +\u-30321\'b3\'57\u23450\'a9\'77\u20043\'a4\'a7\u-30321\'b3\'57\u31684\'bd\'64\u12290\'a1\'43\u-28647\'b3\'6f\u20123\'a8\'c7\u27861\'aa\'6b\u-30321\'b3\'57\u21253\'a5\'5d\u25324\'ac\'41\u30446\'a5\'d8\u30340\'aa\'ba\u22320\'a6\'61\u-27056\'ad\'ad\u21046 +\'a8\'ee\u12289\'a1\'42\u32066\'b2\'d7\u31471\'ba\'dd\u20351\'a8\'cf\u29992\'a5\'ce\u-32763\'aa\'cc\u-27056\'ad\'ad\u21046\'a8\'ee\u21644\'a9\'4d\u32066\'b2\'d7\u31471\'ba\'dd\u20351\'a8\'cf\u29992\'a5\'ce\u29992\'a5\'ce\u-28652\'b3\'7e\u-27056\'ad\'ad +\u21046\'a8\'ee\u12290\'a1\'43\u22914\'a6\'70\u-26880\'bb\'dd\u-30093\'b8\'d4\u32048\'b2\'d3\u-29497\'b8\'ea\u-30198\'b0\'54\u-244\'a1\'41\u-30005\'bd\'d0\u28687\'c2\'73\u-30275\'c4\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 www.microso\hich\af38\dbch\af14\loch\f38 ft.com/exporting}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs73\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25903\'a4\'e4\u25588\'b4\'a9\u26381\'aa\'41\u21209\'b0\'c8\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u27492\'a6\'b9\u-28961\'b3\'6e\u-25900\'c5\'e9\u20418\'ab\'59\u20381\'a8\'cc\u12300\'a1\'75\u29694\'b2\'7b\u27841\'aa\'70 +\u12301\'a1\'76\u25552\'b4\'a3\u20379\'a8\'d1\u-244\'a1\'41\u22240\'a6\'5d\u27492\'a6\'b9\u26412\'a5\'bb\u20844\'a4\'bd\u21496\'a5\'71\u21487\'a5\'69\u20197\'a5\'48\u19981\'a4\'a3\u25552\'b4\'a3\u20379\'a8\'d1\u25903\'a4\'e4\u25588\'b4\'a9\u26381\'aa\'41 +\u21209\'b0\'c8\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25972\'be\'e3\u20221\'a5\'f7\u21512\'a6\'58\u32004\'ac\'f9\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u20197\'a5\'48\u21450\'a4\'ce\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce +\u25142\'a4\'e1\u25152\'a9\'d2\u20351\'a8\'cf\u29992\'a5\'ce\u30340\'aa\'ba\u22686\'bc\'57\u-30500\'b8\'c9\u31243\'b5\'7b\u24335\'a6\'a1\u12289\'a1\'42\u26356\'a7\'f3\u26032\'b7\'73\u31243\'b5\'7b\u24335\'a6\'a1\u12289\'a1\'42\u32178\'ba\'f4\u-26981 +\'bb\'da\u32178\'ba\'f4\u-29201\'b8\'f4\u26381\'aa\'41\u21209\'b0\'c8\u21644\'a9\'4d\u25903\'a4\'e4\u25588\'b4\'a9\u26381\'aa\'41\u21209\'b0\'c8\u20043\'a4\'a7\u26781\'b1\'f8\u27454\'b4\'da\u27083\'ba\'63\u25104\'a6\'a8\u-27172\'c3\'f6\u26044\'a9\'f3 +\u-28961\'b3\'6e\u-25900\'c5\'e9\u21644\'a9\'4d\u25903\'a4\'e4\u25588\'b4\'a9\u26381\'aa\'41\u21209\'b0\'c8\u20043\'a4\'a7\u25972\'be\'e3\u20221\'a5\'f7\u21512\'a6\'58\u32004\'ac\'f9\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u28310\'b7\'c7\u25818\'be\'da\u27861\'aa\'6b\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u32654\'ac\'fc\u22283\'b0\'ea\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-32027\'ad\'59\u12288\'a1\'40\u-29516 +\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u22312\'a6\'62\u32654\'ac\'fc\u22283\'b0\'ea\u22659\'b9\'d2\u20839\'a4\'ba\u21462\'a8\'fa\u24471\'b1\'6f\u-28961\'b3\'6e\u-25900\'c5\'e9\u-244\'a1\'41\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u20043\'a4\'a7 +\u-30237\'b8\'d1\u-28213\'c4\'c0\u25110\'a9\'ce\u20219\'a5\'f4\u20309\'a6\'f3\u-28587\'b9\'48\u21453\'a4\'cf\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u25152\'a9\'d2\u-30643\'ad\'6c\u29983\'a5\'cd\u30340\'aa\'ba\u-30156\'b6\'44\u-30177\'b3\'5e\u-244 +\'a1\'41\u28961\'b5\'4c\u-29994\'bd\'d7\u26159\'ac\'4f\u21542\'a7\'5f\u26377\'a6\'b3\u27861\'aa\'6b\u-30321\'b3\'57\u-30627\'bd\'c4\u31361\'ac\'f0\u29986\'b2\'a3\u29983\'a5\'cd\u-244\'a1\'41\u22343\'a7\'a1\u25033\'c0\'b3\u20197\'a5\'48\u32654\'ac\'fc +\u22283\'b0\'ea\u-31761\'b5\'d8\u30427\'b2\'b1\u-26605\'b9\'79\u24030\'a6\'7b\u20043\'a4\'a7\u27861\'aa\'6b\u24459\'ab\'df\u20570\'b0\'b5\u28858\'ac\'b0\u28310\'b7\'c7\u25818\'be\'da\u27861\'aa\'6b\u12290\'a1\'43\u25152\'a9\'d2\u26377\'a6\'b3\u20854 +\'a8\'e4\u20182\'a5\'4c\u-30156\'b6\'44\u-30177\'b3\'5e\u23559\'b1\'4e\u20197\'a5\'48\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u23621\'a9\'7e\u20303\'a6\'ed\u20043\'a4\'a7\u24030\'a6\'7b\u27861\'aa\'6b\u24459\'ab\'df\u28858\'ac\'b0 +\u28310\'b7\'c7\u25818\'be\'da\u27861\'aa\'6b\u-244\'a1\'41\u21253\'a5\'5d\u21547\'a7\'74\u-28587\'b9\'48\u21453\'a4\'cf\u24030\'a6\'7b\u28040\'ae\'f8\u-29509\'b6\'4f\u-32763\'aa\'cc\u20445\'ab\'4f\u-29833\'c5\'40\u27861\'aa\'6b\u12289\'a1\'42\u19981 +\'a4\'a3\u30070\'b7\'ed\u31478\'c4\'76\u29229\'aa\'a7\u27861\'aa\'6b\u21644\'a9\'4d\u20405\'ab\'49\u27402\'c5\'76\u-30644\'a6\'e6\u28858\'ac\'b0\u30340\'aa\'ba\u-30156\'b6\'44\u-30177\'b3\'5e\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\expnd0\expndtw3\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \hich\af38\dbch\af14\loch\f38 b.\tab}}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u32654\'ac\'fc\u22283\'b0\'ea\u22659\'b9\'d2\u22806\'a5\'7e +\loch\af38\hich\af38\dbch\f14 \u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u-32027\'ad\'59\u12288 +\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u22312\'a6\'62\u32654\'ac\'fc\u22283\'b0\'ea\u20197\'a5\'48\u22806\'a5\'7e\u30340\'aa\'ba\u22283\'b0\'ea\u23478\'ae\'61}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u22320\'a6\'61\u21312\'b0\'cf\u21462\'a8\'fa\u24471\'b1\'6f\u-28961\'b3\'6e\u-25900\'c5\'e9\u-244\'a1\'41 +\u21063\'ab\'68\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u25033\'c0\'b3\u20197\'a5\'48\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u23621\'a9\'7e\u20303\'a6\'ed\u20043\'a4\'a7\u22283\'b0\'ea\u23478\'ae\'61}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\expnd0\expndtw3\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid9336866 \loch\af38\hich\af38\dbch\f14 \uc2\u22320\'a6\'61\u21312\'b0\'cf\u30340\'aa\'ba\u27861\'aa\'6b\u24459\'ab\'df\u28858\'ac\'b0\u28310\'b7\'c7 +\u25818\'be\'da\u27861\'aa\'6b\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\expnd0\expndtw3\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid9336866 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u27861\'aa\'6b\u24459\'ab\'df\u25928\'ae\'c4\u21147\'a4\'4f\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u26412 +\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u25944\'b1\'d4\u-28688\'ad\'7a\u20102\'a4\'46\u29305\'af\'53\u23450\'a9\'77\u30340\'aa\'ba\u27861\'aa\'6b\u24459\'ab\'df\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce +\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u22283\'b0\'ea\u23478\'ae\'61\u30340\'aa\'ba\u27861\'aa\'6b\u24459\'ab\'df\u21487\'a5\'69\u-32515\'af\'e0\u26371\'b7\'7c\u25552\'b4\'a3\u20379\'a8\'d1\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142 +\'a4\'e1\u20854\'a8\'e4\u20182\'a5\'4c\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43\u27492\'a6\'b9\u22806\'a5\'7e\u-244\'a1\'41\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u21462\'a8\'fa\u24471\'b1\'6f\u-28961\'b3\'6e\u-25900\'c5\'e9 +\u30340\'aa\'ba\u21934\'b3\'e6\u20301\'a6\'ec\u21487\'a5\'69\u-32515\'af\'e0\u20063\'a4\'5d\u26371\'b7\'7c\u25552\'b4\'a3\u20379\'a8\'d1\u30456\'ac\'db\u-27172\'c3\'f6\u30340\'aa\'ba\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43\u-32027\'ad\'59\u12288 +\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u20043\'a4\'a7\u22283\'b0\'ea\u23478\'ae\'61}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22320\'a6\'61\u21312\'b0\'cf\u27861\'aa\'6b\u24459\'ab\'df\u19981\'a4\'a3\u20801\'a4\'b9\u-30159\'b3\'5c\u-244\'a1\'41 +\u21063\'ab\'68\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u28961\'b5\'4c\u27861\'aa\'6b\u25913\'a7\'ef\u-29814\'c5\'dc\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u20043\'a4\'a7\u22283\'b0\'ea\u23478 +\'ae\'61}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22320\'a6\'61\u21312\'b0\'cf\u27861\'aa\'6b\u24459\'ab\'df\u25552\'b4\'a3\u20379\'a8\'d1\u32102\'b5\'b9\u12288\'a1\'40 +\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u30340\'aa\'ba\u27402\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u28961\'b5\'4c\u29781\'b7\'e5\u30133\'b2\'ab\u25812\'be\'e1\u20445\'ab\'4f\u-29524\'b3\'64\u20219\'a5\'f4\u12290\'a1\'43\u-28961 +\'b3\'6e\u-25900\'c5\'e9\u20418\'ab\'59\u20381\'a8\'cc\u12300\'a1\'75\u29694\'b2\'7b\u27841\'aa\'70\u12301\'a1\'76\u25480\'b1\'c2\u27402\'c5\'76\u20104\'a4\'a9\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u12290\'a1\'43\u12288\'a1\'40 +\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u-26616\'b6\'b7\u-32278\'a6\'db\u-30644\'a6\'e6\u25215\'a9\'d3\u25812\'be\'e1\u20351\'a8\'cf\u29992\'a5\'ce\u-26456\'ad\'b7\u-26966\'c0\'49\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 MICROSOFT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u19981\'a4\'a3\u25552\'b4\'a3\u20379\'a8\'d1\u26126\'a9\'fa\u31034\'a5\'dc\u25812\'be\'e1\u20445\'ab\'4f\u12289\'a1\'42\u20445 +\'ab\'4f\u-29879\'c3\'d2\u25110\'a9\'ce\u26781\'b1\'f8\u20214\'a5\'f3\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u22320\'a6\'61\u21312\'b0\'cf\u30340\'aa\'ba\u27861\'aa\'6b\u24459\'ab\'df +\u21487\'a5\'69\u-32515\'af\'e0\loch\af38\hich\af38\dbch\f14 \u26371\'b7\'7c\u25552\'b4\'a3\u20379\'a8\'d1\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u28961\'b5\'4c\u27861\'aa\'6b\u25913\'a7\'ef\u-29814\'c5\'dc\u30340\'aa\'ba\u-26547\'c3\'42\u22806 +\'a5\'7e\u28040\'ae\'f8\u-29509\'b6\'4f\u-32763\'aa\'cc\u27402\'c5\'76\u21033\'a7\'51\u25110\'a9\'ce\u27861\'aa\'6b\u24459\'ab\'df\u20445\'ab\'4f\u-29879\'c3\'d2\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22312\'a6\'62\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u22320\'a6\'61\u21312 +\'b0\'cf\u30340\'aa\'ba\u27861\'aa\'6b\u24459\'ab\'df\u25152\'a9\'d2\u20801\'a4\'b9\u-30159\'b3\'5c\u30340\'aa\'ba\u31684\'bd\'64\u22285\'b3\'f2\u20043\'a4\'a7\u20839\'a4\'ba\u-244\'a1\'41}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 MICROSOFT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u25490\'b1\'c6\u-27036\'b0\'a3\u-28567\'be\'41\u21806\'b0\'e2\u24615\'a9\'ca\u12289\'a1\'42\u31526\'b2\'c5\u21512\'a6\'58\u29305 +\'af\'53\u23450\'a9\'77\u30446\'a5\'d8\u30340\'aa\'ba\u25110\'a9\'ce\u26410\'a5\'bc\u20405\'ab\'49\u27402\'c5\'76\u20043\'a4\'a7\u-24872\'c0\'71\u31034\'a5\'dc\u25812\'be\'e1\u20445\'ab\'4f\u-29524\'b3\'64\u20219\'a5\'f4\u12290\'a1\'43}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid13507249\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u20677\'b6\'c8\u-28567\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3\u28595\'bf\'44\u27954\'ac\'77\u-230\'a1\'47\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20381\'a8\'cc\u25818\'be\'da\u28595\'bf\'44\u22823\'a4\'6a\u21033\'a7\'51\u20126 +\'a8\'c8\u28040\'ae\'f8\u-29509\'b6\'4f\u-32763\'aa\'cc\u27861\'aa\'6b\u24459\'ab\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid13507249\charrsid2885526 \hich\af38\dbch\af14\loch\f38 + (AUSTRALIAN CONSUMER LAW) }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid13507249\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u20139\'a8\'c9\u26377\'a6\'b3\u27861\'aa\'6b\u23450\'a9\'77 +\u20445\'ab\'4f\u-29879\'c3\'d2\u-244\'a1\'41\u26412\'a5\'bb\u21512\'a6\'58\u32004\'ac\'f9\u26781\'b1\'f8\u27454\'b4\'da\u20006\'a8\'c3\u19981\'a4\'a3\u24847\'b7\'4e\u22294\'b9\'cf\u24433\'bc\'76\u-26625\'c5\'54\u-28647\'b3\'6f\u20123\'a8\'c7\u27402 +\'c5\'76\u21033\'a7\'51\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1028\langfe1028\loch\af38\hich\af38\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u25937\'b1\'cf\u28639\'c0\'d9\u27402\'c5\'76\u-32249\'bb\'50\u25613\'b7\'6c\u23475\'ae\'60\u-29472\'bd\'df\u20767\'c0\'76\u-29524\'b3\'64\u20219\'a5\'f4\u20043\'a4\'a7\u-27056\'ad\'ad\u21046\'a8\'ee\u-32249\'bb\'50\u25490\'b1\'c6\u-27036\'b0\'a3 +\u12290\'a1\'43\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u20677\'b6\'c8\u24471\'b1\'6f\u23601\'b4\'4e\u30452\'aa\'bd\u25509\'b1\'b5\u25613\'b7\'6c\u23475\'ae\'60\u-244\'a1\'41\u-30335\'ad\'6e\u27714\'a8\'44}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 MICROSOFT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21450\'a4\'ce\u20854\'a8\'e4\u20379\'a8\'d1\u25033\'c0\'b3\u21830\'b0\'d3\u-29536\'ad\'74\u25812\'be\'e1\u25613\'b7\'6c\u23475 +\'ae\'60\u-29472\'bd\'df\u20767\'c0\'76\u-29524\'b3\'64\u20219\'a5\'f4\u-244\'a1\'41\u19988\'a5\'42\u20854\'a8\'e4\u-28207\'aa\'f7\u-26547\'c3\'42\u19981\'a4\'a3\u24471\'b1\'6f\u-29307\'b6\'57\u-28594\'b9\'4c}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 $5.00 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u32654\'ac\'fc\u20803\'a4\'b8\u12290\'a1\'43\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u28961\'b5\'4c\u27861 +\'aa\'6b\u23601\'b4\'4e\u20854\'a8\'e4\u20182\'a5\'4c\u25613\'b7\'6c\u23475\'ae\'60}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 (}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21253\'a5\'5d\u25324\'ac\'41\u-30643\'ad\'6c\u29983\'a5\'cd\u24615\'a9\'ca\u25613\'b7\'6c +\u23475\'ae\'60\u12289\'a1\'42\u21033\'a7\'51\u28516\'bc\'ed\u25613\'b7\'6c\u22833\'a5\'a2\u12289\'a1\'42\loch\af38\hich\af38\dbch\f14 \u29305\'af\'53\u27530\'ae\'ed\u25613\'b7\'6c\u23475\'ae\'60\u12289\'a1\'42\u-27245\'b6\'a1\u25509\'b1\'b5\u25613 +\'b7\'6c\u23475\'ae\'60\u25110\'a9\'ce\u-27068\'aa\'fe\u-26968\'c0\'48\u24615\'a9\'ca\u25613\'b7\'6c\u23475\'ae\'60}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\hich\af38\dbch\af14\loch\f38 ) }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u-30005\'bd\'d0\u27714\'a8\'44\u25613\'b7\'6c\u23475 +\'ae\'60\u-29472\'bd\'df\u20767\'c0\'76\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-28647\'b3\'6f\u-26619\'b6\'b5\u-27056\'ad\'ad\u21046\'a8\'ee\u-28567\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u-32249\'bb\'50\u-28961\'b3\'6e\u-25900\'c5\'e9\u12289\'a1\'42\u26381\'aa\'41\u21209\'b0\'c8\u12289\'a1\'42\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8\u24288\'bc\'74\u21830\'b0\'d3\u32178\'ba\'f4\u31449\'af\'b8\u19978\'a4\'57\u30340\'aa\'ba\u20839 +\'a4\'ba\u23481\'ae\'65}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 (}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u21253\'a5\'5d\u25324\'ac\'41\u31243\'b5\'7b\u24335\'a6\'a1\u30908\'bd\'58}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \hich\af38\dbch\af14\loch\f38 ) }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\loch\af38\hich\af38\dbch\f14 \uc2\u25110\'a9\'ce\u31532\'b2\'c4\u19977\'a4\'54\u26041\'a4\'e8\u24288\'bc\'74\u21830\'b0\'d3\u31243\'b5\'7b\u24335\'a6\'a1\u30456\'ac\'db\u-27172\'c3\'f6\u30340\'aa\'ba\u20219\'a5\'f4\u20309\'a6\'f3\u20107\'a8\'c6\u-26619 +\'b6\'b5\u-229\'a1\'46\u21644\'a9\'4d}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\loch\af3\hich\af3\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af3\dbch\af14\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22312\'a6\'62\u30456\'ac\'db\u-27172\'c3\'f6\u27861\'aa\'6b\u24459\'ab\'df\u-30159\'b3\'5c\u21487\'a5\'69\u30340\'aa\'ba\u31684 +\'bd\'64\u22285\'b3\'f2\u20043\'a4\'a7\u20839\'a4\'ba\u-244\'a1\'41\u22240\'a6\'5d\u28858\'ac\'b0\u-28587\'b9\'48\u21453\'a4\'cf\u21512\'a6\'58\u32004\'ac\'f9\u12289\'a1\'42\u20445\'ab\'4f\u-29879\'c3\'d2\u12289\'a1\'42\u25812\'be\'e1\u20445\'ab\'4f +\u25110\'a9\'ce\u26781\'b1\'f8\u20214\'a5\'f3\u12289\'a1\'42\u28961\'b5\'4c\u-28594\'b9\'4c\u22833\'a5\'a2\u-29524\'b3\'64\u20219\'a5\'f4\u12289\'a1\'42\u-28594\'b9\'4c\u22833\'a5\'a2\u25110\'a9\'ce\u20854\'a8\'e4\u20182\'a5\'4c\u20405\'ab\'49\u27402 +\'c5\'76\u-30644\'a6\'e6\u28858\'ac\'b0\u25152\'a9\'d2\u20027\'a5\'44\u24373\'b1\'69\u20043\'a4\'a7\u-30156\'b6\'44\u-30177\'b3\'5e\u26696\'ae\'d7\u20214\'a5\'f3\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 +\uc2\u21363\'a7\'59\u20351\'a8\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \hich\af38\dbch\af14\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid11828113\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u24050\'a4\'77\u30693\'aa\'be\u24713\'b1\'78\u25110\'a9\'ce\u25033\'c0\'b3\u30693\'aa\'be\u24713\'b1\'78\u-30094\'b8\'d3\u31561 +\'b5\'a5\u25613\'b7\'6c\u23475\'ae\'60\u30332\'b5\'6f\u29983\'a5\'cd\u20043\'a4\'a7\u21487\'a5\'69\u-32515\'af\'e0\u24615\'a9\'ca\u-244\'a1\'41\u27492\'a6\'b9\u-26619\'b6\'b5\u-27056\'ad\'ad\u21046\'a8\'ee\u20173\'a4\'b4\u28982\'b5\'4d\u-28567\'be\'41 +\u29992\'a5\'ce\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u27492\'a6\'b9\u22806\'a5\'7e\u-244\'a1\'41\u12288\'a1\'40 +\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u25152\'a9\'d2\u22312\'a6\'62\u20043\'a4\'a7\u22283\'b0\'ea\u23478\'ae\'61}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 +\hich\af38\dbch\af14\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1028\langfe1028\dbch\af14\langnp1028\langfenp1028\insrsid10899258\charrsid2885526 \loch\af38\hich\af38\dbch\f14 \uc2\u22320\'a6\'61\u21312\'b0\'cf\u20063\'a4\'5d\u21487\'a5\'69 +\u-32515\'af\'e0\u19981\'a4\'a3\u20801\'a4\'b9\u-30159\'b3\'5c\u23565\'b9\'ef\u-27068\'aa\'fe\u-26968\'c0\'48\u24615\'a9\'ca\u25613\'b7\'6c\u23475\'ae\'60\u12289\'a1\'42\loch\af38\hich\af38\dbch\f14 \u-30643\'ad\'6c\u29983\'a5\'cd\u24615\'a9\'ca\u25613 +\'b7\'6c\u23475\'ae\'60\u25110\'a9\'ce\u20854\'a8\'e4\u20182\'a5\'4c\u25613\'b7\'6c\u23475\'ae\'60\u21152\'a5\'5b\u20197\'a5\'48\u25490\'b1\'c6\u-27036\'b0\'a3\u25110\'a9\'ce\u-27056\'ad\'ad\u21046\'a8\'ee\loch\af38\hich\af38\dbch\f14 \u-244\'a1\'41 +\u-28647\'b3\'6f\u31278\'ba\'d8\u24773\'b1\'a1\u27841\'aa\'70\u20063\'a4\'5d\u21487\'a5\'69\u-32515\'af\'e0\u-28640\'b3\'79\u25104\'a6\'a8\u19978\'a4\'57\u-28688\'ad\'7a\u-27056\'ad\'ad\u21046\'a8\'ee\u25110\'a9\'ce\u25490\'b1\'c6\u-27036\'b0\'a3\u-30321 +\'b3\'57\u23450\'a9\'77\u20006\'a8\'c3\u19981\'a4\'a3\u-28567\'be\'41\u29992\'a5\'ce\u26044\'a9\'f3\u12288\'a1\'40\u-29516\'b6\'51\u29992\'a5\'ce\u25142\'a4\'e1\u12290\'a1\'43}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1028\dbch\af14\langfenp1028\insrsid4684770\charrsid2885526 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000000005 +796736b9ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.CSY.rtf b/setup/resources/eula/VF_EULA.CSY.rtf new file mode 100644 index 00000000000..09d89b443a8 --- /dev/null +++ b/setup/resources/eula/VF_EULA.CSY.rtf @@ -0,0 +1,692 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f40\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f41\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;} +{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);} +{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);} +{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;} +{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;}{\f444\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f454\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f452\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;} +{\f453\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f455\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f456\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f459\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f39\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof +tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f38 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive \f2\cf11\lang1024\langfe1024\noproof +tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \f38\fs19\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 +Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 +\sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid4684770\rsid5858028\rsid9196108\rsid11758563\rsid11828113\rsid14356214\rsid14446677\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0 +\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo4\dy30\hr15\min19}{\version1}{\edmins0}{\nofpages3}{\nofwords1110}{\nofchars6329}{\nofcharsws7425}{\vern49275}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 MICROSOFT VISUAL F# }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which \hich\af38\dbch\af13\loch\f38 +includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 updates,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 supplements,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Internet-based services, and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 support services}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BY USING T\hich\af38\dbch\af13\loch\f38 HE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +You may install and use any number of copies of the software \hich\af38\dbch\af13\loch\f38 on your devices}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 to design, develop and test your programs.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 2.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ADDITIONAL\hich\af38\dbch\af13\loch\f38 LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software contains code that you are permitted to distribute in programs you develop if you comply with the terms belo\hich\af38\dbch\af13\loch\f38 w.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 + The code and text files listed below are \'93\loch\f38 \hich\f38 Distributable Code.\'94}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 REDIST\hich\af38\dbch\af13\loch\f38 .TXT Files}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +. You may copy and distribute the object code form of code listed in REDIST.TXT files.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Third Party Distribution}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 . You may permit distributors o\hich\af38\dbch\af13\loch\f38 +f your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 add significant primary functionality to it in your programs;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 for any Distributable Code\hich\af38\dbch\af13\loch\f38 having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your program;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code included in a setup program only as part of that setup program without modification;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\loch\af38\dbch\af13\hich\f38 \rquote \loch\f38 fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the Distributable Code;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 s trademarks in your programs\hich\f38 \rquote \loch\f38 names or in a way that suggests your\hich\af38\dbch\af13\loch\f38 programs come from or are endorsed by Microsoft;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code to run on a platform other than the Windows platform;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 include Distributable Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 modify or distribute the source code of any Di\hich\af38\dbch\af13\loch\f38 +stributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 others have the\hich\af38\dbch\af13\loch\f38 right to modify it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 THIRD PARTY PROGRAMS AND NOTICES}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 +. Other third party code included in the software is licensed to you by Microsoft under this license agreement, rather than licensed to you by any third party under some other license terms. Notices, if any, for this thir\hich\af38\dbch\af13\loch\f38 +d party code are included with the software and may also be}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 found in the ThirdPartyNotices.txt file. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use \hich\af38\dbch\af13\loch\f38 +the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 revers\hich\af38\dbch\af13\loch\f38 e engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 make more copies of the software than specified in this agreement or allowed by applicable law, despite this li\hich\af38\dbch\af13\loch\f38 mitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 publish the software for others to copy;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may make one backup copy of the +\hich\af38\dbch\af13\loch\f38 software. You may use it only to reinstall the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 TRANSFER TO ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may unin\hich\af38\dbch\af13\loch\f38 +stall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is subject to United States export laws and regulations. You must comply with all domestic and inte\hich\af38\dbch\af13\loch\f38 +rnational export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we +\hich\af38\dbch\af13\loch\f38 may not provide support services for it.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 APPLICABLE LAW.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live gove +\hich\af38\dbch\af13\loch\f38 rn all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Outside the United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 If you acquired the software in any other country, the laws of that country apply.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This agreement des\hich\af38\dbch\af13\loch\f38 +cribes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 laws of your country do not permit it to do so.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f38 \hich\f38 AS-IS.\'94\loch\f38 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY G +\hich\af38\dbch\af13\loch\f38 +UARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 FOR AUSTRALIA \hich\f38 \endash \loch\f38 YOU HAVE +\hich\af38\dbch\af13\loch\f38 STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 +. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.0\hich\af38\dbch\af11\loch\f38 0. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This limitation applies to}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third\hich\af38\dbch\af13\loch\f38 party programs; and}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the pos\hich\af38\dbch\af13\loch\f38 +sibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 3; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1; +\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8; +\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e50000000000000000000000007074 +16b8f045ce010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000707416b8f045ce01 +707416b8f045ce010000000000000000000000005400330042004100430054004b0032005500c400da005100570034005300dc00d7003200d9003300c600d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000707416b8f045 +ce01707416b8f045ce010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30393430 +443034442d394333322d344535322d393035392d4534424344444345354439427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.DEU.rtf b/setup/resources/eula/VF_EULA.DEU.rtf new file mode 100644 index 00000000000..492045ec870 --- /dev/null +++ b/setup/resources/eula/VF_EULA.DEU.rtf @@ -0,0 +1,770 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}{\f60\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Arial Unicode MS};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f574\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f1044\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Arial Unicode MS};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \dbch\af11 }{\*\defpap \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat \spriority9 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink16 \sqformat \spriority9 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat \spriority9 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink18 \sqformat \spriority9 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat \spriority9 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink20 \sqformat \spriority9 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat \spriority9 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink22 \sqformat \spriority9 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat \spriority9 heading 9;}{\*\cs10 \additive \ssemihidden \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked \spriority9 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked \spriority9 +Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked \spriority9 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked \spriority9 +Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked \spriority9 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked \spriority9 +Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink7 \slocked \spriority9 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked \spriority9 +Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked \spriority9 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \spriority0 Body 1;}{ +\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext25 \spriority0 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \spriority0 Body 3;}{\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext27 \spriority0 Body 4;}{ +\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext28 \spriority0 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \spriority0 Body 6;}{\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext30 \spriority0 Body 7;}{ +\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext31 \spriority0 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 \spriority0 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 \spriority0 +Bullet 1;}{\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 \spriority0 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext35 \slink87 \spriority0 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 \spriority0 Bullet 4;}{\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 \spriority0 +Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 \spriority0 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \spriority0 +Bullet 7;}{\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 \spriority0 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 \spriority0 +Bullet 9;}{\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 \spriority0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \spriority0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 \spriority0 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \spriority0 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 \spriority0 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \spriority0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 \spriority0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 \spriority0 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 \spriority0 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 \spriority0 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 \spriority0 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 \spriority0 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 \spriority0 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Body 2 Char;}{\*\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 +\f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 Body 1 Char;}{ +\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 \spriority0 Preamble Border Above;}{\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden footnote reference;}{ +\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink68 \slocked \ssemihidden +Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 \spriority0 Char;}{\s72\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext72 \spriority0 +Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 +\ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\sbasedon10 page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 \spriority0 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 \spriority0 Body 0 Bold;}{ +\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \spriority0 Body 0;}{ +\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;} +{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 +\ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon68 \snext68 \slink86 \ssemihidden annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 +\sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked \spriority0 Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 \spriority0 +Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 \spriority0 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 +\additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 +Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked \spriority0 +Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof \spriority0 LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 \spriority0 Preamble Char;} +{\*\cs97 \additive \f2\fs40\cf4 \spriority0 tw4winError;}{\*\cs98 \additive \cf2 \spriority0 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof \spriority0 LogoportPopup;}{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof +\spriority0 LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof \spriority0 LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof \spriority0 DO_NOT_TRANSLATE;}{\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext103 \slink104 Body Text 2;}{\* +\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 \spriority0 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked \spriority0 Heading 3 Bold Char;}{\*\cs107 \additive +\rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon106 \slink105 \slocked \spriority0 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 +\sbasedon10 \slink79 \slocked \spriority0 Body 0 Bold Char;}{\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 +\b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 \sbasedon0 \snext109 \slink110 \spriority0 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 +\b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked \spriority0 LIMPA_T4WINEXTERNAL Char;}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240 +\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462} +{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357 +\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 \fi-360\li720 +\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li1077 +\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 +\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf1\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid1118912\rsid1724478\rsid3473474\rsid3755635\rsid4684770\rsid5308453\rsid5519702\rsid5595023\rsid5858028\rsid6702433\rsid7480156\rsid7547218\rsid7764285\rsid8193691\rsid8939792\rsid9196108\rsid9316068\rsid9393746\rsid10572686 +\rsid10619787\rsid11758563\rsid11828113\rsid12523559\rsid12799225\rsid13178641\rsid14228306\rsid14356214\rsid14375208\rsid14446677\rsid14890119\rsid15349346\rsid15548830\rsid16023069\rsid16280961\rsid16335299\rsid16386900\rsid16664675}{\mmathPr +\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo9\dy21\min9}{\revtim\yr2013\mo9\dy24\hr3\min23}{\version1}{\edmins0}{\nofpages3}{\nofwords1603}{\nofchars9141} +{\nofcharsws10723}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\utinl \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid15349346 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15349346 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15349346 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15349346 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid7480156\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid5595023 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5595023 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5595023 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5595023 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5595023 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5595023 +\par }}{\*\pnseclvl1\pnucrm\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnqc\pnstart1\pnindent720\pnhang +{\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl8\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +MICROSOFT-SOFTWARE-LIZENZBESTIMMUNGEN}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 + +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16664675 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 +Diese Lizenzbestimmungen sind ein Vertrag zwischen Ihnen und der Microsoft Corporation (oder einer anderen Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid16664675 \_}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 +Konzerngesellschaft, wenn diese an dem Ort, an dem Sie leben, die Software lizenziert). Bitte lesen Sie die Bestimmungen aufmerksam durch. \hich\af38\dbch\af13\loch\f38 \hich\f38 Sie gelten f\'fc\loch\f38 \hich\f38 +r die oben genannte Software und gegebenenfalls f\'fc\loch\f38 r die Medien, auf denen Sie diese erhalten haben.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Diese Bestimmungen gelten auch f\'fc\loch\f38 \hich\f38 r alle von Microsoft diesbez\'fc\loch\f38 +glich angebotenen}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Updates}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Erg\'e4\loch\f38 nzungen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 internetbasierten Dienste und}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Supportservices.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 +Liegen letztgenannten Elementen eigene Bestimmungen bei,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 gelten diese eigenen Bestimmungen.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 DURCH DIE VERWENDUNG DER SOFTWARE ERKENNEN SIE DIESE BESTIMMUNGEN AN.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 FALLS SIE DIE BESTIMMUNGEN NICHT AKZEPTIEREN, \hich\af38\dbch\af11\loch\f38 SIND SIE NICHT BERECHTIGT, DIE SOFTWARE ZU VERWENDEN.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +WENN SIE DIESE LIZENZBESTIMMUNGEN EINHALTEN, VERF\'dc\loch\f38 \hich\f38 GEN SIE \'dc\loch\f38 \hich\f38 BER DIE NACHFOLGEND AUFGEF\'dc\loch\f38 \hich\f38 HRTEN ZEITLICH UNBESCHR\'c4\loch\f38 NKTEN RECHTE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1031\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1031\langfenp1033\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 +RECHTE ZUR INSTALLATION UND NUTZUNG.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Sie sind berechtigt, eine beliebige An\hich\af38\dbch\af11\loch\f38 \hich\f38 zahl von Kopien der Software auf Ihren Ger\'e4\loch\f38 +ten zu installieren und zu verwenden, um Ihre Programme zu entwerfen, zu entwickeln und zu testen.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 2.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 ZUS\'c4\loch\f38 TZLICHE LIZENZANFORDERUNGEN UND/ODER NUTZUNGSRECHTE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Vertreibbarer Code. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Die Software enth\'e4\loch\f38 lt Code, den \hich\af38\dbch\af11\loch\f38 \hich\f38 +Sie in von Ihnen entwickelten Programmen vertreiben d\'fc\loch\f38 rfen, wenn Sie die nachfolgenden Bestimmungen einhalten.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +Recht zur Nutzung und zum Vertrieb. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Bei dem nachfolgend aufgelisteten Code und den nachfolgend aufgelisteten Textdateien handelt es sich um \'84\hich\af38\dbch\af11\loch\f38 \hich\f38 Vertreibbaren Code\'93.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 REDIST.TXT-Dateien}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid14228306 \hich\af38\dbch\af11\loch\f38 . }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Sie sind berechtigt, die Objektcodeform des in den Dateien namens REDIST.TXT aufgelisteten Codes zu kopieren und zu vertreiben.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Vertrieb durch Dritte}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid14228306 +\hich\af38\dbch\af11\loch\f38 . }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Sie sind berechtigt, Distributoren Ihrer Programme zu erlau +\hich\af38\dbch\af11\loch\f38 ben, den Vertreibbaren Code als Teil dieser Programme zu kopieren und zu vertreiben.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Vertriebsbedingungen. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 F\'fc\loch\f38 r Vertreibbaren Code, den Sie vertreiben, sind Sie verpflichtet:}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +diesem in Ihren Programmen wesentliche prim\'e4\loch\f38 \hich\f38 re Funktionalit\'e4\loch\f38 \hich\f38 t hinzuzuf\'fc\loch\f38 gen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 + +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 f\'fc\loch\f38 +r Vertreibbaren Code mit der Dateinamenerweiterung LIB nur die Ergebnisse des Durchlaufs dieses Vertreibbaren Codes durch einen Linker mit Ihrem Programm zu vertreiben}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 in einem Setupprogramm enthaltenen Vertreibbaren Code nur als Teil dieses Setupprog\hich\af38\dbch\af11\loch\f38 \hich\f38 ramms ohne \'c4\loch\f38 +nderung zu vertreiben}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 von Distributoren und externen Endbenutzern die Zustimmung zu Bestimmungen zu verlangen, die einen mindestens gleichwertigen Schutz f\'fc +\loch\f38 r ihn bieten wie dieser Vertrag }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Ihren g\'fc\loch\f38 ltigen Urheberrechtshinweis auf Ihren Progr\hich\af38\dbch\af11\loch\f38 ammen anzubringen und}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Microsoft von allen Anspr\'fc\loch\f38 \hich\f38 chen freizustellen und gegen alle Anspr\'fc\loch\f38 \hich\f38 che zu verteidigen, einschlie\'df +\loch\f38 \hich\f38 lich Anwaltsgeb\'fc\loch\f38 hren, die mit dem Vertrieb oder der Verwendung Ihrer Programme in Zusammenhang stehen.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 + +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vertriebsbeschr\'e4 +\loch\f38 nkungen. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Sie\hich\af38\dbch\af11\loch\f38 sind nicht dazu berechtigt:}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Urheberrechts-, Markenrechts- oder Patenthinweise im Vertreibbaren Code zu \'e4\loch\f38 ndern}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 die Marken von Microsoft in den Namen Ihrer Programme oder auf eine Weise zu verwenden, die nahelegt, dass Ihre Programme von Microsoft stamm +\hich\af38\dbch\af11\loch\f38 en oder von Microsoft empfohlen werden}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vertreibbaren Code zur Ausf\'fc\loch\f38 hrung auf einer anderen Plattform als der Windows-Plattform zu vertreiben}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf1\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vertreibbaren Code in b\'f6\loch\f38 \hich\f38 sartige, t\'e4\loch\f38 uschende oder rechtswidrige Programme aufzunehmen}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf1\lang1031\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1031\langfenp1033\insrsid11828113\charrsid16335299 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 \hich\f38 den Quellcode von Vertreibbarem Code so zu \'e4\loch\f38 +ndern oder zu vertreiben, dass irgendein Teil von ihm einer Ausgeschlossenen Lizenz unterliegt.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 + Eine Ausgeschlossene Lizenz ist eine Lizenz, die als Bedingung f\'fc\loch\f38 \hich\f38 r eine Verwendung, \'c4\loch\f38 nderung oder einen Vertrieb erf\hich\af38\dbch\af11\loch\f38 ordert, dass:}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +der Code in Quellcodeform offengelegt oder vertrieben wird oder}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 andere das Recht haben, ihn zu \'e4\loch\f38 ndern.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid9393746 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +DRITTANBIETERPROGRAMME UND -HINWEISE. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Anderer Drittanbietercode, der in der Software enthalten ist,}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 wird von Microsoft unter diesem +\hich\af38\dbch\af11\loch\f38 Lizenzvertrag an Sie lizenziert und nicht von einem Dritten unter anderen Lizenzbestimmungen an Sie lizenziert.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Hinweise f\'fc\loch\f38 \hich\f38 +r den Drittanbietercode sind gegebenenfalls in der Software enthalten und m\'f6\loch\f38 glicherweise in der Datei ThirdPartyNotices.txt zu finden.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11758563\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7480156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 G\'dc\loch\f38 LTIGKEITSBEREICH DER LIZENZ. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Die Software wird lizenziert, nicht verkauft.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Dieser Vertrag gibt Ihnen nur einige Rechte zur Verwendung der Software.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Microsoft beh\'e4\loch\f38 lt sich alle anderen Rechte vor.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Sie d\'fc\loch\f38 rfen die Software nur wie in diesem Vertrag ausd\hich\af38\dbch\af11\loch\f38 \hich\f38 r\'fc +\loch\f38 \hich\f38 cklich gestattet verwenden, es sei denn, das anwendbare Recht gibt Ihnen ungeachtet dieser Einschr\'e4\loch\f38 nkung umfassendere Rechte.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Dabei sind Sie verpflichtet, alle technischen Beschr\'e4\loch\f38 nkungen der Software einzuhalten, die Ihnen nur spezielle Verwendungen gest\hich\af38\dbch\af11\loch\f38 atten.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +Sie sind nicht dazu berechtigt:}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 technische Beschr\'e4 +\loch\f38 nkungen der Software zu umgehen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 die Software zur\'fc\loch\f38 ckzuentwickeln (\hich\af38\dbch\af11\loch\f38 \hich\f38 +Reverse Engineering), zu dekompilieren oder zu disassemblieren, es sei denn, dass (und nur insoweit) es das anwendbare Recht ungeachtet dieser Einschr\'e4\loch\f38 \hich\f38 nkung ausdr\'fc\loch\f38 cklich gestattet}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 eine gr\'f6\'df\loch\f38 ere Anzahl von Kopien der Software als in diesem Vertrag angegebe\hich\af38\dbch\af11\loch\f38 \hich\f38 +n oder vom anwendbaren Recht ungeachtet dieser Einschr\'e4\loch\f38 \hich\f38 nkung ausdr\'fc\loch\f38 cklich gestattet anzufertigen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 die Software zu ver\'f6\loch\f38 \hich\f38 ffentlichen, damit andere sie kopieren k\'f6\loch\f38 nnen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 die Software zu vermieten, zu verleasen oder zu verleihen}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 die Software oder diesen Vert\hich\af38\dbch\af11\loch\f38 \hich\f38 rag an Dritte zu \'fc\loch\f38 bertragen oder}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 die Software f\'fc\loch\f38 r kommerzielle Software-Hostingdienste zu verwenden.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 SICHERUNGSKOPIE. }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Sie sind berechtigt, eine Sicherungskopie der Software anzufertigen.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Sie d +\'fc\loch\f38 rfen diese nur zur erneuten Installation der Software verw\hich\af38\dbch\af11\loch\f38 enden.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 DOKUMENTATION. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +\hich\f38 Jede Person, die \'fc\loch\f38 \hich\f38 ber einen g\'fc\loch\f38 \hich\f38 ltigen Zugriff auf Ihren Computer oder Ihr internes Netzwerk verf\'fc\loch\f38 +gt, ist berechtigt, die Dokumentation zu Ihren internen Referenzzwecken zu kopieren und zu verwenden.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \loch\af38\dbch\af11\hich\f38 \'dc\loch\f38 BERTRAGUNG AUF EIN ANDERES GE\hich\af38\dbch\af11\loch\f38 \hich\f38 R\'c4\loch\f38 T. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Sie sind berechtigt, die Software zu deinstallieren und auf einem anderen Ger\'e4\loch\f38 t zu Ihrer Verwendung zu installieren.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Sie sind nicht berechtigt, dies zu tun, um diese Lizenz auf mehreren Ger\'e4\loch\f38 ten gemeinsam zu verwenden.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 AUSFUHRBESCHR\'c4\loch\f38 NKUNGEN. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 Die Sof\hich\af38\dbch\af11\loch\f38 tware unterliegt den Exportgesetzen und \_\hich\f38 regelungen der USA sowie des Landes, aus dem sie ausgef\'fc\loch\f38 hrt wird.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +Sie sind verpflichtet, alle nationalen und internationalen Exportgesetze und \_\hich\f38 regelungen einzuhalten, die f\'fc\loch\f38 r die Software gelten.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +Diese Gesetze enth\hich\af38\dbch\af11\loch\f38 \hich\f38 alten auch Beschr\'e4\loch\f38 nkungen in Bezug auf die Endnutzer und Endnutzung.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Weitere Informationen finden Sie unter }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs73\b0\fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 \hich\af38\dbch\af11\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid9316068\charrsid16335299 .}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1031\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1031\langfenp1033\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 SUPPORTSERVICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Da diese Software \'84\loch\f38 \hich\f38 wie besehen\'93\loch\f38 +\hich\f38 bereitgestellt wird, stellen wir m\'f6\loch\f38 glicherweise keine Supportse\hich\af38\dbch\af11\loch\f38 \hich\f38 rvices f\'fc\loch\f38 r sie bereit.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 GESAMTER VERTRAG. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Dieser Vertrag sowie die Bestimmungen f\'fc\loch\f38 \hich\f38 r von Ihnen verwendete Erg\'e4\loch\f38 \hich\f38 nzungen, Updates, internetbasierte Dienste und Supportservices stellen den gesamten Vertrag f\'fc +\loch\f38 r die Software und die Supportservices dar.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid7480156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 AN\hich\af38\dbch\af11\loch\f38 WENDBARES RECHT.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Vereinigte Staaten. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Wenn Sie die Software in den Vereinigten Staaten erworben haben, regelt das Gesetz des Staates Washington die Auslegung dieses Vertrages und gilt f\'fc\loch\f38 \hich\f38 r Anspr\'fc\loch\f38 che, die aus einer Vertragsverletzung entstehen, ungeachtet +\hich\af38\dbch\af11\loch\f38 der Bestimmungen des internationalen Privatrechts.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Die Gesetze des Staates Ihres Wohnorts regeln alle anderen Anspr\'fc\loch\f38 \hich\f38 che, einschlie\'df\loch\f38 \hich\f38 +lich Anspr\'fc\loch\f38 che aus den Verbraucherschutzgesetzen des Staates, aus Gesetzen gegen unlauteren Wettbewerb und aus Deliktsrecht.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Au\'df\loch\f38 erhalb der Vereinigten Staaten. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Wenn Sie die Software in einem anderen Land erworben haben, gelten die Gesetze dieses Landes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7480156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 RECHTLICHE WIRKUNG. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 Dieser Vertrag beschreibt bestimmte Rechte.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 M\'f6 +\loch\f38 glicherweise haben Sie unter den Gesetzen Ihres Landes\hich\af38\dbch\af11\loch\f38 weitergehende Rechte.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 } +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 M\'f6\loch\f38 \hich\f38 glicherweise verf\'fc\loch\f38 \hich\f38 gen Sie au\'df\loch\f38 \hich\f38 erdem +\'fc\loch\f38 ber Rechte im Hinblick auf die Partei, von der Sie die Software erworben haben.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Dieser Vertrag \'e4\loch\f38 +ndert nicht Ihre Rechte, die sich aus den Gesetzen Ihres Landes ergeben, sofern die Gesetze Ihres L\hich\af38\dbch\af11\loch\f38 andes dies nicht zulassen.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1031\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1031\langfenp1033\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid9393746 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 \hich\f38 AUSSCHLUSS VON GARANTIEN. DIE SOFTWARE WIRD \'84\loch\f38 \hich\f38 WIE BESEHEN\'93\loch\f38 LIZENZIERT. SIE TRAGEN DAS}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 \hich\f38 +MIT DER VERWENDUNG VERBUNDENE RISIKO. MICROSOFT GEW\'c4\loch\f38 \hich\f38 HRT KEINE AUSDR\'dc\loch\f38 \hich\f38 CKLICHEN GEW\'c4\loch\f38 \hich\f38 HRLEISTUNGEN ODER GARANTIEN. M\'d6\loch\f38 GLICHERWEISE GELTEN UNTER DE\hich\af38\dbch\af13\loch\f38 +\hich\f38 N \'d6\loch\f38 \hich\f38 RTLICH ANWENDBAREN GESETZEN ZUS\'c4\loch\f38 TZLICHE VERBRAUCHERRECHTE ODER GESETZLICHE GARANTIEN, DIE}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 \hich\f38 DURCH DIESEN VERTRAG NICHT ABGE\'c4\loch\f38 \hich\f38 NDERT WERDEN K\'d6\loch\f38 NNEN.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 IM DURCH DAS \'d6\loch\f38 RTLICH ANWENDBARE RECHT ZUGELASSENEN UMFANG SCHLIESST MICROSOFT KONK +\hich\af38\dbch\af11\loch\f38 \hich\f38 LUDENTE GARANTIEN DER HANDELS\'dc\loch\f38 \hich\f38 BLICHKEIT, EIGNUNG F\'dc\loch\f38 R EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG VON RECHTEN DRITTER AUS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid9393746 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 F\'dc\loch\f38 +R AUSTRALIEN \hich\f38 \endash \loch\f38 NACH DEM AUSTRALIAN CONSUMER LAW GELTEN GESETZLICHE GARANTIEN, UND}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1031\langfe1033\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 ES BESTEHT AN KEINER STELLE IN DIESEN BESTIMMUNGEN DIE ABSICHT, DIESE RECHTE EINZUSCHR\'c4\loch\f38 NKEN.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid9393746 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 BESCHR\'c4\loch\f38 +\hich\f38 NKUNG UND AUSSCHLUSS DES SCHADENERSATZES. SIE K\'d6\loch\f38 NNEN VON MICROSOFT UND}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 DEREN LIEFERANTEN NUR EINEN ERSATZ F\'dc\loch\f38 \hich\f38 R DIREKTE SCH\'c4\loch\f38 DEN BIS ZU EINEM BETRAG VON}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid9393746 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 US-DOLLAR ERHALTEN. SIE K\'d6\loch\f38 \hich\f38 +NNEN KEINEN ERSATZ F\'dc\loch\f38 \hich\f38 R ANDERE SCH\'c4\loch\f38 \hich\f38 DEN ERHALTEN, EINSCHLIESSLICH FOLGESCH\'c4\loch\f38 \hich\f38 DEN, SCH\'c4\loch\f38 \hich\f38 DEN AUS ENTGANGENEM GEWINN, SPEZIELLE, INDIREKTE ODER ZUF\'c4\loch\f38 \hich\f38 +LLIGE SCH\'c4\loch\f38 DEN.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Diese Beschr\'e4 +\loch\f38 \hich\f38 nkung gilt f\'fc\loch\f38 r}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 +jeden Gegenstand im Zusammenhang mit der Soft\hich\af38\dbch\af11\loch\f38 \hich\f38 ware, Diensten, Inhalten (einschlie\'df\loch\f38 lich Code) auf Internetseiten von Drittanbietern oder Programmen von Drittanbietern und}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1031\langfe1033\langnp1031\langfenp1033\insrsid7547218\charrsid16335299 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Anspr\'fc\loch\f38 \hich\f38 che aus Vertragsverletzungen, Verletzungen der Garantie oder der Gew\'e4\loch\f38 \hich\f38 +hrleistung, verschuldensunabh\'e4\loch\f38 \hich\f38 ngiger Haftung, Fahrl\'e4\loch\f38 ssi\hich\af38\dbch\af11\loch\f38 gkeit oder anderen unerlaubten Handlungen im durch das anwendbare Recht zugelassenen Umfang.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid7480156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid11828113\charrsid16335299 \hich\af38\dbch\af13\loch\f38 \hich\f38 +Sie hat auch dann G\'fc\loch\f38 \hich\f38 ltigkeit, wenn Microsoft von der M\'f6\loch\f38 \hich\f38 glichkeit der Sch\'e4\loch\f38 \hich\f38 den gewusst hat oder h\'e4\loch\f38 \hich\f38 tte wissen m\'fc\loch\f38 ssen.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1031\langfe1033\langnp1031\insrsid7547218\charrsid16335299 \hich\af38\dbch\af11\loch\f38 \hich\f38 Obige Beschr\'e4\loch\f38 nkung und obiger Ausschluss gelten \hich\af38\dbch\af11\loch\f38 \hich\f38 m\'f6\loch\f38 \hich\f38 +glicherweise nicht f\'fc\loch\f38 \hich\f38 r Sie, weil Ihr Land den Ausschluss oder die Beschr\'e4\loch\f38 \hich\f38 nkung von zuf\'e4\loch\f38 \hich\f38 lligen Sch\'e4\loch\f38 \hich\f38 den, Folgesch\'e4\loch\f38 \hich\f38 den oder sonstigen Sch\'e4 +\loch\f38 \hich\f38 den nicht gestattet. Wenn Sie die Software in DEUTSCHLAND oder in \'d6\loch\f38 \hich\f38 STERREICH erworben haben, findet die Beschr\'e4\loch\f38 nkung i\hich\af38\dbch\af11\loch\f38 m\hich\af38\dbch\af11\loch\f38 \hich\f38 + vorstehenden Absatz \'84\loch\f38 \hich\f38 Beschr\'e4\loch\f38 \hich\f38 nkung und Ausschluss des Schadenersatzes\'93\loch\f38 \hich\f38 auf Sie keine Anwendung. Stattdessen gelten f\'fc\loch\f38 \hich\f38 +r Schadenersatz oder Ersatz vergeblicher Aufwendungen, gleich aus welchem Rechtsgrund einschlie\'df\loch\f38 lich unerlaubter Handlung, die folgenden R\hich\af38\dbch\af11\loch\f38 e\hich\af38\dbch\af11\loch\f38 \hich\f38 +gelungen: Microsoft haftet bei Vorsatz, grober Fahrl\'e4\loch\f38 \hich\f38 ssigkeit, bei Anspr\'fc\loch\f38 \hich\f38 chen nach dem Produkthaftungsgesetz sowie bei Verletzung von Leben, K\'f6\loch\f38 \hich\f38 +rper oder der Gesundheit nach den gesetzlichen Vorschriften. Microsoft haftet nicht f\'fc\loch\f38 \hich\f38 r leichte Fahrl\'e4\loch\f38 ssigkeit. \hich\af38\dbch\af11\loch\f38 W\hich\af38\dbch\af11\loch\f38 \hich\f38 +enn Sie die Software jedoch in Deutschland erworben haben, haftet Microsoft auch f\'fc\loch\f38 \hich\f38 r leichte Fahrl\'e4\loch\f38 \hich\f38 ssigkeit, wenn Microsoft eine Vertragspflicht verletzt, deren Erf\'fc\loch\f38 \hich\f38 llung die ordnungsgem +\'e4\'df\loch\f38 \hich\f38 e Durchf\'fc\loch\f38 \hich\f38 hrung des Vertrages \'fc\loch\f38 \hich\f38 berhaupt erst erm\'f6\loch\f38 glicht, deren Verle\hich\af38\dbch\af11\loch\f38 t\hich\af38\dbch\af11\loch\f38 \hich\f38 +zung die Erreichung des Vertragszwecks gef\'e4\loch\f38 \hich\f38 hrdet und auf deren Einhaltung Sie regelm\'e4\'df\loch\f38 \hich\f38 ig vertrauen d\'fc\loch\f38 \hich\f38 rfen (sog. \'84\loch\f38 \hich\f38 Kardinalpflichten\'93\loch\f38 \hich\f38 +). In diesen F\'e4\loch\f38 \hich\f38 llen ist die Haftung von Microsoft auf typische und vorhersehbare Sch\'e4\loch\f38 \hich\f38 den beschr\'e4\loch\f38 \hich\f38 nkt. In allen anderen F\'e4\loch\f38 llen\hich\af38\dbch\af11\loch\f38 +\hich\af38\dbch\af11\loch\f38 \hich\f38 haftet Microsoft auch in Deutschland nicht f\'fc\loch\f38 \hich\f38 r leichte Fahrl\'e4\loch\f38 ssigkeit.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1031\langfe1033\dbch\af13\langnp1031\insrsid4684770\charrsid16335299 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef0{\lsdlockedexcept \lsdqformat1 Normal;\lsdqformat1 heading 1;\lsdqformat1 heading 2;\lsdqformat1 heading 3;\lsdqformat1 heading 4; +\lsdqformat1 heading 5;\lsdqformat1 heading 6;\lsdqformat1 heading 7;\lsdqformat1 heading 8;\lsdqformat1 heading 9;toc 1;toc 2;toc 3;toc 4;toc 5;toc 6;toc 7;toc 8;toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 caption;List Number;List 4;List 5; +\lsdqformat1 Title;Default Paragraph Font;\lsdqformat1 Subtitle;Salutation;Date;Body Text First Indent;\lsdqformat1 Strong;\lsdqformat1 Emphasis;Table Grid;\lsdsemihidden1 \lsdpriority99 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdpriority99 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000005076 +c345a7b8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.ENU.rtf b/setup/resources/eula/VF_EULA.ENU.rtf new file mode 100644 index 00000000000..09d89b443a8 --- /dev/null +++ b/setup/resources/eula/VF_EULA.ENU.rtf @@ -0,0 +1,692 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f40\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f41\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;} +{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);} +{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);} +{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;} +{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;}{\f444\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f454\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f452\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;} +{\f453\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f455\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f456\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f459\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f39\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof +tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f38 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive \f2\cf11\lang1024\langfe1024\noproof +tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \f38\fs19\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 +Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 +\sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid4684770\rsid5858028\rsid9196108\rsid11758563\rsid11828113\rsid14356214\rsid14446677\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0 +\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo4\dy30\hr15\min19}{\version1}{\edmins0}{\nofpages3}{\nofwords1110}{\nofchars6329}{\nofcharsws7425}{\vern49275}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 MICROSOFT VISUAL F# }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which \hich\af38\dbch\af13\loch\f38 +includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 updates,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 supplements,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Internet-based services, and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 support services}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BY USING T\hich\af38\dbch\af13\loch\f38 HE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +You may install and use any number of copies of the software \hich\af38\dbch\af13\loch\f38 on your devices}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 to design, develop and test your programs.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 2.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ADDITIONAL\hich\af38\dbch\af13\loch\f38 LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software contains code that you are permitted to distribute in programs you develop if you comply with the terms belo\hich\af38\dbch\af13\loch\f38 w.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 + The code and text files listed below are \'93\loch\f38 \hich\f38 Distributable Code.\'94}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 REDIST\hich\af38\dbch\af13\loch\f38 .TXT Files}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +. You may copy and distribute the object code form of code listed in REDIST.TXT files.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Third Party Distribution}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 . You may permit distributors o\hich\af38\dbch\af13\loch\f38 +f your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 add significant primary functionality to it in your programs;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 for any Distributable Code\hich\af38\dbch\af13\loch\f38 having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your program;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code included in a setup program only as part of that setup program without modification;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\loch\af38\dbch\af13\hich\f38 \rquote \loch\f38 fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the Distributable Code;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 s trademarks in your programs\hich\f38 \rquote \loch\f38 names or in a way that suggests your\hich\af38\dbch\af13\loch\f38 programs come from or are endorsed by Microsoft;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code to run on a platform other than the Windows platform;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 include Distributable Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 modify or distribute the source code of any Di\hich\af38\dbch\af13\loch\f38 +stributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 others have the\hich\af38\dbch\af13\loch\f38 right to modify it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 THIRD PARTY PROGRAMS AND NOTICES}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 +. Other third party code included in the software is licensed to you by Microsoft under this license agreement, rather than licensed to you by any third party under some other license terms. Notices, if any, for this thir\hich\af38\dbch\af13\loch\f38 +d party code are included with the software and may also be}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 found in the ThirdPartyNotices.txt file. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use \hich\af38\dbch\af13\loch\f38 +the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 revers\hich\af38\dbch\af13\loch\f38 e engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 make more copies of the software than specified in this agreement or allowed by applicable law, despite this li\hich\af38\dbch\af13\loch\f38 mitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 publish the software for others to copy;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may make one backup copy of the +\hich\af38\dbch\af13\loch\f38 software. You may use it only to reinstall the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 TRANSFER TO ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may unin\hich\af38\dbch\af13\loch\f38 +stall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is subject to United States export laws and regulations. You must comply with all domestic and inte\hich\af38\dbch\af13\loch\f38 +rnational export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we +\hich\af38\dbch\af13\loch\f38 may not provide support services for it.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 APPLICABLE LAW.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live gove +\hich\af38\dbch\af13\loch\f38 rn all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Outside the United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 If you acquired the software in any other country, the laws of that country apply.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This agreement des\hich\af38\dbch\af13\loch\f38 +cribes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 laws of your country do not permit it to do so.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f38 \hich\f38 AS-IS.\'94\loch\f38 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY G +\hich\af38\dbch\af13\loch\f38 +UARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 FOR AUSTRALIA \hich\f38 \endash \loch\f38 YOU HAVE +\hich\af38\dbch\af13\loch\f38 STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 +. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.0\hich\af38\dbch\af11\loch\f38 0. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This limitation applies to}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third\hich\af38\dbch\af13\loch\f38 party programs; and}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the pos\hich\af38\dbch\af13\loch\f38 +sibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 3; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1; +\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8; +\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e50000000000000000000000007074 +16b8f045ce010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000707416b8f045ce01 +707416b8f045ce010000000000000000000000005400330042004100430054004b0032005500c400da005100570034005300dc00d7003200d9003300c600d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000707416b8f045 +ce01707416b8f045ce010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30393430 +443034442d394333322d344535322d393035392d4534424344444345354439427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.ESN.rtf b/setup/resources/eula/VF_EULA.ESN.rtf new file mode 100644 index 00000000000..75745c54bf6 --- /dev/null +++ b/setup/resources/eula/VF_EULA.ESN.rtf @@ -0,0 +1,783 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff39\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt Meiryo};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};} +{\f622\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f805\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f1230\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f1231\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f1233\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f1234\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f1235\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f1236\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f1237\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f1238\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f1250\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f1251\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f1253\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f1254\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f1255\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f1256\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f1257\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f1258\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f1342\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt Meiryo};}{\f1340\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt Meiryo};}{\f1341\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt Meiryo};} +{\f1343\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt Meiryo};}{\f1344\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt Meiryo};}{\f1347\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt Meiryo};} +{\f1362\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f1570\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f1571\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f1573\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f1574\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f1577\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f1578\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f1620\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f1621\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};} +{\f1623\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f1624\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f1625\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};} +{\f1626\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f1627\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f1628\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};} +{\f1629\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f1630\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f1631\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};} +{\f1633\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f1634\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f1637\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};} +{\f7452\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f9282\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f9280\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};} +{\f9281\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f9283\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f9284\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};} +{\f9287\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\lang13322\langfe13322\dbch\af11\langnp13322\langfenp13322 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 \styrsid3501162 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat \styrsid3501162 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat \styrsid3501162 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat \styrsid3501162 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat \styrsid3501162 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat \styrsid3501162 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat \styrsid3501162 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat \styrsid3501162 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat \styrsid3501162 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat \styrsid3501162 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang13322\langfe13322\loch\f0\hich\af0\dbch\af11\cgrid\langnp13322\langfenp13322 \snext11 \ssemihidden \sunhideused Normal Table;} +{\*\cs15 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink1 \slocked \styrsid3501162 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink2 \slocked \styrsid3501162 +Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink3 \slocked \styrsid3501162 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink4 \slocked \styrsid3501162 +Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink5 \slocked \styrsid3501162 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink6 \slocked \styrsid3501162 +Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink7 \slocked \styrsid3501162 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink8 \slocked \styrsid3501162 +Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink9 \slocked \styrsid3501162 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 +\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid3501162 Body 1;}{ +\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext25 \styrsid3501162 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid3501162 Body 3;}{\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext27 \styrsid3501162 Body 4;}{ +\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext28 \styrsid3501162 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid3501162 Body 6;}{\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext30 \styrsid3501162 Body 7;}{ +\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext31 \styrsid3501162 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 \styrsid3501162 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 \styrsid3501162 +Bullet 1;}{\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 \styrsid3501162 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext35 \slink87 \styrsid3501162 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 \styrsid3501162 Bullet 4;}{\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 \styrsid3501162 +Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 \styrsid3501162 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \styrsid3501162 +Bullet 7;}{\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 \styrsid3501162 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon32 \snext41 \styrsid3501162 Bullet 9;}{\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid3501162 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid3501162 +Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 \styrsid3501162 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \styrsid3501162 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 \styrsid3501162 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid3501162 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 \styrsid3501162 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 \styrsid3501162 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon36 \snext50 \styrsid3501162 Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 \styrsid3501162 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 +\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 \styrsid3501162 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 \styrsid3501162 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 \styrsid3501162 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 +\sbasedon10 \slink54 \slocked \ssemihidden \styrsid3501162 Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 +\ai\af39\afs19\alang1025 \ltrch\fcs0 \i\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 \styrsid3501162 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 +\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 Body 2 Char;}{\*\cs58 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 Body 3 Char;}{\*\cs59 \additive +\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 +Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 \styrsid3501162 Preamble Border Above;}{\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext62 \slink63 \ssemihidden \styrsid3501162 footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \f39\fs20 \sbasedon10 \slink62 \slocked \ssemihidden \styrsid3501162 Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden \styrsid3501162 footnote reference;}{ +\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext65 \slink66 \ssemihidden \styrsid3501162 endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f39\fs20 \sbasedon10 \slink65 \slocked \ssemihidden \styrsid3501162 Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 +\ltrch\fcs0 \super \sbasedon10 \ssemihidden \styrsid3501162 endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden \styrsid3501162 annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f39\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden \styrsid3501162 Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid3501162 annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 \styrsid3501162 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 \styrsid3501162 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \styrsid3501162 Hyperlink,Char Char7;}{ +\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext74 \slink75 \ssemihidden \styrsid3501162 Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af39\afs16 \ltrch\fcs0 \f39\fs16 \sbasedon10 \slink74 \slocked \ssemihidden \styrsid3501162 Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af40 +\ltrch\fcs0 \b\f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \styrsid3501162 page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 \styrsid3501162 +Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \slink108 \styrsid3501162 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \styrsid3501162 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 \styrsid3501162 header;}{\*\cs82 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 +\sbasedon10 \slink81 \slocked \styrsid3501162 Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 \styrsid3501162 footer;}{\*\cs84 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink83 \slocked \styrsid3501162 +Footer Char;}{\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused \styrsid3501162 annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20 \sbasedon69 \slink85 \slocked \ssemihidden \styrsid3501162 Comment Subject Char;}{\*\cs87 +\additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink35 \slocked \styrsid3501162 Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 \styrsid3501162 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\langnp1033\langfenp1033 \sbasedon10 \styrsid3501162 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af39\afs20\alang1025 \ltrch\fcs0 \fs18\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 \styrsid3501162 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af39\afs24\alang1025 \ltrch\fcs0 +\b\f40\fs24\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 \styrsid3501162 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 +\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 \styrsid3501162 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext93 \spriority0 \styrsid3501162 Heading French Warranty;}{\*\cs94 \additive \f39\lang1033\langfe0\langnp1033\langfenp0 \slocked \styrsid3501162 +Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof \styrsid3501162 LogoportDoNotTranslate;}{\*\cs96 \additive \b\f39 \styrsid3501162 +Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 \styrsid3501162 tw4winError;}{\*\cs98 \additive \cf2 \styrsid3501162 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof \styrsid3501162 LogoportPopup;}{\*\cs100 \additive +\f2\cf10\lang1024\langfe1024\noproof \styrsid3501162 LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof \styrsid3501162 LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof \styrsid3501162 DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 \styrsid3501162 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink103 \slocked \styrsid3501162 Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 \styrsid3501162 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink49 \slocked \styrsid3501162 Heading 3 Bold Char;}{\*\cs107 +\additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon106 \slink105 \slocked \styrsid3501162 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 +\sbasedon10 \slink79 \slocked \styrsid3501162 Body 0 Bold Char;}{\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs20\alang1025 \ltrch\fcs0 +\b\fs20\lang1026\langfe2052\super\loch\f39\hich\af39\dbch\af11\cgrid\langnp1026\langfenp2052 \sbasedon0 \snext109 \slink110 \styrsid3501162 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 +\b\f39\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked \styrsid3501162 LIMPA_T4WINEXTERNAL Char;}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240 +\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462} +{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li357 +\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 \fi-360\li720 +\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li1077 +\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 +\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 +\b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 +\b\i0\f40\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 +\b\i0\f40\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 +\b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 +\b\i0\f40\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 +\b\i0\f40\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 +\b0\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 +\b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\strike0\f40\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af40\afs20 \ltrch\fcs0 \b0\i0\f40\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid592233\rsid862019\rsid1525167\rsid2782071\rsid2821592\rsid3501162\rsid3755635\rsid3962836\rsid4082101\rsid4196117\rsid4221619\rsid4340674\rsid4684770\rsid5519702\rsid5600443\rsid5858028\rsid5924501\rsid6362931\rsid7232747 +\rsid7496668\rsid7603395\rsid7615002\rsid8935412\rsid9196108\rsid9266526\rsid9578647\rsid10101028\rsid11758563\rsid11828113\rsid12075451\rsid12342359\rsid12799225\rsid13053153\rsid13114859\rsid13699315\rsid14356214\rsid14375208\rsid14446677\rsid15358268 +\rsid15548830\rsid15610056\rsid16131606\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo9\dy25\hr16\min16} +{\revtim\yr2013\mo9\dy26\hr1\min35}{\version1}{\edmins0}{\nofpages3}{\nofwords1357}{\nofchars7739}{\nofcharsws9078}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7232747 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7232747 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7232747 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7232747 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid3501162\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 +\insrsid5924501 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 \insrsid5924501 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 \insrsid5924501 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 \insrsid5924501 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 \insrsid5924501 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39 \ltrch\fcs0 \insrsid5924501 +\par }}{\*\pnseclvl1\pnucrm\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnqc\pnstart1\pnindent720\pnhang +{\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl8\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 T\'c9\loch\f39 RMINOS DE LICENCIA DEL SOFTWARE DE MICROSOFT}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid2821592\charrsid7603395 \hich\af39\dbch\af11\loch\f39 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 +Los presentes t\'e9\hich\af39\dbch\af13\loch\f39 \hich\f39 rminos de licencia constituyen un contrato entre Microsoft Corporation (o, en funci\'f3\loch\f39 n de donde resida, una de sus filiales) y usted.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid3962836 \hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 +\hich\af39\dbch\af13\loch\f39 Le rogamos que los lea atentamente.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid3962836 \hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \ab0\af39\afs20 +\ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 Son de aplicaci\'f3\loch\f39 \hich\f39 n al software antes mencionado, el cual incluye los soportes f\'ed\loch\f39 +sicos en\hich\af39\dbch\af13\loch\f39 los que lo haya recibido, si los hubiera.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Estos t\'e9\loch\f39 \hich\f39 rminos tambi\'e9\loch\f39 \hich\f39 n se aplicar\'e1\loch\f39 n a los siguientes elementos de Microsoft:}{ +\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 actualizaciones,}{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 suplementos,}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 servicios basados en Internet y}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 servicios de ayuda t\'e9\loch\f39 cnica.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 +Todos ellos deben corresponder a este software, salvo que existan otros t\'e9\loch\f39 rminos aplicables a dichos elementos.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 +\hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 En tal caso, se aplicar\'e1\loch\f39 \hich\f39 n eso otros t\'e9\loch\f39 +rminos.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 AL HACER USO DEL SOFTWARE, ESTAR\'c1\loch\f39 \hich\f39 ACEPTANDO ESTOS T\'c9\loch\f39 RMINOS.}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 SI NO LOS ACEPTA, NO UTILICE EL SOFTWA\hich\af39\dbch\af11\loch\f39 RE.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid8935412\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +SI CUMPLE LOS PRESENTES T\'c9\loch\f39 \hich\f39 RMINOS DE LICENCIA, DISPONDR\'c1\loch\f39 A PERPETUIDAD DE LOS DERECHOS SIGUIENTES.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\lang3082\langfe1033\loch\af39\hich\af39\dbch\af13\langnp3082\langfenp1033\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid2821592 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 +DERECHOS DE INSTALACI\'d3\loch\f39 N Y DE USO.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid2821592\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Puede instalar y utilizar cualquier n\'fa\loch\f39 \hich\f39 mero de copias del software en sus dispositivos para dise\'f1\loch\f39 +ar, desarrollar y pro\hich\af39\dbch\af11\loch\f39 bar sus programas.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 REQUISITOS DE LICENCIA Y/O DERECHOS DE USO ADICIONALES.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 C\'f3\loch\f39 +digo Distribuible.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 El software contiene c\'f3\loch\f39 \hich\f39 digo que puede distribuir en los programas que desarrolle siempre que cumpla con los t\'e9 +\loch\f39 rminos siguientes.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Derecho a Utilizar y Distribuir. +}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \cs58\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 \hich\f39 El c\'f3\loch\f39 \hich\f39 digo y los archivos de texto que se indican a continuaci\'f3\loch\f39 \hich\f39 n son \'93\loch\f39 \hich\f39 C\'f3\loch\f39 \hich\f39 digo Distribuible\'94.}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Archivos REDIST.TXT}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 .}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 + }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Puede copiar y distribuir el c\'f3\loch\f39 digo objeto de los archivos REDIST.TXT.}{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid13699315 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Distribuci\'f3\loch\f39 n de terceros}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 .}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Puede per\hich\af39\dbch\af11\loch\f39 mitir a los distribuidores de sus programas que copien y distribuyan el}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid13699315\charrsid7603395 \~}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 C\'f3 +\loch\f39 digo Distribuible como parte de esos programas.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +Requisitos de Distribuci\'f3\loch\f39 n.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\cs58\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Para cualquier C\'f3\loch\f39 digo Distribuible que distribuya debe}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 +agregarle una funcionalidad primaria\hich\af39\dbch\af11\loch\f39 significativa en sus programas;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 para cualquier C\'f3\loch\f39 \hich\f39 digo Distribuible que tenga una extensi\'f3\loch\f39 \hich\f39 +n de nombre de archivo .lib, distribuya solo los resultados de ejecutar dicho C\'f3\loch\f39 \hich\f39 digo Distribuible a trav\'e9\loch\f39 s de un vinculador con su programa;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 distribuir C\'f3\loch\f39 digo Dis\hich\af39\dbch\af11\loch\f39 \hich\f39 tribuible incluido en un programa de instalaci\'f3\loch\f39 \hich\f39 +n como parte de ese programa de instalaci\'f3\loch\f39 n sin modificarlo}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid3962836\charrsid7603395 \hich\af39\dbch\af11\loch\f39 ;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 exigir a los distribuidores y usuarios finales externos que acepten t\'e9\loch\f39 rminos que lo protejan en la misma medida que este contrato;}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 + +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 mostrar su a\hich\af39\dbch\af11\loch\f39 \hich\f39 viso de propiedad intelectual v\'e1\loch\f39 lido en sus programas; e}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 indemnizar, defender y eximir de responsabilidad a Microsoft de cualquier reclamaci\'f3\loch\f39 \hich\f39 +n, incluidos honorarios de abogados, relacionados con la distribuci\'f3\loch\f39 n o el uso de sus programas.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Restriccion +\hich\af39\dbch\af11\loch\f39 \hich\f39 es de Distribuci\'f3\loch\f39 n.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\cs58\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 No puede}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 alterar ning\'fa +\loch\f39 \hich\f39 n aviso de propiedad intelectual, marca o patente en el C\'f3\loch\f39 digo Distribuible;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 utilizar las marcas de Microsoft en los nombres de sus programas de una forma que sugiera que estos provienen de Microsof\hich\af39\dbch\af11\loch\f39 +t o que esta los respalda;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 distribuir el C\'f3\loch\f39 digo Distribuible para que se ejecute en una plataforma distinta de Windows;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 incluir C\'f3\loch\f39 \hich\f39 digo Distribuible en programas malintencionados, enga\'f1\loch\f39 \hich\f39 osos o il\'ed\loch\f39 citos; o}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\lang3082\langfe1033\loch\af3\hich\af3\dbch\af13\langnp3082\langfenp1033\insrsid11828113\charrsid7603395 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 modificar o distribuir el c\'f3\loch\f39 digo fuente de cual\hich\af39\dbch\af13\loch\f39 \hich\f39 quier C\'f3\loch\f39 +\hich\f39 digo Distribuible para que cualquier parte de \'e9\loch\f39 \hich\f39 l est\'e9\loch\f39 sujeta a una Licencia Excluida.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 +\hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Una Licencia Excluida es una que exige, como condici\'f3\loch\f39 \hich\f39 +n de uso, modificaci\'f3\loch\f39 \hich\f39 n o distribuci\'f3\loch\f39 n que}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 el c\'f3\loch\f39 +\hich\f39 digo se revele o distribuya en c\'f3\loch\f39 digo fuente; u}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 otros teng\hich\af39\dbch\af11\loch\f39 an el derecho a modificarlo.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid2821592\charrsid7603395 \hich\af39\dbch\af11\loch\f39 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid4340674 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid2821592\charrsid7603395 \hich\af39\dbch\af11\loch\f39 +PROGRAMAS Y NOTIFICACIONES DE TERCEROS.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid6362931\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Microsoft le licencia otro c\'f3\loch\f39 \hich\f39 +digo de terceros incluido en el software en virtud de este contrato de licencia, en lugar de que un tercero se lo licencie conforme a otros t\'e9\loch\f39 rminos de}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid4340674\charrsid7603395 \~}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 licencia.}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid6362931\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 +\hich\f39 Las notificaciones, si las hubiera, por este c\'f3\loch\f39 \hich\f39 digo de terceros se incluyen con el software y tambi\'e9\loch\f39 n se pueden encontrar en el archivo ThirdPartyNotices.txt.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11758563\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\loch\af39\dbch\af11\hich\f39 \'c1\loch\f39 MBITO DE LA LICENCIA.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 El software se cede sujeto a licencia y no es objeto de venta.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 +El presente contrato solo le otorga algunos Derechos de Uso del software.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Microsoft se reserva todos los dem\'e1\loch\f39 s derechos.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +A menos que la legislaci\'f3\loch\f39 \hich\f39 n aplicable le otorgue m\'e1\loch\f39 \hich\f39 s derechos a pesar de esta limitaci\'f3\loch\f39 \hich\f39 n, solo podr\'e1\loch\f39 utilizar el software tal como se \hich\af39\dbch\af11\loch\f39 +permite expresamente en este contrato.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Al hacerlo, deber\'e1\loch\f39 \hich\f39 ajustarse a las limitaciones t\'e9\loch\f39 +cnicas del software que solo permiten utilizarlo de determinadas formas.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 No puede}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +eludir las limitaciones t\'e9\loch\f39 cnicas del software;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 utilizar t\'e9\loch\f39 \hich\f39 cnicas de ingenier\'ed\loch\f39 a in\hich\af39\dbch\af11\loch\f39 \hich\f39 +versa, descompilar o desensamblar el software, excepto y \'fa\loch\f39 \hich\f39 nicamente en la medida en que lo permita expresamente la legislaci\'f3\loch\f39 \hich\f39 n aplicable, a pesar de la presente limitaci\'f3\loch\f39 n;}{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 hacer m\'e1\loch\f39 \hich\f39 s copias del software de las que se especifican en este contrato o est\'e9\loch\f39 n \hich\af39\dbch\af11\loch\f39 +\hich\f39 permitidas por la legislaci\'f3\loch\f39 \hich\f39 n vigente a pesar de esta limitaci\'f3\loch\f39 n;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 hacer p\'fa\loch\f39 blico el software para que otros lo copien;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 alquilar, arrendar o dar en pr\'e9\loch\f39 stamo el software;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 transmitir el software o este contrato a un tercero; o}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 utilizar el software para prestar servicios de alojamiento de software comercial.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 COPIA DE SEGURIDAD.}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 \hich\f39 Puede realizar una \'fa\loch\f39 nica copia de seguridad del software.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Solo podr\'e1\loch\f39 utilizarla para volver a instalar el software.}{\rtlch\fcs1 \ab0\af39\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 6.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 DOCUMENTACI\'d3\loch\f39 N.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 +\hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Toda persona que \hich\af39\dbch\af11\loch\f39 \hich\f39 tenga acceso v\'e1\loch\f39 +\hich\f39 lido a su equipo o a la red interna puede copiar y utilizar la documentaci\'f3\loch\f39 n a efectos internos de consulta.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 7.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 TRANSMISI\'d3\loch\f39 N A OTRO DISPOSITIVO.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +Usted podr\'e1\loch\f39 desinstalar el software e instalarlo en otro dispositivo para su uso.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 No puede hacerl\hich\af39\dbch\af11\loch\f39 o para compartir esta licencia entre dispositivos.}{\rtlch\fcs1 \ab0\af39\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid4340674 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 \hich\f39 RESTRICCIONES EN MATERIA DE EXPORTACI\'d3\loch\f39 N.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 El software est\'e1\loch\f39 \hich\f39 sujeto a las leyes y a los reglamentos en materia de exportaci\'f3\loch\f39 +n de Estados Unidos.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Debe cumplir todas las leyes y reglamentos, nacionales e int\hich\af39\dbch\af11\loch\f39 \hich\f39 ernacionales, en materia de exportaci\'f3\loch\f39 +\hich\f39 n que sean de aplicaci\'f3\loch\f39 n al software.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Dichas leyes incluyen limitaciones en cuanto a destino, usuarios finales y uso final.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid2821592\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +Para obtener m\'e1\loch\f39 \hich\f39 s informaci\'f3\loch\f39 n, visite }{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4340674\charrsid7603395 \hich\af39\dbch\af13\loch\f39 www.microsoft.com/exporting}{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid2821592\charrsid7603395 .}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\af39\hich\af39\dbch\af13\langfenp1033\insrsid11828113\charrsid3962836 \hich\af39\dbch\af13\loch\f39 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113\charrsid3962836 +\hich\af39\dbch\af13\loch\f39 \hich\f39 SERVICIOS DE SOPORTE T\'c9\hich\af39\dbch\af13\loch\f39 CNICO.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 \hich\f39 Debido a que este software se presenta \'93\loch\f39 \hich\f39 tal cual\'94\loch\f39 \hich\f39 , no podemos proporcionar servicios de soporte t\'e9\loch\f39 +cnico para el mismo.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 10.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 CONTRATO COMPLETO.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 El presente contrato y los t\'e9\loch\f39 +rminos aplicables a complementos, actualizaciones, servicios basados en Intern\hich\af39\dbch\af11\loch\f39 \hich\f39 et y servicios de soporte t\'e9\loch\f39 cnico que utilice constituyen el contrato completo respecto al software y}{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid9578647\charrsid3962836 \~}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +a los servicios de soporte t\'e9\loch\f39 cnico.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 \hich\f39 LEGISLACI\'d3\loch\f39 N APLICABLE.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Estados Unidos de Am +\'e9\loch\f39 rica.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Si adquiri\'f3\loch\f39 \hich\f39 el software en los Estados Unidos de Am\'e9\loch\f39 rica, la \hich\af39\dbch\af11\loch\f39 \hich\f39 +interpretaci\'f3\loch\f39 \hich\f39 n del presente contrato se regir\'e1\loch\f39 \hich\f39 por la legislaci\'f3\loch\f39 \hich\f39 n del Estado de Washington, que se aplicar\'e1\loch\f39 + a las reclamaciones por incumplimiento del mismo, con independencia de conflictos de principios legales.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Para el resto de reclamaciones, ser\'e1\loch\f39 aplica\hich\af39\dbch\af11\loch\f39 \hich\f39 +ble la legislaci\'f3\loch\f39 \hich\f39 n de su estado de residencia, incluidas las reclamaciones en virtud de las leyes estatales en materia de protecci\'f3\loch\f39 n al consumidor, competencia desleal y responsabilidad extracontractual.}{\rtlch\fcs1 +\ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 b.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Fuera de los Estados Unidos de Am\'e9\loch\f39 rica.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 Si adquir +\hich\af39\dbch\af11\loch\f39 \hich\f39 i\'f3\loch\f39 \hich\f39 el software en otro pa\'ed\loch\f39 \hich\f39 s, se aplicar\'e1\loch\f39 \hich\f39 la legislaci\'f3\loch\f39 \hich\f39 n de dicho pa\'ed\loch\f39 s.}{\rtlch\fcs1 \ab0\af39\afs20 +\ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid4340674 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 EFECTOS LEGALES.}{\rtlch\fcs1 +\af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 Este contrato describe determinados derechos legales.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 +\ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Es posible que disponga de otros derechos en virtud de la legislaci\'f3\loch\f39 \hich\f39 n de su jurisdicci\'f3\loch\f39 n.}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 +\hich\af39\dbch\af11\loch\f39 Asimismo, pueden asi\hich\af39\dbch\af11\loch\f39 \hich\f39 stirle determinados derechos con respecto a la parte de la que adquiri\'f3\loch\f39 el software.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 +Este contrato no modifica los derechos de los que dispone en virtud}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\langnp3082\insrsid4340674\charrsid7603395 \~}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\b0\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 de la legislaci\'f3\loch\f39 \hich\f39 n de su pa\'ed\loch\f39 \hich\f39 s si dicha legislaci\'f3\loch\f39 n no permite tal cosa.}{\rtlch\fcs1 +\ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\lang3082\langfe1033\loch\af39\hich\af39\dbch\af13\langnp3082\langfenp1033\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 RENUNCIA DE GARANT\'cd\loch\f39 A.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid3962836 \hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 +\hich\af39\dbch\af13\loch\f39 \hich\f39 EL SOFTWARE SE CONCEDE CON LICENCIA \'93\loch\f39 \hich\f39 TAL CUAL\'94\loch\f39 . POR CONSIGUIENTE, USTED ASUME EL RIESGO DE UTILIZARLO.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid3962836 \hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 +\hich\af39\dbch\af13\loch\f39 \hich\f39 MICROSOFT NO OTORGA NINGUNA GARANT\'cd\loch\f39 \hich\f39 A NI CONDICI\'d3\loch\f39 N EXPRESA.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid3962836 +\hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 ES POSIBLE QUE LA LEGISLACI\'d3\loch\f39 \hich\f39 +N LOCAL LE OTORGUE DERECHOS ADICIONALES COMO CONSUMIDOR O GARANT\'cd\loch\f39 A\hich\af39\dbch\af13\loch\f39 S LEGALES QUE EL PRESENTE CONTRATO NO PUEDA MODIFICAR.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 +EN LA MEDIDA EN QUE AS\'cd\loch\f39 \hich\f39 LO PERMITA LA LEGISLACI\'d3\loch\f39 \hich\f39 N LOCAL, MICROSOFT EXCLUYE LAS GARANT\'cd\loch\f39 \hich\f39 AS IMPL\'cd\loch\f39 \hich\f39 +CITAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN PARTICULAR Y AUSENCIA DE INFRACCI\'d3\loch\f39 N DE DERECHOS.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 PARA AUSTR +\hich\af39\dbch\af11\loch\f39 \hich\f39 ALIA: TIENE GARANT\'cd\loch\f39 \hich\f39 AS LEGALES DE ACUERDO CON LA LEY DEL CONSUMIDOR DE AUSTRALIA Y NADA EN ESTOS T\'c9\loch\f39 \hich\f39 RMINOS TIENE LA INTENCI\'d3\loch\f39 N DE AFECTAR ESOS DERECHOS.}{ +\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 LIMITACI\'d3\loch\f39 +\hich\f39 N Y EXCLUSI\'d3\loch\f39 N DE RECURSOS E INDEMNIZACIONES.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 LA CANTIDAD M\'c1\loch\f39 \hich\f39 XIMA QUE SE PODR\'c1\loch\f39 OBTENER DE MICRO\hich\af39\dbch\af11\loch\f39 \hich\f39 +SOFT Y DE SUS PROVEEDORES EN CONCEPTO DE INDEMNIZACI\'d3\loch\f39 \hich\f39 N POR DA\'d1\loch\f39 \hich\f39 OS DIRECTOS SER\'c1\loch\f39 \hich\f39 DE 5 D\'d3\loch\f39 LARES ESTADOUNIDENSES.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid4340674\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid4340674\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 NO PODR +\'c1\loch\f39 \hich\f39 OBTENER INDEMNIZACI\'d3\loch\f39 \hich\f39 N ALGUNA POR DA\'d1\loch\f39 \hich\f39 OS DE OTRA \'cd\loch\f39 \hich\f39 NDOLE, INCLUIDOS LOS DA\'d1\loch\f39 OS CONSECUENCIALES, POR LUCRO CESANTE, ESPECIALES, INDIRECTOS O IN +\hich\af39\dbch\af11\loch\f39 CIDENTALES.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Esta limitaci\'f3 +\loch\f39 n se aplica a}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid7603395 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Cualquier cuesti\'f3 +\loch\f39 \hich\f39 n relacionada con el software, los servicios, el contenido (incluido el c\'f3\loch\f39 digo) que se hallen en sitios de Internet de terceros o programas de terceros.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f3\fs20\lang3082\langfe1033\langnp3082\langfenp1033\insrsid1525167\charrsid7603395 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Reclamaciones por incumplimiento de contrato, incumplimiento de garant\'ed\loch\f39 \hich\f39 a o condici\'f3\loch\f39 \hich\f39 +n, responsabilidad objetiva, negligencia u otra responsabilidad extracontractual en la medida permitida por la legislaci\'f3\loch\f39 n aplicable.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid11828113\charrsid7603395 \hich\af39\dbch\af13\loch\f39 \hich\f39 +Asimismo, tambi\'e9\loch\f39 \hich\f39 n ser\'e1\loch\f39 \hich\f39 de aplicaci\'f3\loch\f39 n in\hich\af39\dbch\af13\loch\f39 \hich\f39 cluso si Microsoft conoc\'ed\loch\f39 \hich\f39 a o deber\'ed\loch\f39 \hich\f39 +a haber conocido la posibilidad de que se produjesen dichos da\'f1\loch\f39 os.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid3962836 \hich\af39\dbch\af11\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 +\fs20\lang3082\langfe1033\langnp3082\insrsid1525167\charrsid7603395 \hich\af39\dbch\af11\loch\f39 \hich\f39 Tambi\'e9\loch\f39 \hich\f39 n pueden producirse situaciones en las que la limitaci\'f3\loch\f39 \hich\f39 n o exclusi\'f3\loch\f39 \hich\f39 +n precedente no pueda aplicarse a su caso porque su jurisdicci\'f3\loch\f39 n no admita la exc\hich\af39\dbch\af11\loch\f39 \hich\f39 lusi\'f3\loch\f39 \hich\f39 n o limitaci\'f3\loch\f39 \hich\f39 n de da\'f1\loch\f39 \hich\f39 +os incidentales consecuenciales o de otra \'ed\loch\f39 ndole.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang3082\langfe1033\dbch\af13\langnp3082\insrsid4684770\charrsid3962836 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000060e9 +44942abace01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.FRA.rtf b/setup/resources/eula/VF_EULA.FRA.rtf new file mode 100644 index 00000000000..704b7c9d7e5 --- /dev/null +++ b/setup/resources/eula/VF_EULA.FRA.rtf @@ -0,0 +1,772 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}{\f60\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Arial Unicode MS};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f574\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f1044\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Arial Unicode MS};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 2;}{\s25\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 1;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink105 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon24 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\*\cs56 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\s57\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 \i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext57 +Bullet 4 Italics;}{\*\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{ +\s64\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext64 \slink65 \ssemihidden endnote text;}{\*\cs65 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink64 \slocked \ssemihidden Endnote Text Char;}{\*\cs66 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s67\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext67 \slink68 \ssemihidden annotation text;}{\*\cs68 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink67 \slocked \ssemihidden +Comment Text Char;}{\*\cs69 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s70\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext70 Char;}{\*\cs71 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 page number;}{\*\cs77 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Heading 2 Char1;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon67 \snext67 \slink84 \ssemihidden \sunhideused annotation subject;}{\*\cs84 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon68 \slink83 \slocked \ssemihidden Comment Subject Char;}{\s85\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext85 \slink86 footer;} +{\*\cs86 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink85 \slocked Footer Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{ +\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\*\cs105 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 +\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 +\b0\f38\fs19 \sbasedon105 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid4033\rsid292528\rsid462051\rsid1056732\rsid1836639\rsid1846015\rsid1989812\rsid2170227\rsid2635675\rsid3023205\rsid3755635\rsid3825644\rsid4684770\rsid5442766\rsid5519702\rsid5858028\rsid6034992\rsid6043487\rsid7079533\rsid7348377 +\rsid7633199\rsid7755623\rsid7818290\rsid8353355\rsid8393706\rsid8795575\rsid9196108\rsid9459417\rsid10249058\rsid10828463\rsid11758563\rsid11828113\rsid11933508\rsid12799225\rsid13446792\rsid13636676\rsid13833610\rsid14102649\rsid14356214\rsid14375208 +\rsid14446677\rsid14896080\rsid15145194\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18} +{\revtim\yr2013\mo9\dy24\hr3\min20}{\version1}{\edmins0}{\nofpages3}{\nofwords1422}{\nofchars8107}{\nofcharsws9510}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2635675 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2635675 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2635675 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2635675 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid10828463 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10828463 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10828463 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10828463 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10828463 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10828463 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 TERMES DU CONTRAT DE LICENCE LOGICIEL MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 \hich\f38 +Les pr\'e9\loch\f38 sents termes du con\hich\af38\dbch\af13\loch\f38 \hich\f38 trat de licence constituent un contrat entre Microsoft Corporation (ou en fonction du lieu o\'f9\loch\f38 vous vivez, l\hich\f38 \rquote \loch\f38 \hich\f38 un de ses affili +\'e9\loch\f38 \hich\f38 s) et vous. Lisez-les attentivement. Ils portent sur le logiciel vis\'e9\loch\f38 ci-dessus, y compris le support sur lequel vous l\hich\f38 \rquote \loch\f38 \hich\f38 avez re\'e7\loch\f38 u,\hich\af38\dbch\af13\loch\f38 +\hich\af38\dbch\af13\loch\f38 \hich\f38 le cas \'e9\loch\f38 \hich\f38 ch\'e9\loch\f38 ant.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Ce contrat porte \'e9\loch\f38 galement sur les produits Microsoft suivants\~:}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 les mises \'e0 +\loch\f38 jour,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 les suppl\'e9\loch\f38 ments,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 les services Internet, et}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 les services d\hich\f38 \rquote \loch\f38 assistance technique}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 \hich\f38 +de ce logiciel \'e0\loch\f38 moins que d\hich\f38 \rquote \loch\f38 autres termes n\hich\f38 \rquote \loch\f38 accompagnent ces\hich\af38\dbch\af13\loch\f38 produits, auquel cas}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid14896080\charrsid3825644 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +\hich\f38 ces derniers pr\'e9\loch\f38 valent.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 EN UTILISANT LE LOGICIEL, VOUS ACCEPTEZ CES TERMES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 SI VOUS NE LES ACCEPTEZ PAS, N\hich\f38 \rquote \loch\f38 UTILISEZ PAS LE LOGICIEL}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +SI VOUS VOUS CONFORMEZ AUX PR\'c9\loch\f38 \hich\f38 SENTS TERMES DU CONTRAT DE LICENCE, VOUS DISPOSEZ DES DROITS PERP\'c9\hich\af38\dbch\af11\loch\f38 \hich\f38 TUELS STIPUL\'c9\loch\f38 S CI-DESSOUS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1036\langfenp1033\insrsid5442766\charrsid3825644 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15145194 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid5442766\charrsid3825644 \hich\af38\dbch\af13\loch\f38 +INSTALLATION ET DROITS D\hich\f38 \rquote \loch\f38 UTILISATION.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid5442766\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez installer et utiliser un nombre quelconque de copies du logiciel sur vos dispositifs pour concevoir, d\'e9\loch\f38 +velopper et tester vos programmes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid5442766\charrsid3825644 \hich\af38\dbch\af11\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid5442766\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 CONDITIONS DE \hich\af38\dbch\af11\loch\f38 LICENCE ET/OU DROITS D\hich\f38 \rquote \loch\f38 UTILISATION SUPPLEMENTAIRES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Code Distribuable. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs56\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel contient du code que vous \'ea\loch\f38 \hich\f38 tes autoris\'e9\loch\f38 \hich\f38 \'e0 +\loch\f38 \hich\f38 distribuer dans les programmes que vous d\'e9\loch\f38 \hich\f38 veloppez, sous r\'e9\loch\f38 \hich\f38 serve de vous conformer aux termes ci-apr\'e8\loch\f38 s.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Droit d\hich\f38 \rquote +\loch\f38 Utilisation e\hich\af38\dbch\af11\loch\f38 t de Distribution. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le code et les fichiers texte r +\'e9\loch\f38 \hich\f38 pertori\'e9\loch\f38 \hich\f38 s ci-apr\'e8\loch\f38 \hich\f38 s constituent le \'ab\~\loch\f38 Code Distribuable\~\hich\f38 \'bb.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Fichiers REDIST.TXT}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 . Vous \'ea\loch\f38 \hich\f38 tes autoris\'e9\loch\f38 \hich\f38 \'e0\loch\f38 \hich\f38 copier et +\'e0\loch\f38 \hich\f38 distribuer la version en code objet du code r\'e9\loch\f38 \hich\f38 pertori\'e9\loch\f38 dans les fichiers REDIST.TXT.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid1989812 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Dist\hich\af38\dbch\af11\loch\f38 ribution par des tiers}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 . vous pouvez autoriser les distributeurs de vos programmes \'e0\loch\f38 \hich\f38 copier et \'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1036\langfe1033\langnp1036\insrsid1989812\charrsid3825644 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +distribuer le Code Distribuable en tant que partie int\'e9\loch\f38 grante de ces programmes.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Conditions de Distribution. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Pour tout Code Distribuable que vous distri\hich\af38\dbch\af11\loch\f38 buez, vous devez\~:}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +y ajouter des fonctionnalit\'e9\loch\f38 s importantes et principales au sein de vos programmes,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 pour tout Code distribuable dont l\hich\f38 \rquote \loch\f38 \hich\f38 extension de nom de fichier est .lib, distribuer seulement les r\'e9\loch\f38 +sultats de l\hich\f38 \rquote \loch\f38 \hich\f38 ex\'e9\loch\f38 \hich\f38 cution de ce Code distribuable \'e0\loch\f38 \hich\af38\dbch\af11\loch\f38 l\hich\f38 \rquote \loch\f38 aide d\hich\f38 \rquote \loch\f38 \hich\f38 un \'e9\loch\f38 +diteur de liens avec votre programme\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 distribuer le Code distribuable inclus dans un programme d\hich\f38 \rquote \loch\f38 \hich\f38 installation seulement en tant que partie int\'e9\loch\f38 +grante de ce programme sans modification\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 exiger des distributeurs et des utilisateurs finaux \hich\af38\dbch\af11\loch\f38 externes qu\hich\f38 \rquote \loch\f38 \hich\f38 +ils acceptent les termes qui prot\'e8\loch\f38 \hich\f38 gent le Code Distribuable de mani\'e8\loch\f38 \hich\f38 re au moins \'e9\loch\f38 \hich\f38 quivalente \'e0\loch\f38 \hich\f38 ceux du pr\'e9\loch\f38 sent contrat\~; }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 afficher votre propre mention de droits d\hich\f38 \rquote \loch\f38 auteur valable dans vos programmes, et}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 garantir et d\'e9\loch\f38 fendre Microsoft contre \hich\af38\dbch\af11\loch\f38 \hich\f38 toute r\'e9\loch\f38 +clamation, y compris pour les honoraires d\hich\f38 \rquote \loch\f38 \hich\f38 avocats, qui r\'e9\loch\f38 sulterait de la distribution ou de l\hich\f38 \rquote \loch\f38 utilisation de vos programmes.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Restrictions de distribution. } +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Vous n\hich\f38 \rquote \'ea\loch\f38 \hich\f38 tes pas autoris\'e9\loch\f38 \hich\f38 \'e0\~\loch\f38 :}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +modifier toute mention de droits d\hich\f38 \rquote \loch\f38 auteur, marques ou me\hich\af38\dbch\af11\loch\f38 \hich\f38 ntion de droits de propri\'e9\loch\f38 \hich\f38 t\'e9\loch\f38 industrielle pouvant figurer dans le Code Distribuable\~;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 utiliser les marques de Microsoft dans les noms de vos programmes ou d\hich\f38 \rquote \loch\f38 \hich\f38 une fa\'e7\loch\f38 \hich\f38 on qui sugg\'e8 +\loch\f38 \hich\f38 re que vos programmes sont fournis ou recommand\'e9\loch\f38 s par Microsoft,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 distribuer\hich\af38\dbch\af11\loch\f38 tout Code Distribuable en vue d\hich\f38 \rquote \loch\f38 \hich\f38 une ex\'e9\loch\f38 +cution sur toute plateforme autre que la plateforme Windows,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 inclure le Code Distribuable dans des programmes malveillants, trompeurs ou interdits par la loi\~; ou}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1036\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1036\langfenp1033\insrsid11828113\charrsid3825644 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 modifier ou distribuer le code source de tout Cod\hich\af38\dbch\af13\loch\f38 \hich\f38 e Distribuable de mani\'e8\loch\f38 +\hich\f38 re \'e0\loch\f38 ce qu\hich\f38 \rquote \loch\f38 il fasse l\hich\f38 \rquote \loch\f38 objet, en tout ou partie, d\hich\f38 \rquote \loch\f38 une Licence Exclue.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Une Licence Exclue implique comme condition d\hich\f38 \rquote \loch\f38 utilisation, de modification ou de distribution, que :}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 le code soit divulgu +\'e9\loch\f38 \hich\f38 ou distribu\'e9\loch\f38 sous forme de code source\hich\af38\dbch\af11\loch\f38 , ou}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 d\hich\f38 \rquote \loch\f38 autres aient le droit de le modifier.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid1836639 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 PROGRAMMES TIERS ET MENTIONS.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid14896080\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Les autres codes de tiers inclus dans le logiciel vous sont conc\'e9\loch\f38 \hich\f38 d\'e9\loch\f38 \hich\f38 s sous licence par Microsoft au titre du pr\'e9\loch\f38 +sent contrat de licence, et non par un tiers au titre d\hich\f38 \rquote \hich\af38\dbch\af11\loch\f38 autres termes de licence.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid14896080\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Les}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid1836639\charrsid3825644 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 mentions \'e9\loch\f38 +\hich\f38 ventuelles relatives \'e0\loch\f38 \hich\f38 ces codes de tiers sont incluses dans le logiciel et peuvent \'ea\loch\f38 tre disponibles dans le fichier ThirdPartyNotices.txt.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11758563\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7348377 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 CHAMP D\hich\f38 \rquote \loch\f38 APPLICATION DE LA LICENCE. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Le logiciel n\hich\f38 \rquote \loch\f38 \hich\f38 est pas vendu mais conc\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 d\'e9\loch\f38 sous licence.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat vous conf\'e8\loch\f38 re certains droits d\hich\f38 \rquote \loch\f38 utilisation du logiciel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Microsoft se r\'e9\loch\f38 serve tous les autres droits.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Sauf si la r\'e9\loch\f38 \hich\f38 glementation applicable vous conf\'e8\loch\f38 re d\hich\f38 \rquote \loch\f38 \hich\f38 +autres droits, nonobstant la pr\'e9\loch\f38 sente limitation, vous n\hich\f38 \rquote \'ea\loch\f38 tes autor\hich\af38\dbch\af11\loch\f38 \hich\f38 is\'e9\loch\f38 \hich\f38 \'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 utiliser le logiciel qu\hich\f38 \rquote +\loch\f38 \hich\f38 en conformit\'e9\loch\f38 \hich\f38 avec les termes du pr\'e9\loch\f38 sent contrat.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \loch\af38\dbch\af11\hich\f38 \'c0\loch\f38 + cette fin, vous devez vous conformer aux restrictions techniques contenues dans le logiciel qui vous permettent de l\hich\f38 \rquote \loch\f38 utiliser d\hich\f38 \rquote \loch\f38 \hich\f38 une certaine fa\'e7\loch\f38 on.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +Vous n\hich\f38 \rquote \'ea\loch\f38 \hich\f38 tes pas autoris\'e9\loch\f38 \hich\f38 \'e0\~\hich\af38\dbch\af11\loch\f38 :}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +contourner les restrictions techniques contenues dans le logiciel\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 reconstituer la logique du logiciel, le d\'e9\loch\f38 \hich\f38 compiler ou le d\'e9\loch\f38 \hich\f38 sassembler, sauf dans la mesure o\'f9 +\loch\f38 \hich\f38 ces op\'e9\loch\f38 \hich\f38 rations seraient express\'e9\loch\f38 \hich\f38 ment permises par la r\'e9\loch\f38 glementation applicable nonobsta\hich\af38\dbch\af11\loch\f38 \hich\f38 nt la pr\'e9\loch\f38 sente limitation\~;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 effectuer plus de copies du logiciel que ce qui n\hich\f38 \rquote \loch\f38 \hich\f38 est autoris\'e9\loch\f38 \hich\f38 dans le pr\'e9\loch\f38 +\hich\f38 sent contrat ou par la r\'e9\loch\f38 \hich\f38 glementation applicable, nonobstant la pr\'e9\loch\f38 sente limitation\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 publier le logiciel en vue d\hich\f38 \rquote \loch\f38 une reproduction par autrui\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 louer ou pr\'ea\loch\f38 ter le logiciel\~;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 transf\'e9\loch\f38 \hich\f38 rer le logiciel ou le pr\'e9\loch\f38 \hich\f38 sent contrat \'e0\loch\f38 un tiers\~; ou}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 utiliser le logiciel en association avec des services d\hich\f38 \rquote \loch\f38 \hich\f38 h\'e9\loch\f38 bergement commercial.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 COPIE DE SAUVEGARDE. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous \'ea\loch\f38 \hich\f38 tes autoris\'e9\loch\f38 \hich\f38 \'e0\loch\f38 + effectuer une copie de sauvegarde du\hich\af38\dbch\af11\loch\f38 logiciel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Vous ne pouvez l\hich\f38 \rquote \loch\f38 \hich\f38 utiliser que dans le but de r\'e9\loch\f38 installer le logiciel.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid3023205\charrsid3825644 \hich\af38\dbch\af11\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid3023205\charrsid3825644 \hich\af38\dbch\af11\loch\f38 DOCUMENTATION}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 . }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Tout utilisateur disposant d\hich\f38 \rquote \loch\f38 \hich\f38 un acc\'e8\loch\f38 \hich\f38 s valable \'e0 +\loch\f38 \hich\f38 votre ordinateur ou \'e0\loch\f38 \hich\f38 votre r\'e9\loch\f38 \hich\f38 seau interne est autoris\'e9\loch\f38 \hich\f38 \'e0\loch\f38 \hich\f38 copier et \'e0\loch\f38 \hich\f38 utiliser la documentation \'e0\loch\f38 +\hich\f38 titre de r\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 f\'e9\loch\f38 \hich\f38 rence et \'e0\loch\f38 des fins internes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 TRANSFERT \'c0\loch\f38 UN AUTRE DISPOSITIF. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous \'ea\loch\f38 \hich\f38 tes autoris\'e9\loch\f38 \hich\f38 \'e0\loch\f38 \hich\f38 d\'e9\loch\f38 \hich\f38 sinstaller le logiciel et +\'e0\loch\f38 l\hich\f38 \rquote \loch\f38 installer sur un autre dispositif pour votre propre usage.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Vous n\hich\f38 \rquote \'ea\loch\f38 \hich\f38 tes pas autoris\'e9\loch\f38 \hich\f38 \'e0\loch\f38 \hich\f38 proc\'e9 +\loch\f38 der de la sorte afin de partager cette licen\hich\af38\dbch\af11\loch\f38 ce entre plusieurs dispositifs.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15145194 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 RESTRICTIONS \'c0\loch\f38 L\hich\f38 \rquote \loch\f38 EXPORTATION. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel est soumis aux lois et r\'e9\loch\f38 \hich\f38 glementations am\'e9\loch\f38 \hich\f38 ricaines en mati\'e8\loch\f38 re d +\hich\f38 \rquote \loch\f38 exportation.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous devez vous conformer \'e0\loch\f38 \hich\f38 toutes les lois et r\'e9\loch\f38 \hich\f38 +glementations nationales et internationales en mati\'e8\loch\f38 r\hich\af38\dbch\af11\loch\f38 e d\hich\f38 \rquote \loch\f38 exportation concernant le logiciel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +Ces lois comportent des restrictions sur les utilisateurs finals et les utilisations finales.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Des informations suppl\'e9\loch\f38 mentaires sont disponibles sur le site www.microsoft.com/exporting.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1036\langfenp1033\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 SERVICE D\hich\f38 \rquote \loch\f38 ASSISTANCE TECHNIQ\hich\af38\dbch\af13\loch\f38 UE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Ce logiciel \'e9\loch\f38 \hich\f38 tant fourni \'ab\~\loch\f38 en l\hich\f38 \rquote \'e9\loch\f38 tat\~\hich\f38 \'bb\loch\f38 , Microsoft ne fournira aucun service d\hich\f38 \rquote \loch\f38 assistance technique.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 10.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7348377 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 INT\'c9\loch\f38 \hich\f38 GRALIT\'c9\loch\f38 DES ACCORDS. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat ainsi que les termes concernant les suppl\'e9\loch\f38 \hich\f38 ments, les mises \'e0}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +jour, les services Internet et d\hich\f38 \rquote \hich\af38\dbch\af11\loch\f38 assistance technique que vous utilisez constituent l\hich\f38 \rquote \loch\f38 \hich\f38 int\'e9\loch\f38 \hich\f38 gralit\'e9\loch\f38 + des accords en ce qui concerne le logiciel et les services d\hich\f38 \rquote \loch\f38 assistance technique.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 \hich\f38 R\'c9\loch\f38 GLEMENTATION APPLICABLE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \loch\af38\dbch\af11\hich\f38 \'c9\loch\f38 tats-Unis. }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Si vous avez acquis le logiciel aux \'c9\loch\f38 tats-Unis, les lois de l\hich\f38 \rquote +\loch\af38\dbch\af11\hich\f38 \'c9\loch\f38 \hich\f38 tat de Washington, \'c9\loch\f38 tats-Unis d\hich\f38 \rquote \loch\f38 \hich\f38 Am\'e9\loch\f38 \hich\f38 rique, r\'e9\loch\f38 gissent l\hich\f38 \rquote \loch\f38 \hich\f38 interpr\'e9\loch\f38 +tation de ce contrat et s\hich\f38 \rquote \loch\f38 \hich\f38 appliquent en cas de r\'e9\loch\f38 clamation pour rupture dudit contrat, sans donner d\hich\f38 \rquote \loch\f38 \hich\f38 effet aux dispositions r\'e9\loch\f38 gissant les conflits de lois. +}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 Les lois du pays dans lequel vous viv\hich\af38\dbch\af11\loch\f38 \hich\f38 ez r\'e9\loch\f38 \hich\f38 gissent toutes les autres r\'e9\loch\f38 \hich\f38 clamations, notamment les r\'e9\loch\f38 \hich\f38 clamations fond +\'e9\loch\f38 \hich\f38 es sur les lois f\'e9\loch\f38 \hich\f38 d\'e9\loch\f38 \hich\f38 rales en mati\'e8\loch\f38 \hich\f38 re de protection des consommateurs, de concurrence d\'e9\loch\f38 \hich\f38 loyale et de d\'e9\loch\f38 lits.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 En dehors des \'c9\loch\f38 tats-Unis. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Si vous avez acquis le logiciel dans un au\hich\af38\dbch\af11\loch\f38 tre pays, les lois de ce pays s\hich\f38 \rquote \loch\f38 appliquent.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 EFFET JURIDIQUE. }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat d\'e9\loch\f38 \hich\f38 crit certains droits l\'e9\loch\f38 gaux.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 ficier d\hich\f38 \rquote \loch\f38 \hich\f38 autres droits pr\'e9\loch\f38 \hich\f38 vus par les lois de votre \'c9\loch\f38 tat ou pays.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez \'e9\loch\f38 \hich\f38 galement b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 \hich\f38 ficier de certains droits \'e0\loch\f38 l\hich\f38 \rquote \'e9\loch\f38 ga\hich\af38\dbch\af11\loch\f38 \hich\f38 +rd de la partie aupr\'e8\loch\f38 s de laquelle vous avez acquis le logiciel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat ne modifie pas les droits que vous conf\'e8\loch\f38 \hich\f38 rent les lois de votre \'c9\loch\f38 +tat ou pays si celles-ci ne le permettent pas.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1036\langfenp1033\insrsid292528\charrsid3825644 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid292528 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid292528\charrsid3825644 \hich\af38\dbch\af13\loch\f38 \hich\f38 EXCLUSIONS DE GARANTIE. LE LOGICIEL EST CONC\'c9\loch\f38 \hich\f38 D\'c9\loch\f38 SOUS LICE\hich\af38\dbch\af13\loch\f38 \hich\f38 NCE +\'ab\~\loch\f38 EN L\hich\f38 \rquote \'c9\loch\f38 TAT\~\hich\f38 \'bb\loch\f38 . VOUS ASSUMEZ\~\hich\f38 TOUS LES RISQUES LI\'c9\loch\f38 \hich\f38 S \'c0\loch\f38 SON UTILISATION. MICROSOFT N\hich\f38 \rquote \loch\f38 \hich\f38 +ACCORDE AUCUNE GARANTIE OU CONDITION EXPRESSE. VOUS POUVEZ B\'c9\loch\f38 \hich\f38 N\'c9\loch\f38 \hich\f38 FICIER DE DROITS DES CONSOMMATEURS SUPPL\'c9\loch\f38 MENTAIRES OU DE GARANTIES STATUTAIRES DANS LE CADRE DU DROIT LOCAL, +\hich\af38\dbch\af13\loch\f38 QUE CE CONTRAT NE PEUT MODIFIER.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid292528\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 LORSQUE CELA EST AUTORIS\'c9\loch\f38 +\hich\f38 PAR LE DROIT LOCAL, MICROSOFT EXCLUT LES GARANTIES IMPLICITES DE QUALIT\'c9\loch\f38 , D\hich\f38 \rquote \loch\f38 \hich\f38 AD\'c9\loch\f38 \hich\f38 QUATION \'c0\loch\f38 UN USAGE PARTICULIER ET D\hich\f38 \rquote \loch\f38 \hich\f38 +ABSENCE DE CONTREFA\'c7\loch\f38 ON.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 POUR L\hich\f38 \rquote +\loch\f38 AUSTRALIE \hich\f38 \endash \loch\f38 LA LOI AUSTRALIENNE SUR LA CONSOMMATIO\hich\af38\dbch\af11\loch\f38 N (AUSTRALIAN CONSUMER LAW) VOUS ACCORDE DES GARANTIES STATUTAIRES QU\hich\f38 \rquote \loch\f38 \hich\f38 AUCUN \'c9\loch\f38 \hich\f38 L +\'c9\loch\f38 \hich\f38 MENT DU PR\'c9\loch\f38 SENT ACCORD NE PEUT AFFECTER.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid7348377\charrsid3825644 \hich\af38\dbch\af11\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid292528 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \hich\af38\dbch\af11\loch\f38 +LIMITATION ET EXCLUSION DE RECOURS ET DE DOMMAGES. VOUS POUVEZ OBTENIR DE MICROSOFT ET DE SES FOURNISSEURS UNE INDEMNISATION EN CAS \hich\af38\dbch\af11\loch\f38 \hich\f38 DE DOMMAGES DIRECTS LIMIT\'c9\loch\f38 \hich\f38 E \'c0\loch\f38 U.S.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid292528\charrsid3825644 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \hich\af38\dbch\af11\loch\f38 $5}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid292528\charrsid3825644 ,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 +00. VOUS NE POUVEZ PR\'c9\loch\f38 \hich\f38 TENDRE \'c0\loch\f38 AUCUNE INDEMNISATION POUR LES AUTRES DOMMAGES, Y\~\hich\f38 COMPRIS LES DOMMAGES SP\'c9\loch\f38 \hich\f38 CIAUX, INDIRECTS, INCIDENTS OU ACCESSOIRES ET LES PERTES DE B\'c9\loch\f38 +\hich\f38 N\'c9\loch\f38 FICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 Cette limitation concerne\~:}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 toute affaire li\'e9 +\loch\f38 e au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers\~; et}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1036\langfe1033\langnp1036\langfenp1033\insrsid15145194\charrsid3825644 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 les r\'e9\loch\f38 \hich\f38 clamations pour rupture de contrat ou violation de garantie, les r\'e9\loch\f38 clamations en cas de responsab +\hich\af38\dbch\af11\loch\f38 \hich\f38 ilit\'e9\loch\f38 \hich\f38 sans faute, de n\'e9\loch\f38 \hich\f38 gligence ou autre d\'e9\loch\f38 \hich\f38 lit dans la limite autoris\'e9\loch\f38 e par la loi en vigueur.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid7348377 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid11828113\charrsid3825644 \hich\af38\dbch\af13\loch\f38 Elle s\hich\f38 +\rquote \loch\f38 \hich\f38 applique \'e9\loch\f38 \hich\f38 galement m\'ea\loch\f38 me si Microsoft connaissait l\hich\f38 \rquote \'e9\loch\f38 \hich\f38 ventualit\'e9\loch\f38 d\hich\f38 \rquote \loch\f38 un tel dommage.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 La limitation ou l\hich\f38 \rquote \loch\f38 exclusion ci}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1036\langfe1033\langnp1036\insrsid7348377\charrsid3825644 \_}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid15145194\charrsid3825644 \hich\af38\dbch\af11\loch\f38 \hich\f38 dessus peut \'e9\loch\f38 \hich\f38 +galement ne pas vous \'ea\loch\f38 tre ap\hich\af38\dbch\af11\loch\f38 plicable si votre pays n\hich\f38 \rquote \loch\f38 autorise pas l\hich\f38 \rquote \loch\f38 \hich\f38 exclusion ou la limitation de responsabilit\'e9\loch\f38 + pour les dommages incidents, indirects ou de quelque nature que ce soit.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid4684770\charrsid3825644 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000020c7 +06e2a6b8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.ITA.rtf b/setup/resources/eula/VF_EULA.ITA.rtf new file mode 100644 index 00000000000..0b3ce5a32ac --- /dev/null +++ b/setup/resources/eula/VF_EULA.ITA.rtf @@ -0,0 +1,782 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}{\f60\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Arial Unicode MS};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f574\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f1044\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Arial Unicode MS};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 2;}{\s25\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 1;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink105 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon24 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\*\cs56 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\s57\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 \i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext57 +Bullet 4 Italics;}{\*\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{ +\s64\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext64 \slink65 \ssemihidden endnote text;}{\*\cs65 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink64 \slocked \ssemihidden Endnote Text Char;}{\*\cs66 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s67\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext67 \slink68 \ssemihidden annotation text;}{\*\cs68 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink67 \slocked \ssemihidden +Comment Text Char;}{\*\cs69 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s70\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext70 Char;}{\*\cs71 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 page number;}{\*\cs77 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Heading 2 Char1;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon67 \snext67 \slink84 \ssemihidden \sunhideused annotation subject;}{\*\cs84 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon68 \slink83 \slocked \ssemihidden Comment Subject Char;}{\s85\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext85 \slink86 footer;} +{\*\cs86 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink85 \slocked Footer Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{ +\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\*\cs105 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 +\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 +\b0\f38\fs19 \sbasedon105 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid542930\rsid817246\rsid2587577\rsid3167715\rsid3755635\rsid3766380\rsid4684770\rsid5389818\rsid5444653\rsid5519702\rsid5590698\rsid5858028\rsid5910282\rsid7151733\rsid8066132\rsid9196108\rsid9576227\rsid9839027\rsid10431777 +\rsid11224864\rsid11758563\rsid11808066\rsid11828113\rsid12214352\rsid12543524\rsid12612634\rsid12674559\rsid12799225\rsid12805609\rsid14356214\rsid14375208\rsid14446677\rsid14908137\rsid15548830\rsid15607867\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0 +\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo9\dy24\hr3\min34}{\version1}{\edmins0}{\nofpages3}{\nofwords1543}{\nofchars8797} +{\nofcharsws10320}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz283\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7151733 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7151733 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7151733 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7151733 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid5389818 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5389818 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5389818 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5389818 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5389818 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s85\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid5389818 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 +\hich\af38\dbch\af11\loch\f38 CONDIZIONI DI LICENZA SOFTWARE MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid9576227\charrsid12674559 \hich\af38\dbch\af11\loch\f38 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 + +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11808066 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 +Le presenti condizioni di licenza costituiscono il contratto tra Microsoft Corporation (o, in base al luogo di residenza del}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11808066 \~}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 licenziatario, una delle sue consociate) e il licenziatario.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid14908137 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 +\hich\af38\dbch\af13\loch\f38 \hich\f38 Il licenziatario dovr\'e0\loch\f38 leggerle con attenzione.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid14908137 \hich\af38\dbch\af13\loch\f38 + }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 Le presenti condizioni\hich\af38\dbch\af13\loch\f38 \hich\f38 + si applicano al suddetto software Microsoft, inclusi gli eventuali supporti di memorizzazione sui quali \'e8\loch\f38 stato ricevuto.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Le presenti condizioni si applicano inoltre a}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 aggiornamenti,}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 supplementi,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 servizi Microsoft basati su Internet e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 servizi di supporto tecnico}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11224864 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 +forniti da Microsoft relativi al predetto software, a meno che questi non siano accompagnati da condizioni specifiche.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 In}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid11224864 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +tal caso, tali condizioni specifiche prevarranno su quelle del presente contratto.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 +\hich\af38\dbch\af13\loch\f38 UTILIZZANDO IL SOFTWARE, IL LICENZIATARIO ACCETTA LE PRESENTI CONDIZIONI.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 QUALORA IL LICENZIATARIO NON LE ACCETTI, NON DOVR\'c0\loch\f38 UTILIZZARE IL SOFTWARE.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid9839027\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +QUALORA IL LICENZIATARIO SI ATTENGA ALLE PRESENTI CONDIZIONI DI LICENZA, DISPORR\'c0\hich\af38\dbch\af11\loch\f38 DEI DIRITTI PERPETUI INDICATI DI SEGUITO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1040\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1040\langfenp1033\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid9839027 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 +DIRITTI DI INSTALLAZIONE E DI UTILIZZO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid9839027\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario potr\'e0\loch\f38 + installare e utilizzare un numero qualsiasi di copie del software nei propri dispositivi per progettare, sviluppare e testare i propri programmi.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 REQUISITI AGGIUNTIVI PER LE LICENZE E/O DIRITTI SULL\hich\f38 \rquote \loch\f38 UTILIZZO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Codice Distribuibile.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs56\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Il software contiene codice che il licenziatario potr\'e0\loch\f38 \hich\f38 distribuire nei programmi che svilupper\'e0\loch\f38 \hich\f38 , purch\'e9\loch\f38 si attenga alle condizioni di seguito riportate.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Diritto di +\hich\af38\dbch\af11\loch\f38 Utilizzo e Distribuzione.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il codice e i file di testo elencati di seguito costituiscono il \'93\loch\f38 \hich\f38 Codice Distribuibile\'94.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 File REDIST.TXT}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario potr\'e0\loch\f38 + duplicare e distribuire il formato in codice oggetto del codice elencato nei file REDIST.TXT.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid12612634 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Distribuzione da Parte di Terzi}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12612634 .}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12612634 \hich\af38\dbch\af11\loch\f38 I}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +\hich\f38 l licenziatario potr\'e0\loch\f38 autorizzare i distributori dei propri programmi a}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid12612634 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 duplicare e distribuire il Codice Distribuibile nell\hich\f38 \rquote \loch\f38 ambito di tali programmi.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Requisiti per la Distribuzione.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Per distribuire il Codice Distribui\hich\af38\dbch\af11\loch\f38 \hich\f38 bile, il licenziatario dovr\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +aggiungere rilevanti e significative funzionalit\'e0\loch\f38 nei programmi;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 distribuire, per ogni file del Codice distribuibile con estensione .lib, solo i risultati dell\hich\f38 \rquote \loch\f38 +esecuzione di tale Codice Distribu\hich\af38\dbch\af11\loch\f38 ibile attraverso un linker al programma;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 distribuire il Codice Distribuibile incluso in un programma di installazione solo nell\hich\f38 \rquote \loch\f38 +ambito di tale programma e senza alcuna modifica;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 far accettare ai distributori e agli utenti finali esterni condizioni che \hich\af38\dbch\af11\loch\f38 +garantiscano al software almeno lo stesso livello di tutela definito nel presente contratto;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\expnd0\expndtw-1\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12612634 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw-1\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12612634 \hich\af38\dbch\af11\loch\f38 visualizzare una valida comunicazione di copyright del licenziatario sui programmi del licenziatario stesso e}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\expnd0\expndtw-1\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 indennizzare, manlevare e difendere Mi\hich\af38\dbch\af11\loch\f38 +crosoft da ogni e qualsiasi domanda o azione giudiziaria, ivi incluse le spese legali, relative all\hich\f38 \rquote \loch\f38 utilizzo o alla distribuzione dei programmi del licenziatario.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Restrizioni per la Distribuzione.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario non potr\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 modificare le eventuali c +\hich\af38\dbch\af11\loch\f38 omunicazioni relative ai copyright, ai marchi o ai brevetti riportati sul Codice Distribuibile;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 utilizzare i marchi di Microsoft nei nomi dei programmi o in modo tale da far presumere che i\~ +programmi provengano o siano garantiti o riconosciuti da Microso\hich\af38\dbch\af11\loch\f38 ft;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 distribuire Codice Distribuibile da eseguire su una piattaforma diversa dalla piattaforma Windows;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 includere Codice Distribuibile in programmi dannosi, ingannevoli o illegali n\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1040\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1040\langfenp1033\insrsid11828113\charrsid12674559 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 +modificare o distribuire il codice sorgente di qualsiasi Codice Distribuibile in modo che qualsiasi parte di tale codice sia soggetto a una Licenza Esclusa.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Per Licenza Esclusa si intende qualsiasi licenza che come condizione per l\hich\f38 \rquote \loch\f38 utilizzo, la modifica o \hich\af38\dbch\af11\loch\f38 la distribuzione richieda che}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +il codice sia divulgato o distribuito nel formato in codice sorgente oppure}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 altri abbiano il diritto di modificarlo.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid9839027\charrsid12674559 \hich\af38\dbch\af11\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid9839027\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +PROGRAMMI DI TERZI E COMUNICAZIONI}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid9839027\charrsid12674559 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 L\hich\f38 \rquote \loch\f38 alt\hich\af38\dbch\af11\loch\f38 \hich\f38 +ro codice di terzi incluso nel software viene concesso in licenza al licenziatario da Microsoft ai sensi del presente contratto di licenza, anzich\'e9\loch\f38 da terzi ai sensi di altre condizioni di licenza.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Eventuali comunicazioni per tale codice di terzi sono incl\hich\af38\dbch\af11\loch\f38 use nel software e si potranno anche consultare nel file ThirdPartyNotices.txt.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11758563\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11808066 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 AMBITO DI VALIDIT\'c0\loch\f38 DELLA LICENZA.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Il software non viene venduto, ma \'e8\loch\f38 concesso in licenza.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Il presente contratto concede al licenzia\hich\af38\dbch\af11\loch\f38 tario solo alcuni diritti di utilizzo del software.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Microsoft si riserva tutti gli altri diritti.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Nel}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid12805609 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 limite massimo consentito dalla legge applicabile, il licenziatario pu\'f2\loch\f38 utilizzare il software esclusivamente nei modi}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid11808066 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +espressamente concessi nel presente\hich\af38\dbch\af11\loch\f38 contratto.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Nel far ci\'f2\loch\f38 \hich\f38 , il licenziatario dovr\'e0\loch\f38 + attenersi a qualsiasi limitazione tecnica presente nel software che gli consenta di utilizzarlo solo in determinati modi.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario non potr\'e0}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +aggirare le limitazioni tecniche presenti nel software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 decodificare, decompilare n\'e9\loch\f38 \hich\f38 disassemblare il software, fatta eccezione e solo nella misura in cui tali attivit\'e0 +\loch\f38 siano espressamente consentite dalla legge applicabile, nonostante questa limitazione;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 eseguire un numero di copie del software maggiore di \hich\af38\dbch\af11\loch\f38 +quello specificato nel presente contratto o consentito dalla legge applicabile, nonostante questa limitazione;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 pubblicare il software per consentirne la duplicazione da parte di altri;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 noleggiare il software n\'e9\loch\f38 concederlo in locazione o in prestito;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 trasferire il software o il presente contratto a terzi n\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 utilizzare il software per fornire hosting di servizi commerciali.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 COPIA DI BACKUP.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario potr\'e0\loch\f38 eseguire una copia di backup del software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario potr\'e0\loch\f38 utilizzare tale copi +\hich\af38\dbch\af11\loch\f38 a esclusivamente per reinstallare il software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 DOCUMENTAZIONE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 } +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Qualsiasi persona che disponga di accesso valido al computer o alla rete interna del licenziatario pu\'f2 +\loch\f38 duplicare e utilizzare la documentazione per fini di riferimento interno.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 TRASFERIME\hich\af38\dbch\af11\loch\f38 NTO A UN ALTRO DISPOSITIVO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Il licenziatario potr\'e0\loch\f38 disinstallare il software e installarlo in un altro dispositivo per utilizzarlo.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 +}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Il licenziatario non potr\'e0\loch\f38 effettuare quanto sopra con l\hich\f38 \rquote \loch\f38 +\hich\f38 intento di utilizzare la stessa licenza su pi\'f9\loch\f38 dispositivi.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid9839027 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 LIMI\hich\af38\dbch\af11\loch\f38 TAZIONI RELATIVE ALL\hich\f38 \rquote \loch\f38 ESPORTAZIONE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Il software \'e8\loch\f38 soggetto alle leggi e alle disposizioni in vigore negli Stati Uniti in materia di controllo dell\hich\f38 \rquote \loch\f38 esportazione.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Il licenziatario dovr\'e0\loch\f38 attenersi a tutte le leggi e le disposizioni locali e internazionali appl\hich\af38\dbch\af11\loch\f38 icabili al software in materia di controllo dell\hich\f38 \rquote \loch\f38 esportazione.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Queste leggi includono limitazioni circa le destinazioni, gli utenti finali e l\hich\f38 \rquote \loch\f38 utilizzo finale.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid9839027\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Per ulteriori informazioni, il licenziatario potr\'e0\loch\f38 + visitare la pagina www.microsoft.com/exportin\hich\af38\dbch\af11\loch\f38 g.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1040\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1040\langfenp1033\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 SERVIZI DI SUPPORTO TECNICO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Poich\'e9\loch\f38 \hich\f38 il presente software viene fornito \'93 +\loch\f38 com\hich\f38 \rquote \'e8\'94\loch\f38 \hich\f38 , non \'e8\loch\f38 prevista la fornitura di servizi di supporto tecnico da parte di Microsoft.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 INTERO ACCORDO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 } +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Il presente accordo e le condizioni che disciplinano l\hich\f38 \rquote \hich\af38\dbch\af11\loch\f38 +utilizzo dei supplementi, degli aggiornamenti, dei Servizi basati su Internet e dei servizi di supporto tecnico utilizzati dal licenziatario costituiscono l\hich\f38 \rquote \loch\f38 intero accordo relativo al software ed ai servizi di supporto tecnico.} +{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 LEGGE APPLICABILE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid11808066 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 St +\hich\af38\dbch\af11\loch\f38 ati Uniti.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 Qualora il software sia stato acquistato negli Stati Uniti, il presente contratto \'e8\loch\f38 disciplinato e}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid817246 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +interpretato esclusivamente in base alla legge dello Stato di Washington e tale legge si applica ai reclami aventi}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid11808066 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 ad oggetto gli inadempimenti co\hich\af38\dbch\af11\loch\f38 ntrattuali, indipendentemente dai principi in materia di conflitto di legge.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 +\hich\af38\dbch\af11\loch\f38 Tutti gli altri reclami, inclusi quelli aventi ad oggetto inadempimenti della normativa a tutela dei consumatori, inadempimenti delle norme in materia di concorrenza sleale e l\hich\f38 \rquote \loch\f38 il +\hich\af38\dbch\af11\loch\f38 lecito civile, saranno disciplinati dalla legge dello Stato di residenza del licenziatario.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 b.\tab}}\pard \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid817246 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Al di fuori degli Stati Uniti.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Qualora il licenziatario abbia acquistato il software in qualsiasi altro paese, il} +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid817246 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +presente contratto \'e8\loch\f38 disciplinato dalla legge d\hich\af38\dbch\af11\loch\f38 i tale Paese.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 EFFETTI GIURIDICI.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 +\hich\af38\dbch\af11\loch\f38 Con il presente contratto vengono concessi determinati diritti.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 La legge del Paese di residenza del licenziatario potrebbe riconoscergli ulteriori diritti.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Il licenziatario potrebbe, inoltre, vantare ulteriori diritti d\hich\af38\dbch\af11\loch\f38 irettamente nei confronti della parte da cui ha acquistato il software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +Il presente contratto non modifica i diritti del licenziatario che la legge del Paese di residenza del licenziatario non consente di modificare.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1040\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1040\langfenp1033\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 ESCLUSIONE DI GARANZIE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid14908137 +\hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 IL SOFTWARE\hich\af38\dbch\af13\loch\f38 \hich\f38 \'c8\loch\f38 \hich\f38 + CONCESSO IN LICENZA \'93\loch\f38 COM\hich\f38 \rquote \'c8\'94\loch\f38 . IL LICENZIATARIO LO UTILIZZA A PROPRIO RISCHIO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid14908137 +\hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 NON VENGONO FORNITE GARANZIE O CONDIZIONI ESPRESSE.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid14908137 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 +\hich\af38\dbch\af13\loch\f38 IL PRESENTE CONTRATTO NON MODIFICA EVENTUALI ULTERIORI DIRITTI DEI CONSUMATORI O GARANZIE DI LEGGE RICONOSCIUTE AL LICENZIAT\hich\af38\dbch\af13\loch\f38 ARIO DALLA LEGGE LOCALE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +NELLA MISURA MASSIMA CONSENTITA DALLA LEGGE APPLICABILE, MICROSOFT ESCLUDE EVENTUALI GARANZIE IMPLICITE DI COMMERCIABILIT\'c0\loch\f38 \hich\f38 (QUALIT\'c0\loch\f38 + NON INFERIORE ALLA MEDIA), ADEGUATEZZA PER UNO SCOPO SPECIFICO E NON VIOLAZIONE DI DIRITTI DI TERZI.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 PER L\hich\f38 \rquote +\loch\f38 \hich\f38 AUSTRALIA: IL LICENZIATARIO \'c8\loch\f38 + SOGGETTO ALLE GARANZIE DI LEGGE PREVISTE AI SENSI DELLA LEGGE AUSTRALIANA A TUTELA DEI CONSUMATORI (AUSTRALIAN CONSUMER LAW) E NESSUNA DISPOSIZIONE CONTENUTA NELLE PRESENTI CONDIZIONI INFLUISCE SU TALI DIRITTI.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 +LIMITAZIONE DI RESPONSABILIT\'c0\loch\f38 ED ESCLUSIONE DI MEZZI DI TUTELA E DANNI.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 IL LICENZIATARIO PU\'d2\loch\f38 + RICHIEDERE A MICROSOFT E AI SUOI FORNITORI IL SOLO RISARCIMENTO PER I DANNI DIRETTI NEL LIMITE DI CINQUE DOLLARI (USD 5).}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 IL LICENZIATARIO NON HA DIRITTO A OTTENER\hich\af38\dbch\af11\loch\f38 +E IL RISARCIMENTO PER EVENTUALI ALTRI DANNI, INCLUSI I DANNI CONSEQUENZIALI, SPECIALI, INDIRETTI O INCIDENTALI OPPURE RELATIVI ALLA PERDITA DI PROFITTI.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard\plain \ltrpar\s25\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 Questa limitazione si applica a} +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid12674559 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +qualsiasi questione relativa al software, ai servizi, al contenuto (incluso il codice) sui siti Internet o nei programmi di terzi e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1040\langfe1033\langnp1040\langfenp1033\insrsid10431777\charrsid12674559 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 \hich\f38 reclami relativi a inadempimento contrattuale, inadempimenti della garanzia o delle condizioni, responsabilit\'e0\loch\f38 oggettiva, +\hich\af38\dbch\af11\loch\f38 negligenza o altro illecito civile, nella misura massima consentita dalla legge applicabile.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid11828113\charrsid12674559 \hich\af38\dbch\af13\loch\f38 \hich\f38 +Tale limitazione si applica anche nel caso in cui Microsoft sia stata informata o avrebbe dovuto essere informata della possibilit\'e0\loch\f38 del verificarsi di tali danni.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid14908137 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1040\langfe1033\langnp1040\insrsid10431777\charrsid12674559 \hich\af38\dbch\af11\loch\f38 +La limitazione o l\hich\f38 \rquote \loch\f38 esclusione di cui sopra potrebbe non essere applicabile al licenziatario in quanto l\hich\f38 \rquote \loch\f38 +esclusione o la limitazione di danni incidentali, consequenziali o di altro tipo potrebbe non essere consentita nel Paese di residenza del licenziatari\hich\af38\dbch\af11\loch\f38 o.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1040\langfe1033\dbch\af13\langnp1040\insrsid4684770\charrsid14908137 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000f037 +2ed7a8b8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.JPN.rtf b/setup/resources/eula/VF_EULA.JPN.rtf new file mode 100644 index 00000000000..6ab96ed52f1 --- /dev/null +++ b/setup/resources/eula/VF_EULA.JPN.rtf @@ -0,0 +1,1043 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};} +{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};} +{\f370\fbidi \fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}MS PGothic{\*\falt Arial Unicode MS};}{\f371\fbidi \fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}@MS PGothic;} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};} +{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};} +{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};} +{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} +{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} +{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f4144\fbidi \fswiss\fcharset0\fprq2 MS PGothic Western{\*\falt Arial Unicode MS};} +{\f4142\fbidi \fswiss\fcharset238\fprq2 MS PGothic CE{\*\falt Arial Unicode MS};}{\f4143\fbidi \fswiss\fcharset204\fprq2 MS PGothic Cyr{\*\falt Arial Unicode MS};}{\f4145\fbidi \fswiss\fcharset161\fprq2 MS PGothic Greek{\*\falt Arial Unicode MS};} +{\f4146\fbidi \fswiss\fcharset162\fprq2 MS PGothic Tur{\*\falt Arial Unicode MS};}{\f4149\fbidi \fswiss\fcharset186\fprq2 MS PGothic Baltic{\*\falt Arial Unicode MS};}{\f4154\fbidi \fswiss\fcharset0\fprq2 @MS PGothic Western;} +{\f4152\fbidi \fswiss\fcharset238\fprq2 @MS PGothic CE;}{\f4153\fbidi \fswiss\fcharset204\fprq2 @MS PGothic Cyr;}{\f4155\fbidi \fswiss\fcharset161\fprq2 @MS PGothic Greek;}{\f4156\fbidi \fswiss\fcharset162\fprq2 @MS PGothic Tur;} +{\f4159\fbidi \fswiss\fcharset186\fprq2 @MS PGothic Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 +Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs107 \additive \rtlch\fcs1 +\ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 \sbasedon106 \slink105 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf1\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid2901891\rsid3755635\rsid4684770\rsid4857523\rsid5519702\rsid5858028\rsid5858090\rsid6644331\rsid7945554\rsid8194703\rsid9196108\rsid9376050\rsid9653293\rsid9721683\rsid9784979\rsid11021027\rsid11224144\rsid11758563\rsid11828113 +\rsid12672226\rsid12799225\rsid13067438\rsid14356214\rsid14375208\rsid14446677\rsid14639419\rsid15299411\rsid15481624\rsid15548830\rsid15602691\rsid16280961\rsid16670492\rsid16727404}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1 +\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo9\dy21\min27}{\revtim\yr2013\mo9\dy24\hr3\min37}{\version1}{\edmins0}{\nofpages3}{\nofwords651}{\nofchars3717}{\nofcharsws4360}{\vern49255}}{\*\xmlnstbl {\xmlns1 http +://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid11224144 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11224144 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11224144 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11224144 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid9653293\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid4857523 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4857523 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4857523 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4857523 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4857523 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4857523 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 \hich\af38\dbch\af370\loch\f38 +MICROSOFT VISUAL F#}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20197\'88\'c8\u19979\'89\'ba\u12289\'81\'41\u12300\'81\'75\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a +\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12301\'81\'76\u12392\'82\'c6\u12356\'82\'a2\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12392\'82\'c6}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 Microsoft Corporation (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u25152\'8f\'8a +\u22312\'8d\'dd\u22320\'92\'6e\u12395\'82\'c9\u24540\'89\'9e\u12376\'82\'b6\u12383\'82\'bd\u-27230\'8a\'d6\u-28637\'98\'41\u20250\'89\'ef\u31038\'8e\'d0\u12290\'81\'42\u20197\'88\'c8\u19979\'89\'ba\u12289\'81\'41\u12300\'81\'75\u12510\'83\'7d\u12452 +\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12301\'81\'76\u12392\'82\'c6\u12356\'82\'a2\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12392\'82\'c6\u12398\'82\'cc\u22865\'8c\'5f\u32004\'96\'f1\u12434\'82\'f0\u27083\'8d\'5c\u25104\'90\'ac\u12375\'82\'b5 +\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u20197\'88\'c8\u19979\'89\'ba\u12398\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u12362\'82\'a8\u-30035\'93\'c7\u12415 +\'82\'dd\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u19978\'8f\'e3 +\u-30184\'8b\'4c\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450 +\'83\'41\u12364\'82\'aa\u-30184\'8b\'4c\u-27854\'98\'5e\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12513\'83\'81\u12487\'83\'66\u12451\'83\'42\u12450\'83\'41}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20197\'88\'c8\u19979\'89\'ba\u32207\'91\'8d\u31216\'8f\'cc\u12375\'82\'b5\u12390\'82\'c4\u12300\'81\'75\u26412\'96\'7b +\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12301\'81\'76\u12392\'82\'c6\u12356\'82\'a2\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12395\'82\'c9\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43 +\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u26412\'96\'7b}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12395\'82\'c9\u-27230\'8a\'d6\u-28637\'98\'41\u12377\'82\'b7\u12427\'82\'e9\u19979\'89\'ba\u-30184\'8b\'4c\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67 +\u-30467\'90\'bb\u21697\'95\'69\u12395\'82\'c9\u12418\'82\'e0\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1033\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1033\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26356\'8d\'58\u26032 +\'90\'56\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1033\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1033\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28675\'92\'c7\u21152\'89\'c1\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12452\'83\'43\u12531\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12505\'83\'78\u12540\'81\'5b\u12473\'83\'58\u12398\'82\'cc\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1033\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1033\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12509\'83\'7c\loch\af38\hich\af38\dbch\f370 \u12540\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 +\uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u-30467\'90\'bb\u21697\'95\'69\u12395\'82\'c9\u21029\'95\'ca\u-28652\'93\'72\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465 +\'8f\'f0\u-26619\'8d\'80\u12364\'82\'aa\u20184\'95\'74\u23646\'91\'ae\u12375\'82\'b5\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12395\'82\'c9\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u24403\'93\'96\u-30094\'8a\'59\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0 +\u-26619\'8d\'80\u12364\'82\'aa\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455 +\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12395\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u26412 +\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6 +\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12521\'83\'89 +\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u26412 +\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20351\'8e\'67\u29992\'97\'70\u12375\'82\'b5\u12394\'82\'c8\u12356\'82\'a2\u12391\'82\'c5\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356 +\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362 +\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u-28555\'8f\'85\u23432\'8e\'e7\u12377\'82\'b7\u12427\'82\'e9 +\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u26465\'8f\'f0\u20214\'8c\'8f\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u12399\'82\'cd\u20197\'88\'c8\u19979\'89\'ba\u12398\'82\'cc +\u27704\'89\'69\u32154\'91\'b1\u30340\'93\'49\u12394\'82\'c8\u27177\'8c\'a0\u21033\'97\'98\u12364\'82\'aa\u-30159\'8b\'96\u-29954\'91\'f8\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 +\uc2\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67\u12540\'81\'5b\u12523\'83\'8b\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20351\'8e\'67\u29992\'97\'70\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u27177\'8c\'a0\u21033 +\'97\'98\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289 +\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u-30163\'90\'dd\u-30200\'8c\'76\u12289\'81\'41\u-27253\'8a\'4a\u30330\'94\'ad\u12289\'81\'41 +\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12486\'83\'65\u12473\'83\'58\u12488\'83\'67\u12434\'82\'f0\u-30644\'8d\'73\u12358\'82\'a4\u12383\'82\'bd\u12417\'82\'df\u12395\'82\'c9\u12289\'81\'41\u20219\'94\'43\u24847\'88\'d3\u12398\'82\'cc\u25968 +\'90\'94\u12398\'82\'cc\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\loch\af38\hich\af38\dbch\f370 \u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12434\'82\'f0\u12362\'82\'a8\u23458\'8b\'71 +\u27096\'97\'6c\u12398\'82\'cc\u12487\'83\'66\u12496\'83\'6f\u12452\'83\'43\u12473\'83\'58\u12395\'82\'c9\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67\u12540\'81\'5b\u12523\'83\'8b\u12375\'82\'b5\u12390\'82\'c4\u20351\'8e\'67\u29992\'97\'70 +\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 2.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28675\'92\'c7\u21152\'89\'c1\u12398\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473 +\'83\'58\u26465\'8f\'f0\u20214\'8c\'8f\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-28675\'92\'c7\u21152\'89\'c1\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20877 +\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\cs57\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395 +\'82\'c9\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u-27253\'8a\'4a\u30330\'94\'ad\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80 +\u12395\'82\'c9\u21547\'8a\'dc\u12417\'82\'df\u12390\'82\'c4\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12394\'82\'c8\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12364\'82\'aa\u21547\'8a\'dc\u12414\'82\'dc\u12428 +\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba\u12398\'82\'cc\u26465\'8f\'f0\u20214\'8c\'8f\u12395\'82\'c9\u24467\'8f\'5d\u12358 +\'82\'a4\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20351 +\'8e\'67\u29992\'97\'70\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\cs58\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20197\'88\'c8\u19979\'89\'ba\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12377\'82\'b7\u12427\'82\'e9\u12467\'83\'52 +\u12540\'81\'5b\u12489\'83\'68\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12486\'83\'65\u12461\'83\'4c\u12473\'83\'58\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\cs58\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\cs58\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12434\'82\'f0\u12300\'81\'75\u20877\'8d\'c4\u-26606\'94\'d0 +\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12301\'81\'76\u12392\'82\'c6\u23450\'92\'e8\u32681\'8b\'60\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 REDIST.TXT +}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 REDIST.TXT }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12373 +\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u12458\'83\'49\u12502\'83\'75\u12472\'83\'57\u12455\'83\'46\u12463\'83\'4e\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u-30457\'95\'a1\u-30467\'90\'bb\u12362\'82\'a8\u12424 +\'82\'e6\u12403\'82\'d1\loch\af38\hich\af38\dbch\f370 \u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u20877\'8d\'c4\u-26606\'94\'d0 +\u24067\'95\'7a}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\ulnone\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399 +\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u-26606\'94\'d0\u24067\'95\'7a\u-32763\'8e\'d2\u12395\'82\'c9\u23550\'91\'ce +\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u12392\'82\'c6\u12375 +\'82\'b5\u12390\'82\'c4\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-26606\'94\'d0 +\u24067\'95\'7a\u12434\'82\'f0\u-30159\'8b\'96\u21487\'89\'c2\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20877 +\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u12398\'82\'cc\u26465\'8f\'f0\u20214\'8c\'8f\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \cs58\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12377\'82\'b7\u12409 +\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12395\'82\'c9\u12388\'82\'c2\u12365\'82\'ab\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba +\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u24467\'8f\'5d\u12431\'82\'ed\u12394\'82\'c8\u12369\'82\'af\u12428\'82\'ea\u12400\'82\'ce\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362 +\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390\'82\'c4\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2 +\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12395\'82\'c9\u-28211\'8f\'64\u-30335\'97\'76\u12363\'82\'a9\u12388\'82\'c2\u20027\'8e\'e5\u-30335\'97\'76\u12394\'82\'c8\u27231\'8b\'40\u-32515\'94\'5c\u12434\'82\'f0\u-28675\'92\'c7\u21152 +\'89\'c1\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 .lib }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12392\'82\'c6\u12356\'82\'a2\u12358\'82\'a4\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u21517\'96\'bc\u25313\'8a\'67\u24373\'92\'a3\u23376\'8e\'71\u12364\'82\'aa\u20184\'95\'74\u12356\'82\'a2\u12383 +\'82\'bd\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u22580\'8f\'ea\u21512\'8d\'87\u12399\'82\'cd\u12289\'81\'41\u12522\'83\'8a\u12531\'83\'93\u12459\'83\'4a +\u12540\'81\'5b\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12381\'82\'bb\u12398\'82\'cc\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u23455 +\'8e\'c0\u-30644\'8d\'73\u12375\'82\'b5\u12383\'82\'bd\u32080\'8c\'8b\u26524\'89\'ca\u12384\'82\'be\u12369\'82\'af\loch\af38\hich\af38\dbch\f370 \u12434\'82\'f0\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d +\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12392\'82\'c6\u20849\'8b\'a4\u12395\'82\'c9\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12475\'83\'5a\u12483\'83\'62\u12488\'83\'67\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12395\'82\'c9\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12427\'82\'e9\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515 +\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u12289\'81\'41\u25913\'89\'fc\u22793\'95\'cf\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u12475\'83\'5a\u12483\'83\'62\u12488\'83\'67\u12450 +\'83\'41\u12483\'83\'62\u12503\'83\'76}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94 +\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12398\'82\'cc\u12415\'82\'dd\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512 +\'83\'80\u12398\'82\'cc\u-26606\'94\'d0\u24067\'95\'7a\u-32763\'8e\'d2\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u22806\'8a\'4f\u-28440\'95\'94\u12456\'83\'47\u12531\'83\'93\u12489\'83\'68}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12518\'83\'86\u12540\'81\'5b\u12470\'83\'55\u12540\'81\'5b\u12395\'82\'c9\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12392 +\'82\'c6\u21516\'93\'af\u31561\'93\'99\u20197\'88\'c8\u19978\'8f\'e3\u12395\'82\'c9\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u20445\'95\'db\u-29833\'8c\'ec +\u12377\'82\'b7\u12427\'82\'e9\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12373\'82\'b3\u12379\'82\'b9\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512 +\'83\'80\u12395\'82\'c9\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u21517\'96\'bc\u32681\'8b\'60\u12398\'82\'cc\u26377\'97\'4c\u21177\'8c\'f8\u12394\'82\'c8\u-31657\'92\'98\u20316\'8d\'ec\u27177\'8c\'a0\u-30616\'95\'5c\u31034\'8e\'a6\u12434\'82\'f0 +\u-30644\'8d\'73\u12358\'82\'a4\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512 +\'83\'80\u12398\'82\'cc\u-26606\'94\'d0\u24067\'95\'7a\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20351\'8e\'67\u29992\'97\'70\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u-30005\'90\'bf\u27714\'8b\'81}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u24321\'95\'d9\u-29833\'8c\'ec\u22763\'8e\'6d\u22577\'95\'f1\u-28308\'8f\'56\u12434\'82\'f0\u21547\'8a\'dc\u12415\'82\'dd\u12414\'82\'dc\u12377\'82\'b7}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12395\'82\'c9\u12388\'82\'c2\u12356\'82\'a2\u12390\'82\'c4\u12289\'81\'41\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12434\'82\'f0\u20813\'96\'c6\u-29524 +\'90\'d3\u12289\'81\'41\u-27086\'96\'68\u24481\'8c\'e4\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-30500\'95\'e2\u20767\'8f\'9e\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\loch\af38\hich\af38\dbch\f370 \u12290\'81\'42}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20877 +\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \cs58\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba\u12434\'82\'f0\u-30644\'8d\'73\u12358\'82\'a4\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365 +\'82\'ab\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20877 +\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u-31657\'92\'98\u20316\'8d\'ec\u27177\'8c\'a0\u12289\'81\'41\u21830\'8f\'a4\u27161\'95\'57\u12414\'82\'dc\u12383\'82\'bd +\u12399\'82\'cd\u29305\'93\'c1\u-30159\'8b\'96\u12398\'82\'cc\u-30616\'95\'5c\u31034\'8e\'a6\u12434\'82\'f0\u25913\'89\'fc\u22793\'95\'cf\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512 +\'83\'80\u12398\'82\'cc\u21517\'96\'bc\u31216\'8f\'cc\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u12395\'82\'c9\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12398\'82\'cc\u21830\'8f\'a4 +\u27161\'95\'57\u12434\'82\'f0\u20351\'8e\'67\u29992\'97\'70\u12375\'82\'b5\u12383\'82\'bd\u12426\'82\'e8\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u-30467\'90\'bb\u21697\'95\'69\u12364\'82\'aa\u12510\'83\'7d\u12452 +\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12363\'82\'a9\u12425\'82\'e7\u30001\'97\'52\u26469\'97\'88\u12375\'82\'b5\u12383\'82\'bd\u12426\'82\'e8\u12289\'81\'41\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525 +\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12364\'82\'aa\u25512\'90\'84\u22888\'8f\'a7\u12377\'82\'b7\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u12395\'82\'c9\u-30325\'8c\'a9\u12379\'82\'b9\u12363\'82\'a9\u12369\'82\'af\u12427\'82\'e9 +\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\expnd0\expndtw-2\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid6644331 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 +\af38 \ltrch\fcs0 \fs20\expnd0\expndtw-2\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid6644331 \hich\af38\dbch\af370\loch\f38 Windows }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\expnd0\expndtw-2\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid6644331 \loch\af38\hich\af38\dbch\f370 \uc2\u12503\'83\'76\u12521\'83\'89\u12483\'83\'62\u12488\'83\'67\u12501\'83\'74\u12457\'83\'48\u12540\'81\'5b +\u12512\'83\'80\u20197\'88\'c8\u22806\'8a\'4f\u12398\'82\'cc\u12503\'83\'76\u12521\'83\'89\u12483\'83\'62\u12488\'83\'67\u12501\'83\'74\u12457\'83\'48\u12540\'81\'5b\u12512\'83\'80\u12391\'82\'c5\u23455\'8e\'c0\u-30644\'8d\'73\u12377\'82\'b7\u12427 +\'82\'e9\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390\'82\'c4\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b +\u12489\'83\'68\u12434\'82\'f0\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\expnd0\expndtw-2\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid6644331 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u24746\'88\'ab\u24847\'88\'d3\u12398\'82\'cc\u12354\'82\'a0\u12427\'82\'e9\u12289\'81\'41\u27450\'8b\'5c\u30622\'e1\'d4\u30340 +\'93\'49\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-28587\'88\'e1\u27861\'96\'40\u12394\'82\'c8\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12395\'82\'c9\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a +\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u21547\'8a\'dc\u12417\'82\'df\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf1\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\loch\af38\hich\af38\dbch\f370 \u12467 +\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u12395\'82\'c9\u-27036\'8f\'9c\u22806\'8a\'4f\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12364\'82\'aa\u-28567\'93\'4b\u29992\'97\'70 +\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12392\'82\'c6\u12394\'82\'c8\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u12394\'82\'c8\u26041\'95\'fb\u27861\'96\'40\u12391\'82\'c5\u20877\'8d\'c4\u-26606\'94\'d0\u24067 +\'95\'7a\u21487\'89\'c2\u-32515\'94\'5c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u25913\'89\'fc\u22793\'95\'cf\u12414\'82\'dc\u12383\'82\'bd\u12399 +\'82\'cd\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12300\'81\'75\u-27036\'8f\'9c\u22806\'8a\'4f\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12301\'81\'76\u12392\'82\'c6\u12399\'82\'cd\u12289\'81\'41\u20351\'8e\'67\u29992\'97\'70\u12289 +\'81\'41\u25913\'89\'fc\u22793\'95\'cf\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-26606\'94\'d0\u24067\'95\'7a\u12398\'82\'cc\u26465\'8f\'f0\u20214\'8c\'8f\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u20197\'88\'c8\u19979\'89\'ba\u12434\'82\'f0 +\u28288\'96\'9e\u12383\'82\'bd\u12377\'82\'b7\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u-30335\'97\'76\u27714\'8b\'81\u12377\'82\'b7\u12427\'82\'e9\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12391\'82\'c5\u12377 +\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12467 +\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 +}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u24418\'8c\'60\u24335\'8e\'ae\u12391\'82\'c5 +\u20844\'8c\'f6\u-30616\'95\'5c\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u-32763\'8e\'d2\u12364\'82\'aa\u12467\'83\'52\u12540\'81\'5b +\u12489\'83\'68\u25913\'89\'fc\u22793\'95\'cf\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u26377\'97\'4c\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \hich\af38\dbch\af370\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u31532 +\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-28646\'92\'ca\u30693\'92\'6d}{\rtlch\fcs1 \ab0\af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid14639419 \loch\af38\hich\af38\dbch\f370 \uc2\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9 +\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12427\'82\'e9\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12398\'82\'cc\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12399\'82\'cd\u12289 +\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u22522\'8a\'ee\u12389\'82\'c3\u12365\'82\'ab\u12289\'81\'41\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525 +\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12364\'82\'aa\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u20351\'8e\'67\u29992\'97\'70\u12434\'82\'f0\u-30159\'8b\'96\u-29954\'91\'f8\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0 +\u12398\'82\'cc\u12391\'82\'c5\u12354\'82\'a0\u12426\'82\'e8\u12289\'81\'41\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\loch\af38\hich\af38\dbch\f370 \u12398 +\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u22522\'8a\'ee\u12389\'82\'c3\u12367\'82\'ad\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce +\u12377\'82\'b7\u12427\'82\'e9\u20351\'8e\'67\u29992\'97\'70\u12398\'82\'cc\u-30159\'8b\'96\u-29954\'91\'f8\u12391\'82\'c5\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u31532\'91\'e6\u19977 +\'8e\'4f\u-32763\'8e\'d2\u12398\'82\'cc\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u27880\'92\'8d\u24847\'88\'d3\u20107\'8e\'96\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u23384\'91\'b6\u22312\'8d\'dd\u12377\'82\'b7\u12427\'82\'e9 +\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12390\'82\'c4\u12362\'82\'a8\u12426\'82\'e8 +\u12289\'81\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ThirdPartyNotices.txt }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12391\'82\'c5\u12418\'82\'e0\u21442\'8e\'51\u29031\'8f\'c6 +\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid11758563\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12398\'82\'cc\u-28567\'93\'4b\u29992\'97\'70 +\u31684\'94\'cd\u22258\'88\'cd\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74 +\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd\u20351\'8e\'67\u29992\'97\'70\u-30159\'8b\'96\u-29954\'91\'f8\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12354\'82\'a0\u12426 +\'82\'e8\u12289\'81\'41\u-29527\'94\'cc\u22770\'94\'84\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42 +\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u26412\'96\'7b\u12477\'83\'5c\u12501 +\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u-27056\'8c\'c0\u23450\'92\'e8\u30340\'93\'49\u12394\'82\'c8\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0 +\u20184\'95\'74\u19982\'97\'5e\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12399\'82\'cd\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc +\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u30041\'97\'af\u20445\'95\'db\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428 +\'82\'ea\u12427\'82\'e9\u27861\'96\'40\u20196\'97\'df\u12395\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u19978\'8f\'e3\u-30184\'8b\'4c\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12434\'82\'f0\u-29307\'92\'b4\u12360\'82\'a6\u12427\'82\'e9\u27177\'8c\'a0 +\u21033\'97\'98\u12364\'82\'aa\u19982\'97\'5e\u12360\'82\'a6\u12425\'82\'e7\u12428\'82\'ea\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12434\'82\'f0\u-27036\'8f\'9c\u12365\'82\'ab\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399 +\'82\'cd\u26412\'96\'7b\u12521\'83\'89\loch\af38\hich\af38\dbch\f370 \u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12391\'82\'c5\u26126\'96\'be\u31034\'8e\'a6\u30340\'93\'49\u12395\'82\'c9\u-30159\'8b\'96 +\u21487\'89\'c2\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u26041\'95\'fb\u27861\'96\'40\u12391\'82\'c5\u12398\'82\'cc\u12415\'82\'dd\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0 +\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41 +\u20351\'8e\'67\u29992\'97\'70\u26041\'95\'fb\u27861\'96\'40\u12434\'82\'f0\u21046\'90\'a7\u-27056\'8c\'c0\u12377\'82\'b7\u12427\'82\'e9\u12383\'82\'bd\u12417\'82\'df\u12395\'82\'c9\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454 +\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u32068\'91\'67\u12415\'82\'dd\u-28740\'8d\'9e\u12414\'82\'dc\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u25216\'8b\'5a\u-30637\'8f\'70\u30340\'93\'49\u21046\'90\'a7\u-27056\'8c\'c0 +\u12395\'82\'c9\u24467\'8f\'5d\u12431\'82\'ed\u12394\'82\'c8\u12369\'82\'af\u12428\'82\'ea\u12400\'82\'ce\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba\u12434\'82\'f0\u-30644\'8d\'73 +\u12358\'82\'a4\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412 +\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u25216\'8b\'5a\u-30637\'8f\'70\u30340\'93\'49\u12394\'82\'c8\u21046\'90\'a7\u-27056\'8c\'c0\u12434\'82\'f0\u22238\'89\'f1\u-28545\'94\'f0 +\u12375\'82\'b5\u12390\'82\'c4\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u12522 +\'83\'8a\u12496\'83\'6f\u12540\'81\'5b\u12473\'83\'58}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12456\'83\'47\u12531\'83\'93\u12472\'83\'57\u12491\'83\'6a\u12450\'83\'41\u12522\'83\'8a\u12531\'83\'93\u12464\'83\'4f\u12289 +\'81\'41\u-28666\'8b\'74\u12467\'83\'52\u12531\'83\'93\u12497\'83\'70\u12452\'83\'43\u12523\'83\'8b\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-28666\'8b\'74\u12450\'83\'41\u12475\'83\'5a\u12531\'83\'93\u12502\'83\'75\u12523\'83\'8b +\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42\u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u27861\'96\'40\u20196\'97\'df\u12395 +\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u26126\'96\'be\u31034\'8e\'a6\u30340\'93\'49\u12395\'82\'c9\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12434\'82\'f0 +\u-27036\'8f\'9c\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80 +\u12391\'82\'c5\u-30321\'8b\'4b\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u25968\'90\'94\u20197\'88\'c8\u19978\'8f\'e3\u12398\'82\'cc\u25968\'90\'94\u12398\'82\'cc\u26412\'96\'7b\u12477\'83\'5c\u12501 +\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12434\'82\'f0\u20316\'8d\'ec\loch\af38\hich\af38\dbch\f370 \u25104\'90\'ac\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6 +\u12290\'81\'42\u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u27861\'96\'40\u20196\'97\'df\u12395\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u-30067\'94\'46\u12417 +\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12434\'82\'f0\u-27036\'8f\'9c\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12364\'82\'aa\u-30457\'95\'a1\u-30467\'90\'bb\u12391\'82\'c5\u12365\'82\'ab +\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u12395\'82\'c9\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20844\'8c\'f6\u-27253\'8a\'4a\u12377\'82\'b7\u12427\'82\'e9\u12371 +\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u12524 +\'83\'8c\u12531\'83\'93\u12479\'83\'5e\u12523\'83\'8b\u12289\'81\'41\u12522\'83\'8a\u12540\'81\'5b\u12473\'83\'58\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-29512\'91\'dd\u19982\'97\'5e\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1 +\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12414\'82\'dc\u12383 +\'82\'bd\u12399\'82\'cd\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12395\'82\'c9\u-29838\'8f\'f7\u28193\'93\'6e +\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9784979\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u21830\'8f\'a4\u29992\'97\'70\u12477 +\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 +\af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12507\'83\'7a\u12473\'83\'58\u12486\'83\'65\u12451\'83\'42\u12531\'83\'93\u12464\'83\'4f}{\rtlch\fcs1 +\af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12391\'82\'c5\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427 +\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12496 +\'83\'6f\u12483\'83\'62\u12463\'83\'4e\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76\u29992\'97\'70\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74 +\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u12496\'83\'6f\u12483\'83\'62\u12463\'83\'4e\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76\u29992\'97\'70\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12434\'82\'f0}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 1 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28440\'95\'94\u20316\'8d\'ec\u25104\'90\'ac\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa +\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12496\'83\'6f\u12483\'83\'62\u12463\'83\'4e\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76\u29992\'97\'70\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u12399\'82\'cd\u12289 +\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20877\'8d\'c4\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488 +\'83\'67\u12540\'81\'5b\u12523\'83\'8b\u12377\'82\'b7\u12427\'82\'e9\u22580\'8f\'ea\loch\af38\hich\af38\dbch\f370 \u21512\'8d\'87\u12395\'82\'c9\u-27056\'8c\'c0\u12426\'82\'e8\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1 +\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 6.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12489\'83\'68\u12461\'83\'4c\u12517\'83\'85\u12513\'83\'81\u12531\'83\'93\u12486\'83\'65\u12540\'81\'5b\u12471 +\'83\'56\u12519\'83\'87\u12531\'83\'93\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096 +\'97\'6c\u12398\'82\'cc\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540\'81\'5b\u12479\'83\'5e\u12540\'81\'5b\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20869\'93\'e0\u-28440\'95\'94\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67 +\u12527\'83\'8f\u12540\'81\'5b\u12463\'83\'4e\u12395\'82\'c9\u26377\'97\'4c\u21177\'8c\'f8\u12394\'82\'c8\u12450\'83\'41\u12463\'83\'4e\u12475\'83\'5a\u12473\'83\'58\u27177\'8c\'a0\u12434\'82\'f0\u26377\'97\'4c\u12377\'82\'b7\u12427\'82\'e9\u-32763 +\'8e\'d2\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u20869\'93\'e0\u-28440\'95\'94\u20351\'8e\'67\u29992\'97\'70\u30446\'96\'da\u30340\'93\'49\u12395\'82\'c9\u-27056\'8c\'c0\u12426\'82\'e8\u12289\'81\'41 +\u12489\'83\'68\u12461\'83\'4c\u12517\'83\'85\u12513\'83\'81\u12531\'83\'93\u12488\'83\'67\u12434\'82\'f0\u-30457\'95\'a1\u-30467\'90\'bb\u12375\'82\'b5\u12390\'82\'c4\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392 +\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 7.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u20182\'91\'bc\u12398\'82\'cc\u12487\'83\'66\u12496\'83\'6f\u12452\'83\'43\u12473\'83\'58\u12408\'82\'d6\u12398 +\'82\'cc\u31227\'88\'da\u31649\'8a\'c7\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096 +\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u12450\'83\'41\u12531\'83\'93\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67\u12540 +\'81\'5b\u12523\'83\'8b\u12375\'82\'b5\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u20182\'91\'bc\u12398\'82\'cc\u12487\'83\'66\u12496\'83\'6f\u12452\'83\'43\u12473 +\'83\'58\u12395\'82\'c9\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67\u12540\'81\'5b\u12523\'83\'8b\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290 +\'81\'42\u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u12371\'82\'b1\u12398\'82\'cc\u-30644\'8d\'73\u28858\'88\'d7\u12434\'82\'f0\u-30457\'95\'a1\u25968\'90\'94\u12398\'82\'cc\u12487\'83\'66\u12496\'83\'6f\u12452\'83\'43\u12473\'83\'58 +\u-27245\'8a\'d4\u12391\'82\'c5\u-30159\'8b\'96\u-29954\'91\'f8\u12467\'83\'52\u12531\'83\'93\u12486\'83\'65\u12531\'83\'93\u12484\'83\'63\u12398\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12434\'82\'f0\u20849 +\'8b\'a4\u26377\'97\'4c\u12377\'82\'b7\u12427\'82\'e9\u30446\'96\'da\u30340\'93\'49\u12391\'82\'c5\u-30644\'8d\'73\u12358\'82\'a4\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1 +\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 8.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28872\'97\'41\u20986\'8f\'6f\u-30321\'8b\'4b\u21046\'90\'a7\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd +\u31859\'95\'c4\u22269\'8d\'91\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u26085\'93\'fa\u26412\'96\'7b\u22269\'8d\'91\u12398\'82\'cc\u-28872\'97\'41\u20986\'8f\'6f\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\loch\af38\hich\af38\dbch\f370 \u12427 +\'82\'e9\u-30321\'8b\'4b\u21046\'90\'a7\u12398\'82\'cc\u23550\'91\'ce\u-29599\'8f\'db\u12392\'82\'c6\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41 +\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12398 +\'82\'cc\u22269\'8d\'91\u20869\'93\'e0\u27861\'96\'40\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u22269\'8d\'91\u-26981\'8d\'db\u27861\'96\'40}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28872\'97\'41\u20986\'8f\'6f\u23550\'91\'ce\u-29599\'8f\'db\u22269\'8d\'91\u12289\'81\'41\u12456\'83\'47\u12531\'83\'93 +\u12489\'83\'68}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12518\'83\'86\u12540\'81\'5b\u12470\'83\'55\u12540\'81\'5b\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12456\'83\'47 +\u12531\'83\'93\u12489\'83\'68}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12518\'83\'86\u12540\'81\'5b\u12470\'83\'55\u12540\'81\'5b\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u20351\'8e\'67 +\u29992\'97\'70\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u21046\'90\'a7\u-27056\'8c\'c0\u12434\'82\'f0\u21547\'8a\'dc\u12415\'82\'dd\u12414\'82\'dc\u12377\'82\'b7}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12434\'82\'f0\u-28555\'8f\'85\u23432\'8e\'e7\u12375\'82\'b5\u12394\'82\'c8\u12369\'82\'af\u12428\'82\'ea\u12400\'82\'ce +\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \loch\af38\hich\af38\dbch\f370 +\uc2\u-30093\'8f\'da\u32048\'8d\'d7\u12395\'82\'c9\u12388\'82\'c2\u12356\'82\'a2\u12390\'82\'c4\u12399\'82\'cd}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 +\hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \cs73\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \hich\af38\dbch\af370\loch\f38 www.microsoft.com/japan/exporting}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid9376050\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12434\'82\'f0\u12372\'82\'b2\u21442\'8e\'51\u29031\'8f\'c6\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2 +\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd +\u29694\'8c\'bb\u29366\'8f\'f3\u26377\'97\'4c\u23039\'8e\'70\u12391\'82\'c5\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12381\'82\'bb\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u12289\'81\'41 +\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12399\'82\'cd\u12469\'83\'54\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12434\'82\'f0\u25552\'92\'f1\u20379\'8b\'9f\u12375\'82\'b5 +\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12364\'82\'aa\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 10.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u23436\'8a\'ae\u20840\'91\'53\u21512\'8d\'87\u24847\'88\'d3\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80 +\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u-28675\'92\'c7\u21152\'89\'c1\u12477\'83\'5c\u12501\'83\'74 +\loch\af38\hich\af38\dbch\f370 \u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12289\'81\'41\u26356\'8d\'58\u26032\'90\'56\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12289\'81\'41\u12452\'83\'43\u12531 +\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12505\'83\'78\u12540\'81\'5b\u12473\'83\'58\u12398\'82\'cc\u12469\'83\'54\u12540\'81\'5b +\u12499\'83\'72\u12473\'83\'58\u12289\'81\'41\u12394\'82\'c8\u12425\'82\'e7\u12403\'82\'d1\u12395\'82\'c9\u12469\'83\'54\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9 +\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12469\'83\'54\u12509\'83\'7c\u12540 +\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12395\'82\'c9\u12388\'82\'c2\u12356\'82\'a2\u12390\'82\'c4 +\u12398\'82\'cc\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12392\'82\'c6\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12392\'82\'c6\u12398\'82\'cc\u-27245\'8a\'d4\u12398\'82\'cc\u23436 +\'8a\'ae\u20840\'91\'53\u12394\'82\'c8\u12427\'82\'e9\u21512\'8d\'87\u24847\'88\'d3\u12391\'82\'c5\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1033\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1033\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1033\dbch\af370\langnp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u28310\'8f\'80\u25312\'8b\'92\u27861\'96\'40\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af370\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1033\langfe1041\loch\af38\hich\af38\dbch\af370\langfenp1041\insrsid5858090\charrsid9721683 \hich\af38\dbch\af370\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid5858090\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26085 +\'93\'fa\u26412\'96\'7b\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid5858090\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa +\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u26085\'93\'fa\u26412\'96\'7b\u22269\'8d\'91\u20869\'93\'e0\u12391\'82\'c5\u20837\'93\'fc\u25163\'8e\'e8\u12373\'82\'b3\u12428\'82\'ea +\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u26085\'93\'fa\u26412\'96\'7b\u27861\'96\'40\u12395 +\'82\'c9\u28310\'8f\'80\u25312\'8b\'92\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid5858090\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 b.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u31859\'95\'c4\u22269\'8d\'91\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67 +\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u31859\'95\'c4\u22269\'8d\'91\u20869\'93\'e0\u12391\'82\'c5\u20837\'93\'fc\u25163\'8e\'e8\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u25269\'92\'ef +\u-30234\'90\'47\u27861\'96\'40\u12395\'82\'c9\u-27230\'8a\'d6\u12431\'82\'ed\u12425\'82\'e7\u12378\'82\'b8\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12398 +\'82\'cc\u-30237\'89\'f0\u-28216\'8e\'df\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u22865\'8c\'5f\u32004\'96\'f1\u-28587\'88\'e1\u21453\'94\'bd\u12408\'82\'d6\u12398\'82\'cc\u20027\'8e\'e5\u24373\'92\'a3\u12399\'82\'cd\u12289\'81\'41\u31859\'95\'c4 +\u22269\'8d\'91\u12527\'83\'8f\u12471\'83\'56\u12531\'83\'93\u12488\'83\'67\u12531\'83\'93\u24030\'8f\'42\u27861\'96\'40\u12395\'82\'c9\u28310\'8f\'80\u25312\'8b\'92\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5 +\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u28040\'8f\'c1\u-29509\'94\'ef\u-32763\'8e\'d2\u20445\'95\'db\u-29833\'8c\'ec\u27861\'96\'40\u12289\'81\'41\loch\af38\hich\af38\dbch\f370 \u20844\'8c\'f6\u27491\'90\'b3\u21462\'8e\'e6\u24341\'88\'f8\u27861 +\'96\'40\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-28587\'88\'e1\u27861\'96\'40\u-30644\'8d\'73\u28858\'88\'d7\u12434\'82\'f0\u21547\'8a\'dc\u12415\'82\'dd\u12414\'82\'dc\u12377\'82\'b7\u12364\'82\'aa\u12371\'82\'b1\u12428\'82\'ea +\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u20182\'91\'bc\u12398\'82\'cc\u20027\'8e\'e5\u24373\'92\'a3\u12395\'82\'c9\u12388\'82\'c2\u12356\'82\'a2\u12390\'82\'c4\u12399\'82\'cd\u12289 +\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u25152\'8f\'8a\u22312\'8d\'dd\u12377\'82\'b7\u12427\'82\'e9\u22320\'92\'6e\u22495\'88\'e6\u12398\'82\'cc\u27861\'96\'40\u24459\'97\'a5\u12395\'82\'c9\u28310\'8f\'80\u25312\'8b\'92\u12375 +\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 c.\tab}}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26085\'93\'fa\u26412\'96\'7b\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u31859\'95\'c4\u22269\'8d\'91\u20197 +\'88\'c8\u22806\'8a\'4f\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364 +\'82\'aa\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u26085\'93\'fa\u26412\'96\'7b\u22269\'8d\'91\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u31859\'95\'c4\u22269\'8d\'91\u20197 +\'88\'c8\u22806\'8a\'4f\u12398\'82\'cc\u22269\'8d\'91\u12391\'82\'c5\u20837\'93\'fc\u25163\'8e\'e8\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531 +\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u22320\'92\'6e\u22495\'88\'e6\u27861\'96\'40\u12395\'82\'c9\u28310\'8f\'80\u25312\'8b\'92\u12377\'82\'b7 +\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u27861 +\'96\'40\u30340\'93\'49\u21177\'8c\'f8\u21147\'97\'cd\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \b0\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412\'96\'7b\u12521 +\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u29305\'93\'c1\u23450\'92\'e8\u12398\'82\'cc\u27861\'96\'40\u30340\'93\'49\u12394\'82\'c8\u27177\'8c\'a0\u21033\'97\'98 +\u12434\'82\'f0\u-30321\'8b\'4b\u23450\'92\'e8\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u22320\'92\'6e\u22495\'88\'e6\u12420\'82\'e2\u22269\'8d\'91\u12395 +\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12398\'82\'cc\u23450\'92\'e8\u12417\'82\'df +\u12395\'82\'c9\u12363\'82\'a9\u12363\'82\'a9\u12431\'82\'ed\u12425\'82\'e7\u12378\'82\'b8\u12289\'81\'41\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12392\'82\'c6\u30064 +\'88\'d9\u12394\'82\'c8\u12427\'82\'e9\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u26377\'97\'4c\u12377\'82\'b7\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12364\'82\'aa\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12414 +\'82\'dc\u12383\'82\'bd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u21462\'8e\'e6\u24471\'93\'be\u21462 +\'8e\'e6\u24341\'88\'f8\u12398\'82\'cc\u30456\'91\'8a\u25163\'8e\'e8\u26041\'95\'fb\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12390\'82\'c4\u27177\'8c\'a0\loch\af38\hich\af38\dbch\f370 \u21033\'97\'98\u12434\'82\'f0\u21462\'8e\'e6\u24471\'93\'be +\u12391\'82\'c5\u12365\'82\'ab\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12418\'82\'e0\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u26412\'96\'7b\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58 +\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u22320\'92\'6e\u22495\'88\'e6\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u22269\'8d\'91\u12398\'82\'cc\u27861\'96\'40\u24459 +\'97\'a5\u12395\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u27177\'8c\'a0\u21033\'97\'98\u12398\'82\'cc\u25313\'8a\'67\u22823\'91\'e5\u12364\'82\'aa\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u-27056\'8c\'c0 +\u12426\'82\'e8\u12289\'81\'41\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u22793\'95\'cf\u26356\'8d\'58\u12375\'82\'b5\u12394\'82\'c8\u12356\'82\'a2\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6 +\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \hich\af38\dbch\af370\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12354\'82\'a0\u12425\'82\'e7\u12422\'82\'e4\u12427\'82\'e9\u20445\'95\'db\u-30148\'8f\'d8\u12398\'82\'cc\u20813\'96\'c6 +\u-29524\'90\'d3\u12290\'81\'42\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd\u12289\'81\'41\u29694\'8c\'bb\u29366\'8f\'f3\u26377\'97\'4c\u23039\'8e\'70\u12398\'82\'cc\u12414 +\'82\'dc\u12414\'82\'dc\u29781\'e0\'ea\u30133\'e1\'72\u12434\'82\'f0\u21839\'96\'e2\u12431\'82\'ed\u12394\'82\'c8\u12356\'82\'a2\u26465\'8f\'f0\u20214\'8c\'8f\u12391\'82\'c5\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377 +\'82\'b7\u12290\'81\'42\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u12395\'82\'c9\u20276\'94\'ba\u12358\'82\'a4\u21361\'8a\'eb\u-27014\'8c\'af +\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u-29536\'95\'89\u25285\'92\'53\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525 +\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12399\'82\'cd\u12289\'81\'41\u26126\'96\'be\u31034\'8e\'a6\u30340\'93\'49\u12394\'82\'c8\u29781\'e0\'ea\u30133\'e1\'72\u25285\'92\'53\u20445\'95\'db\u-29524\'90\'d3\u20219\'94\'43\u12414\'82\'dc +\u12383\'82\'bd\u12399\'82\'cd\u20445\'95\'db\u-30148\'8f\'d8\u-29524\'90\'d3\u20219\'94\'43\u12434\'82\'f0\u19968\'88\'ea\u20999\'90\'d8\u-29536\'95\'89\u12356\'82\'a2\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u26412\'96\'7b\u12521 +\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12391\'82\'c5\u12399\'82\'cd\u22793\'95\'cf\u26356\'8d\'58\u12391\'82\'c5\u12365\'82\'ab\u12394\'82\'c8\u12356\'82\'a2\u12362\'82\'a8\u23458\'8b\'71 +\u27096\'97\'6c\u12398\'82\'cc\u22320\'92\'6e\u22495\'88\'e6\u12398\'82\'cc\u27861\'96\'40\u24459\'97\'a5\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u-28675\'92\'c7\u21152\'89\'c1\u12398\'82\'cc\u28040\'8f\'c1\u-29509\'94\'ef\u-32763\'8e\'d2\u12398 +\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u27861\'96\'40\u23450\'92\'e8\u20445\'95\'db\u-30148\'8f\'d8\u12364\'82\'aa\u23384\'91\'b6\u22312\'8d\'dd\u12377\'82\'b7\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87 +\u12364\'82\'aa\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 +\uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u22320\'92\'6e\u22495\'88\'e6\u12398\'82\'cc\u22269\'8d\'91\u20869\'93\'e0\u27861\'96\'40\u31561\'93\'99\u12395\'82\'c9\u12424\'82\'e6\loch\af38\hich\af38\dbch\f370 \u12387\'82\'c1\u12390 +\'82\'c4\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12427\'82\'e9\u-27056\'8c\'c0\u12426\'82\'e8\u12289\'81\'41\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12399\'82\'cd +\u12289\'81\'41\u21830\'8f\'a4\u21697\'95\'69\u24615\'90\'ab\u12289\'81\'41\u29305\'93\'c1\u23450\'92\'e8\u30446\'96\'da\u30340\'93\'49\u12395\'82\'c9\u23550\'91\'ce\u12377\'82\'b7\u12427\'82\'e9\u-28567\'93\'4b\u21512\'8d\'87\u24615\'90\'ab\u12289 +\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20405\'90\'4e\u23475\'8a\'51\u12398\'82\'cc\u19981\'95\'73\u23384\'91\'b6\u22312\'8d\'dd\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u29781\'e0\'ea\u30133\'e1\'72\u25285\'92\'53 +\u20445\'95\'db\u-29524\'90\'d3\u20219\'94\'43\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-24871\'96\'d9\u31034\'8e\'a6\u12398\'82\'cc\u20445\'95\'db\u-30148\'8f\'d8\u-29524\'90\'d3\u20219\'94\'43\u12434\'82\'f0\u-29536\'95\'89\u12356\'82\'a2\u12414 +\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12458 +\'83\'49\u12540\'81\'5b\u12473\'83\'58\u12488\'83\'67\u12521\'83\'89\u12522\'83\'8a\u12450\'83\'41\u-27056\'8c\'c0\u23450\'92\'e8\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u12458\'83\'49\u12540\'81\'5b +\u12473\'83\'58\u12488\'83\'67\u12521\'83\'89\u12522\'83\'8a\u12450\'83\'41\u28040\'8f\'c1\u-29509\'94\'ef\u-32763\'8e\'d2\u27861\'96\'40\u12395\'82\'c9\u22522\'8a\'ee\u12389\'82\'c3\u12367\'82\'ad\u27861\'96\'40\u23450\'92\'e8\u20445\'95\'db\u-30148 +\'8f\'d8\u12434\'82\'f0\u26377\'97\'4c\u12375\'82\'b5\u12289\'81\'41\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc +\u27177\'8c\'a0\u21033\'97\'98\u12395\'82\'c9\u24433\'89\'65\u-26625\'8b\'bf\u12434\'82\'f0\u19982\'97\'5e\u12360\'82\'a6\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u24847\'88\'d3\u22259\'90\'7d\u12377\'82\'b7\u12427\'82\'e9\u12418 +\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\loch\af38\hich\af38\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u25937 +\'8b\'7e\u28168\'8d\'cf\u25163\'8e\'e8\u27573\'92\'69\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-29524\'90\'d3\u20219\'94\'43\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-27036\'8f\'9c\u22806\'8a\'4f +\u12290\'81\'42\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12381\'82\'bb\u12398\'82\'cc\u12469\'83\'54\u12503\'83\'76\u12521\'83\'89\u12452\'83\'43 +\u12516\'83\'84\u12540\'81\'5b\u12398\'82\'cc\u-29524\'90\'d3\u20219\'94\'43\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\hich\af38\dbch\af370\loch\f38 5.00 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u31859\'95\'c4\u12489\'83\'68\u12523\'83\'8b\u12434 +\'82\'f0\u19978\'8f\'e3\u-27056\'8c\'c0\u12392\'82\'c6\u12377\'82\'b7\u12427\'82\'e9\u30452\'92\'bc\u25509\'90\'da\u25613\'91\'b9\u23475\'8a\'51\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7 +\u12290\'81\'42\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u25613\'91\'b9\u23475\'8a\'51}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u27966\'94\'68\u29983\'90\'b6\u30340\'93\'49\u25613\'91\'b9 +\u23475\'8a\'51\u12289\'81\'41\u-28616\'88\'ed\u22833\'8e\'b8\u21033\'97\'98\u30410\'89\'76\u12289\'81\'41\u29305\'93\'c1\u21029\'95\'ca\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u-27245\'8a\'d4\u25509\'90\'da\u25613\'91\'b9\u23475\'8a\'51\u12289 +\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20184\'95\'74\u-26993\'90\'8f\u30340\'93\'49\u25613\'91\'b9\loch\af38\hich\af38\dbch\f370 \u23475\'8a\'51\u12434\'82\'f0\u21547\'8a\'dc\u12415\'82\'dd\u12414\'82\'dc\u12377\'82\'b7\u12364\'82\'aa +\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 ) }{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 +\loch\af38\hich\af38\dbch\f370 \uc2\u12395\'82\'c9\u-27230\'8a\'d6\u12375\'82\'b5\u12390\'82\'c4\u12399\'82\'cd\u12289\'81\'41\u19968\'88\'ea\u20999\'90\'d8\u-29524\'90\'d3\u20219\'94\'43\u12434\'82\'f0\u-29536\'95\'89\u12356\'82\'a2\u12414\'82\'dc\u12379 +\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12371 +\'82\'b1\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12399\'82\'cd\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba\u12395\'82\'c9\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6 +\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u26412 +\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12289\'81\'41\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12289\'81\'41\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12398\'82\'cc +\u12452\'83\'43\u12531\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67\u12398\'82\'cc\u12469\'83\'54\u12452\'83\'43\u12488\'83\'67\u19978\'8f\'e3\u12398\'82\'cc\u12467\'83\'52\u12531\'83\'93\u12486\'83\'65\u12531\'83\'93 +\u12484\'83\'63}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u21547\'8a\'dc\u12415\'82\'dd\u12414\'82\'dc\u12377\'82\'b7}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 )}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12398\'82\'cc +\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12395\'82\'c9\u-27230\'8a\'d6\u-28637\'98\'41\u12375\'82\'b5\u12383\'82\'bd\u20107\'8e\'96\u-26619\'8d\'80}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs20\lang1041\langfe1041\loch\af3\hich\af3\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af3\dbch\af370\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u22865\'8c\'5f\u32004\'96\'f1\u-28587\'88\'e1\u21453\'94\'bd\u12289\'81\'41\u20445\'95\'db\u-30148\'8f\'d8\u-28587\'88\'e1 +\u21453\'94\'bd\u12289\'81\'41\u21427\'8c\'b5\u26684\'8a\'69\u-29524\'90\'d3\u20219\'94\'43\u12289\'81\'41\u-28594\'89\'df\u22833\'8e\'b8\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u19981\'95\'73\u27861\'96\'40\u-30644\'8d\'73\u28858 +\'88\'d7\u31561\'93\'99\u12398\'82\'cc\u-30005\'90\'bf\u27714\'8b\'81}{\rtlch\fcs1 \af38 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 (}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u27861\'96\'40\u20196\'97\'df\u12395 +\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u31684\'94\'cd\u22258\'88\'cd\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390\'82\'c4}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \hich\af38\dbch\af370\loch\f38 )}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid11828113\charrsid9721683 \loch\af38\hich\af38\dbch\f370 +\uc2\u12371\'82\'b1\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12399\'82\'cd\u12289\'81\'41\u12510\'83\'7d\u12452\'83\'43\u12463\'83\'4e\u12525\'83\'8d\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12364\'82\'aa\u25613\'91\'b9\u23475\'8a\'51\u12398 +\'82\'cc\u21487\'89\'c2\u-32515\'94\'5c\u24615\'90\'ab\u12434\'82\'f0\u-30067\'94\'46\u-29864\'8e\'af\u12375\'82\'b5\u12390\'82\'c4\u12356\'82\'a2\u12383\'82\'bd\u12363\'82\'a9\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-30067\'94\'46 +\u-29864\'8e\'af\u12375\'82\'b5\u24471\'93\'be\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12395\'82\'c9\u12418\'82\'e0\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \fs20\lang1041\langfe1041\dbch\af370\langnp1041\langfenp1041\insrsid15299411\charrsid9721683 \loch\af38\hich\af38\dbch\f370 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12289\'81\'41\u19968\'88\'ea\u-28440\'95\'94\u12398\'82\'cc\u22269\'8d\'91\u12391 +\'82\'c5\u12399\'82\'cd\u20184\'95\'74\u-26993\'90\'8f\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u27966\'94\'68\u29983\'90\'b6\u30340\'93\'49\u25613\'91\'b9\loch\af38\hich\af38\dbch\f370 \u23475\'8a\'51 +\u12398\'82\'cc\u20813\'96\'c6\u-29524\'90\'d3\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-29524\'90\'d3\u20219\'94\'43\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12364\'82\'aa\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428 +\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u12383\'82\'bd\u12417\'82\'df\u12289\'81\'41\u19978\'8f\'e3\u-30184\'8b\'4c\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u20107\'8e\'96\u-26619\'8d\'80\u12364\'82\'aa\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3 +\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12364\'82\'aa\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1041\dbch\af370\langfenp1041\insrsid4684770\charrsid9721683 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 Normal;\lsdqformat1 \lsdpriority0 heading 1;\lsdqformat1 \lsdpriority0 heading 2; +\lsdqformat1 \lsdpriority0 heading 3;\lsdqformat1 \lsdpriority0 heading 4;\lsdqformat1 \lsdpriority0 heading 5;\lsdqformat1 \lsdpriority0 heading 6;\lsdqformat1 \lsdpriority0 heading 7;\lsdqformat1 \lsdpriority0 heading 8; +\lsdqformat1 \lsdpriority0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;\lsdpriority0 toc 1;\lsdpriority0 toc 2;\lsdpriority0 toc 3;\lsdpriority0 toc 4;\lsdpriority0 toc 5;\lsdpriority0 toc 6;\lsdpriority0 toc 7;\lsdpriority0 toc 8;\lsdpriority0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdpriority0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;\lsdpriority0 List 4;\lsdpriority0 List 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5; +\lsdqformat1 \lsdpriority0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdpriority0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority0 Subtitle;\lsdpriority0 Salutation; +\lsdpriority0 Date;\lsdpriority0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority0 Strong;\lsdqformat1 \lsdpriority0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Table; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority0 Table Grid; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Theme;\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List; +\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid; +\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2; +\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000f065 +693ba9b8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.KOR.rtf b/setup/resources/eula/VF_EULA.KOR.rtf new file mode 100644 index 00000000000..04b7aa07215 --- /dev/null +++ b/setup/resources/eula/VF_EULA.KOR.rtf @@ -0,0 +1,2421 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt Meiryo};} +{\f20\fbidi \fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}Gulim{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};} +{\f366\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}{\f481\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f489\fbidi \fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}@Gulim;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f627\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f628\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\f630\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f631\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f632\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\f633\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f634\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f635\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\f647\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f648\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}{\f650\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};} +{\f651\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f652\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}{\f653\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};} +{\f654\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f655\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}{\f739\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt Meiryo};} +{\f737\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt Meiryo};}{\f738\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt Meiryo};}{\f740\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt Meiryo};} +{\f741\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt Meiryo};}{\f744\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt Meiryo};} +{\f829\fbidi \fswiss\fcharset0\fprq2 Gulim Western{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f827\fbidi \fswiss\fcharset238\fprq2 Gulim CE{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f828\fbidi \fswiss\fcharset204\fprq2 Gulim Cyr{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f830\fbidi \fswiss\fcharset161\fprq2 Gulim Greek{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f831\fbidi \fswiss\fcharset162\fprq2 Gulim Tur{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};} +{\f834\fbidi \fswiss\fcharset186\fprq2 Gulim Baltic{\*\falt \'a1\'cb\'a2\'e7\'a1\'a7u\'a2\'ae\'a1\'d7u\'a2\'aeE\'a2\'ae\'a9\'ad\'a1\'a7I\'a2\'aeA};}{\f967\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};} +{\f968\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f970\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f971\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};} +{\f974\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f975\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f1007\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};} +{\f1008\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f1010\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f1011\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};} +{\f1012\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f1013\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f1014\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};} +{\f1015\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f1016\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f4287\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};} +{\f4288\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f4290\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f4291\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};} +{\f4294\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f5439\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f5437\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};} +{\f5438\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f5440\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f5441\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};} +{\f5444\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f5519\fbidi \fswiss\fcharset0\fprq2 @Gulim Western;}{\f5517\fbidi \fswiss\fcharset238\fprq2 @Gulim CE;}{\f5518\fbidi \fswiss\fcharset204\fprq2 @Gulim Cyr;} +{\f5520\fbidi \fswiss\fcharset161\fprq2 @Gulim Greek;}{\f5521\fbidi \fswiss\fcharset162\fprq2 @Gulim Tur;}{\f5524\fbidi \fswiss\fcharset186\fprq2 @Gulim Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 \styrsid8471744 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af366 \ltrch\fcs0 \b\f366\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\sbasedon10 page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f366\hich\af366\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f366\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs107 \additive \rtlch\fcs1 +\ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 \sbasedon106 \slink105 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 +\b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 +\b0\i0\f366\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 +\b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4 +\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3 +\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 } +{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \s5\fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \s6 +\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 +\s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af366\afs20 \ltrch\fcs0 \b\i0\f366\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 +\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\strike0\f366\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 } +{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af366\afs20 \ltrch\fcs0 \b0\i0\f366\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 } +{\listname ;}\listid974869818}{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li7557\lin7557 }{\listname ;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\revtbl {Unknown;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid617268\rsid3232293\rsid3296749\rsid3496967\rsid3755635\rsid4684770\rsid5122592\rsid5202097\rsid5203533\rsid5208170\rsid5453585\rsid5519702\rsid5650785\rsid5705142\rsid5858028\rsid6181571\rsid6293403\rsid6295084\rsid6310292 +\rsid6690595\rsid7553446\rsid7559961\rsid8456044\rsid8459489\rsid8471744\rsid9008156\rsid9196108\rsid9508464\rsid10839030\rsid11738826\rsid11758563\rsid11828113\rsid12399921\rsid12799225\rsid12925148\rsid14356214\rsid14375208\rsid14446677\rsid15234229 +\rsid15494803\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo9\dy24\hr20\min32} +{\version1}{\edmins0}{\nofpages3}{\nofwords633}{\nofchars3612}{\nofcharsws4237}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15494803 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15494803 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15494803 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15494803 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid3296749 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid3296749 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid3296749 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid3296749 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid3296749 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid3296749 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 MICROSOFT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid6181571\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 +MICROSOFT VISUAL F#}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft Corporation}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 (}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14867\'bf\'aa\u-14896\'bf\'a1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\u-18564\'b6\'f3}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14860\'bf\'ad\u-16212\'bb\'e7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14063\'c1\'df}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10920\'c7\'cf\u-20328\'b3\'aa}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21252\'b0\'fa}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21500\'b0\'a3\u-14896\'bf\'a1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13132\'c3\'bc\u-21328\'b0\'e1\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14524\'c0\'bb}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14467\'c0\'d0\u-14924\'be\'ee}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14084\'c1\'d6\u-15652\'bd\'c3\u-20944\'b1\'e2}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17388\'b9\'d9\u-18547\'b6\'f8\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-14896\'bf\'a1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17787\'b8\'ed\u-15652\'bd\'c3\u-19428\'b5\'c8}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-21504\'b0\'a1}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19428\'b5\'c8}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-19180\'b5\'f0\u-14924\'be\'ee\u-21504\'b0\'a1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-19719\'b4\'e7}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-19180\'b5\'f0\u-14924\'be\'ee\u-14896\'bf\'a1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-19719\'b4\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11128\'c7\'b0\u-17751\'b8\'f1\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17212\'ba\'b0\u-19516\'b5\'b5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14979\'be\'e0\u-14315\'c1\'a4\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14808\'bf\'c2\u-18564\'b6\'f3\u-14472\'c0\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14907\'be\'f7\u-19600\'b5\'a5\u-14476\'c0\'cc\u-11592\'c6\'ae}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 ,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12908\'c3\'df\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-16079\'bc\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14700\'bf\'e4\u-15988\'bc\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 ,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14472\'c0\'ce\u-11984\'c5\'cd\u-20169\'b3\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-17384\'b9\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14640\'bf\'f8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14784\'bf\'cd}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21479\'b0\'b0\u-14528\'c0\'ba}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-16079\'bc\'ba}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14700\'bf\'e4\u-15988\'bc\'d2\u-14896\'bf\'a1\u-19516\'b5\'b5}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17212\'ba\'b0\u-19516\'b5\'b5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14979\'be\'e0\u-14315\'c1\'a4\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-19719\'b4\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14979\'be\'e0\u-14315\'c1\'a4\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10904\'c7\'d4\u-14532\'c0\'b8\u-18340\'b7\'ce\u-15512\'bd\'e1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-18536\'b7\'a1\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-10899\'c7\'d7\u-19228\'b5\'e9\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19495\'b5\'bf\u-14504\'c0\'c7\u-10920\'c7\'cf\u-21364 +\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19495\'b5\'bf\u-14504\'c0\'c7\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec\u-14896\'bf\'a1\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616 +\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17976\'b8\'b6\u-15635\'bd\'ca\u-15652\'bd\'c3\u-14812\'bf\'c0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14080\'c1\'d8\u-15848\'bc\'f6\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-18536\'b7\'a1\u-14784\'bf\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21479\'b0\'b0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14847\'bf\'b5\u-21140\'b1\'b8\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-16212\'bb\'e7\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid617268 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-16092\'bc\'b3\u-12712\'c4\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14504\'c0\'c7}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-21308\'b0\'e8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21476\'b0\'b3\u-17380\'b9\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11956\'c5\'d7\u-15708\'bd\'ba\u-11592\'c6\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17751\'b8\'f1\u-14335\'c0\'fb\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14504\'c0\'c7}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14427\'c0\'e5\u-12712\'c4\'a1\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-17160\'ba\'bb\u-14524\'c0\'bb}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-18487\'b7\'ae\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-21308\'b0\'e8\u-14906\'be\'f8\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-12712\'c4\'a1\u-10920\'c7\'cf\u-14868 +\'bf\'a9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12908\'c3\'df\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14700\'bf\'e4\u-21140\'b1\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-10899\'c7\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 /}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14896\'bf\'a1\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\loch\af38\hich\af38\dbch\f20 \u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-18536\'b7\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-10899\'c7\'d7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14080\'c1\'d8\u-15848\'bc\'f6\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21476\'b0\'b3\u-17380\'b9\'df\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17024\'ba\'ce\u-14868\'bf\'a9\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19432\'b5\'c7\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7559961 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-16212\'bb\'e7\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-18536\'b7\'a1\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20328\'b3\'aa\u-14860\'bf\'ad\u-19428\'b5\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11955\'c5\'d8\u-15708\'bd\'ba\u-11592\'c6\'ae}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11508\'c6\'c4\u-14468\'c0\'cf\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1033\langfe1042\loch\af20\hich\af20\dbch\af20\langfenp1042\insrsid7559961\charrsid9508464 \hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1033\langfe1042\loch\af20\hich\af20\dbch\af20\langfenp1042\insrsid7559961\charrsid9508464 \hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 +REDIST.TXT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11508\'c6\'c4\u-14468\'c0\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 +}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 REDIST.TXT }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11508\'c6\'c4\u-14468\'c0\'cf\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20328\'b3\'aa\u-14860\'bf\'ad\u-19428\'b5\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21475\'b0\'b4\u-13132\'c3\'bc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10731\'c7\'fc\u-12068\'c5\'c2\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17163\'ba\'b9\u-16212\'bb\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14504\'c0\'c7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-14448\'c0\'da +\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14468\'c0\'cf\u-17024\'ba\'ce\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17163\'ba\'b9\u-16212\'bb\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10920\'c7\'cf\u-19516\'b5\'b5\u-18339\'b7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17360\'b9\'e8\loch\af38\hich\af38\dbch\f20 \u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10920\'c7\'cf\u-18396\'b7\'c1\u-17804\'b8\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-14896\'bf\'a1\u-16100\'bc\'ad}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14063\'c1\'df\u-14700\'bf\'e4\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-19803\'b4\'c9\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12908\'c3\'df\u-21504\'b0\'a1\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 .lib}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11508\'c6\'c4\u-14468\'c0\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18044\'b8\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10667\'c8\'ae\u-14427\'c0\'e5\u-14448\'c0\'da\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-13884\'c1\'f8}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14504\'c0\'c7}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10904\'c7\'d4\u-20776\'b2\'b2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17983\'b8\'b5\u-12572\'c4\'bf\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11851\'c5\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15644\'bd\'c7\u-10871\'c7\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21328\'b0\'e1\u-21252\'b0\'fa\u-17972\'b8\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-12712\'c4\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19428\'b5\'c8}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-14315\'c1\'a4\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16191\'bb\'f3\u-12068\'c5\'c2\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-12712\'c4\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14468\'c0\'cf\u-17024\'ba\'ce\u-18340\'b7\'ce\u-17972\'b8\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10892\'c7\'d8\u-14980 +\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12964\'c3\'d6\u-15988\'bc\'d2\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14080\'c1\'d8\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-10696\'c8\'a3\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-10899\'c7\'d7\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-14448\'c0\'da\u-14784\'bf\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14728\'bf\'dc\loch\af38\hich\af38\dbch\f20 \u-17024 +\'ba\'ce\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12964\'c3\'d6\u-14203\'c1\'be}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-14448\'c0\'da\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19495\'b5\'bf\u-14504\'c0\'c7\u-10920\'c7\'cf\u-19516 +\'b5\'b5\u-18339\'b7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14560\'c0\'af\u-10584\'c8\'bf\u-10916\'c7\'d1}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14336\'c0\'fa\u-14447\'c0\'db\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11172\'c7\'a5\u-15652\'bd\'c3\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3\u-19428\'b5\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13139\'c3\'bb\u-21140\'b1\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 (}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17216\'ba\'af\u-10696\'c8\'a3\u-16212\'bb\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16828\'ba\'f1\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 )}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18340\'b7\'ce\u-17024\'ba\'ce\u-11984\'c5\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17804\'b8\'e9\u-13243\'c3\'a5\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14459\'c0\'d4\u-10360\'c8\'f7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-14532\'c0\'b8\u-17808\'b8\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17367\'b9\'e6\u-14924\'be\'ee\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-14516\'c0\'bd\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21479\'b0\'b0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14336\'c0\'fa\u-14447\'c0\'db\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16191\'bb\'f3\u-11172\'c7\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11591\'c6\'af\u-10808\'c7\'e3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11172\'c7\'a5\u-15652\'bd\'c3\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17216\'ba\'af\u-21315\'b0\'e6\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16191\'bb\'f3\u-11172\'c7\'a5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18044\'b8\'a7\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10920\'c7\'cf\u-21392\'b0\'c5\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14504\'c0\'c7}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17972\'b8\'b8\u-19228\'b5\'e9\u-21392\'b0\'c5\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-13923\'c1\'f5\u-10916\'c7\'d1\u-19740 +\'b4\'d9\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21231\'b1\'a4\u-21280\'b0\'ed\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10920\'c7\'cf\u-14868\'bf\'a9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 Windows}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-19764\'b4\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10996\'c7\'c3\u-18517\'b7\'a7\u-11268\'c6\'fb\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15644\'bd\'c7\u-10871\'c7\'e0\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15035\'be\'c7\u-16079\'bc\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-17972\'b8\'b8\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-17259\'b9\'fd\u-14335\'c0\'fb\u-14472\'c0\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-10920\'c7\'cf\u-19820 +\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14468\'c0\'cf\u-17024\'ba\'ce\u-17020\'ba\'d0\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14840\'bf\'b9\u-14728\'bf\'dc\u-14335\'c0\'fb}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19432\'b5\'c7\u-19516\'b5\'b5\u-18339\'b7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-14315\'c1\'a4\u-10920\'c7\'cf\u-21392\'b0\'c5\u-20328\'b3\'aa}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14840\'bf\'b9\u-14728\'bf\'dc\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba\u-18560\'b6\'f5}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-14315\'c1\'a4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-14516\'c0\'bd\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21479\'b0\'b0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10940\'c7\'ca\u-14700\'bf\'e4\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10731\'c7\'fc\u-12068\'c5\'c2\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21259\'b0\'f8\u-21476\'b0\'b3\u-19432\'b5\'c7\u-21392\'b0\'c5\loch\af38\hich\af38\dbch\f20 \u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-18548\'b6\'f7\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-11284\'c6\'f7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-14315\'c1\'a4\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7553446 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11851\'c5\'eb\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid9008156\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19428\'b5\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\u-18564\'b6\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14868\'bf\'a9\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21373\'b0\'cd\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-19768\'b4\'cf\u-18564\'b6\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-18564\'b6\'f3\u-14476\'c0\'cc\u-16096\'bc\'b1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\u-18564\'b6\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 Microsoft}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14868\'bf\'a9\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid9008156\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid7553446 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb +\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11851\'c5\'eb\u-13888\'c1\'f6\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19432\'b5\'c7\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-14532\'c0\'b8\u-17808\'b8\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 ThirdPartyNotices.txt }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11508\'c6\'c4\u-14468\'c0\'cf\u-14896\'bf\'a1\u-16100\'bc\'ad\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10667\'c8\'ae\u-14472\'c0\'ce\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid11758563\charrsid7553446 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17260\'b9\'fc\loch\af38\hich\af38\dbch\f20 \u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11504\'c6\'c7\u-17948\'b8\'c5\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21373\'b0\'cd\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15036\'be\'c6\u-19768\'b4\'cf\u-18564\'b6\'f3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14868\'bf\'a9\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21373\'b0\'cd\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14868\'bf\'a9\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-12096\'c5\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 Microsoft}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14560\'c0\'af\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-21308\'b0\'e8\u-14906\'be\'f8\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19628\'b4\'f5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17970\'b8\'b9\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17024\'ba\'ce\u-14868\'bf\'a9\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17787\'b8\'ed\u-15652\'bd\'c3\u-14335\'c0\'fb\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10916\'c7\'d1\u-10892\'c7\'d8\u-16100\'bc\'ad\u-17972\'b8\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7\u-18425\'b7\'b8\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11591\'c6\'af\u-14315\'c1\'a4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17367\'b9\'e6\u-15651\'bd\'c4\u-14532\'c0\'b8\u-18340\'b7\'ce\u-17972\'b8\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19516\'b5\'b5\u-18339\'b7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-15840\'bc\'fa\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-10899\'c7\'d7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14080\'c1\'d8\u-15848\'bc\'f6\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-14516\'c0\'bd\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21479\'b0\'b0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid7553446 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-15840\'bc\'fa\u-14335\'c0\'fb}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-10899\'c7\'d7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-17384\'b9\'dd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-14896\'bf\'a1\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-21140\'b1\'b8\u-10920\'c7\'cf\u-21280 +\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17787\'b8\'ed\u-15652\'bd\'c3\u-14335\'c0\'fb\u-14532 +\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-14728\'bf\'dc\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18004\'b8\'ae\u-17276\'b9\'f6\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14892\'bf\'a3\u-13888\'c1\'f6\u-19768\'b4\'cf\u-14924\'be\'ee\u-17983\'b8\'b5}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19180\'b5\'f0\u-12556\'c4\'c4\u-11508\'c6\'c4\u-14468\'c0\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19180\'b5\'f0\u-15708\'bd\'ba\u-14924\'be\'ee\u-16056\'bc\'c0\u-16876\'ba\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14447\'c0\'db\u-14907\'be\'f7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-10871\'c7\'e0\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-14896\'bf\'a1\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-21140\'b1\'b8\u-10920\'c7\'cf\u-21280 +\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-16100\'bc\'ad\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17787\'b8\'ed\u-15652\'bd\'c3\u-19428\'b5\'c8}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21373\'b0\'cd\u-17164\'ba\'b8\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820 +\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21373\'b0\'cd\u-17164\'ba\'b8\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19628\'b4\'f5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17970\'b8\'b9\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-17160\'ba\'bb\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17972\'b8\'b8\u-19236\'b5\'e5\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-18548\'b6\'f7\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17163\'ba\'b9\u-16212\'bb\'e7\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19516\'b5\'b5\u-18339\'b7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21364\'b0\'d4\u-15652\'bd\'c3\u-10920\'c7\'cf\loch\af38\hich\af38\dbch\f20 \u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14460\'c0\'d3\u-19712\'b4\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-14868\'bf\'a9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-17024\'ba\'ce\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-16100\'bc\'ad\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da\u-14896\'bf\'a1\u-21364\'b0\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14959\'be\'e7\u-19516\'b5\'b5\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16191\'bb\'f3\u-14907\'be\'f7\u-14679\'bf\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10696\'c8\'a3\u-15708\'bd\'ba\u-11515\'c6\'c3}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17359\'b9\'e9\u-14907\'be\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17359\'b9\'e9\u-14907\'be\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10920\'c7\'cf\u-20328\'b3\'aa\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17972\'b8\'b8\u-19228\'b5\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17359\'b9\'e9\u-14907\'be\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-17160\'ba\'bb\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-15652\'bd\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-12712\'c4\'a1\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10916\'c7\'d1\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-17787\'b8\'ed\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12556\'c4\'c4\u-11032\'c7\'bb\u-11984\'c5\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-17024\'ba\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20188\'b3\'d7\u-11592\'c6\'ae\u-14644\'bf\'f6\u-12180\'c5\'a9\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14560\'c0\'af\u-10584\'c8\'bf\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15007\'be\'d7\u-16072\'bc\'bc\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-10916\'c7\'d1\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-14448\'c0\'da\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-17024\'ba\'ce\u-14335\'c0\'fb\u-14472\'c0\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13256\'c2\'fc\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17751\'b8\'f1\u-14335\'c0\'fb\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-17787\'b8\'ed\u-16100\'bc\'ad\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17163\'ba\'b9\u-16212\'bb\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\loch\af38\hich\af38\dbch\f20 \u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14427\'c0\'e5\u-12712\'c4\'a1\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-14332\'c0\'fc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17751\'b8\'f1\u-14335\'c0\'fb\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-21392\'b0\'c5\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-14516\'c0\'bd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14427\'c0\'e5\u-12712\'c4\'a1\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16092\'bc\'b3\u-12712\'c4\'a1\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14427\'c0\'e5\u-12712\'c4\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21500\'b0\'a3\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21259\'b0\'f8\u-14560\'c0\'af\u-10920\'c7\'cf\u-20944\'b1\'e2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-14332\'c0\'fc\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid617268 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-12900\'c3\'e2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-21139\'b1\'b9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-12900\'c3\'e2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-21028\'b1\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21028\'b1\'d4\u-14315\'c1\'a4\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17381\'b9\'de\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19432\'b5\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-20300\'b3\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-12900\'c3\'e2\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21028\'b1\'d4\u-14315\'c1\'a4\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14080\'c1\'d8\u-15848\'bc\'f6\u-10892\'c7\'d8\u-14980\'be\'df}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid9508464 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc\u-14896\'bf\'a1\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17751\'b8\'f1\u-14335\'c0\'fb\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12964\'c3\'d6\u-14203\'c1\'be}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12964\'c3\'d6\u-14203\'c1\'be}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14679\'bf\'eb\u-19516\'b5\'b5\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da\u-16072\'bc\'bc\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-14679\'bf\'eb\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-13256\'c2\'fc\u-14224\'c1\'b6\u-10920\'c7\'cf\u-15635\'bd\'ca\u-15652\'bd\'c3\u-14812\'bf\'c0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid617268\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14640\'bf\'f8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\loch\af20\hich\af20\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid9508464 \hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7\u-19712\'b4\'eb\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\loch\af20\hich\af20\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid9508464 \hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-21259\'b0\'f8\u-19432\'b5\'c7\u-17472\'b9\'c7\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14640\'bf\'f8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-21259\'b0\'f8\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14332\'c0\'fc\u-17804\'b8\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12908\'c3\'df\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-16079\'bc\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14700\'bf\'e4\u-15988\'bc\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14907\'be\'f7\u-19600\'b5\'a5\u-14476\'c0\'cc\u-11592\'c6\'ae}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14472\'c0\'ce\u-11984\'c5\'cd\u-20169\'b3\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-17384\'b9\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14640\'bf\'f8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-10899\'c7\'d7\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14640\'bf\'f8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14332\'c0\'fc\u-17804\'b8\'e9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10903\'c7\'d5\u-14504\'c0\'c7\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17416\'b9\'cc\u-21139\'b1\'b9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-21139\'b1\'b9\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-14459\'c0\'d4\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-14308\'c1\'a6\u-16212\'bb\'e7\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14640\'bf\'f8\u-12711\'c4\'a2\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\loch\af38\hich\af38\dbch\f20 \u-21308\'b0\'e8\u-14906\'be\'f8\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-16099\'bc\'ae\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14644\'bf\'f6\u-15631\'bd\'cc\u-11980\'c5\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14084\'c1\'d6\u-17259\'b9\'fd\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\u-18060\'b8\'a3\u-17808\'b8\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-17384\'b9\'dd\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13139\'c3\'bb\u-21140\'b1\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17380\'b9\'df\u-16163\'bb\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15652\'bd\'c3\u-14896\'bf\'a1\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14644\'bf\'f6\u-15631\'bd\'cc\u-11980\'c5\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14084\'c1\'d6\u-17259\'b9\'fd\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-16828\'ba\'f1\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-10696\'c8\'a3\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-21259\'b0\'f8\u-14315\'c1\'a4\u-21392\'b0\'c5\u-18536\'b7\'a1\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-12096\'c5\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-21028\'b1\'d4\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17381\'b9\'de\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13139\'c3\'bb\u-21140\'b1\'b8\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17380\'b9\'df\u-16163\'bb\'fd\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14084\'c1\'d6\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14084\'c1\'d6\u-17259\'b9\'fd\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-21139\'b1\'b9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14728\'bf\'dc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14867\'bf\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14896\'bf\'a1\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10916\'c7\'d1\u-17412\'b9\'ce\u-21139\'b1\'b9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-17259\'b9\'fd\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10584\'c8\'bf\u-18395\'b7\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-11591\'c6\'af\u-14315\'c1\'a4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-15840\'bc\'fa\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-21504\'b0\'a1\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-21028\'b1\'d4\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14427\'c0\'e5\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14560\'c0\'af\loch\af38\hich\af38\dbch\f20 \u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-14459\'c0\'d4\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-19719\'b4\'e7\u-16212\'bb\'e7\u-14448\'c0\'da\u-14784\'bf\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3\u-19428\'b5\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14560\'c0\'af\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-21504\'b0\'a1\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17216\'ba\'af\u-21315\'b0\'e6\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-19719\'b4\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-17216\'ba\'af\u-21315\'b0\'e6\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid7553446 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid7553446 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-13923\'c1\'f5\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17024\'ba\'ce\u-14472\'c0\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\loch\af20\hich\af20\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid9508464 \hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7\u-19712\'b4\'eb\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af20\hich\af20\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid9508464 +\hich\af20\dbch\af20\loch\f20 "}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-21108\'b1\'c7\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14868\'bf\'a9\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 . }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616 +\'bf\'fe\u-14924\'be\'ee\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14679\'bf\'eb\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17380\'b9\'df\u-16163\'bb\'fd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-10792\'c7\'e8\u-14528\'c0\'ba}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-13243\'c3\'a5\u-14460\'c0\'d3\u-14459\'c0\'d4\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 .}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14924\'be\'ee\u-19040\'b6\'b0\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17787\'b8\'ed\u-15652\'bd\'c3\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-13923\'c1\'f5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14427\'c0\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-15652\'bd\'c3\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740 +\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14867\'bf\'aa\u-14504\'c0\'c7}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-21028\'b1\'d4\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\loch\af38\hich\af38\dbch\f20 \u-18056\'b8\'a5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 + }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12908\'c3\'df\u-21504\'b0\'a1\u-14335\'c0\'fb\u-14472\'c0\'ce}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-16828\'ba\'f1\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14560\'c0\'af\u-10912\'c7\'d2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-14532\'c0\'b8\u-17808\'b8\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17160\'ba\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11851\'c5\'eb\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17216\'ba\'af\u-21315\'b0\'e6\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740 +\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13888\'c1\'f6\u-14867\'bf\'aa\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-21028\'b1\'d4\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17260\'b9\'fc\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 MICROSOFT}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16191\'bb\'f3\u-14907\'be\'f7\u-16079\'bc\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11591\'c6\'af\u-14315\'c1\'a4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17751\'b8\'f1\u-14335\'c0\'fb\u-14896\'bf\'a1\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-10903\'c7\'d5\u-16079\'bc\'ba}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16828\'ba\'f1\u-12696\'c4\'a7\u-10892\'c7\'d8\u-16079\'bc\'ba\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3\u-19428\'b5\'c8}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17611\'b9\'ac\u-15652\'bd\'c3\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-13923\'c1\'f5\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-14308\'c1\'a6\u-10903\'c7\'d5\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid3232293\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14812\'bf\'c0\u-15708\'bd\'ba\u-11592\'c6\'ae\u-18424\'b7\'b9\u-14468\'c0\'cf\u-18004\'b8\'ae\u-15036\'be\'c6\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10892\'c7\'d8\u-19719\'b4\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 \hich\f38 \endash +\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14812\'bf\'c0\u-15708\'bd\'ba\u-11592\'c6\'ae\u-18424\'b7\'b9\u-14468\'c0\'cf\u-18004\'b8\'ae\u-15036\'be\'c6}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-16828\'ba\'f1\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-10696\'c8\'a3\u-17259\'b9\'fd\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19152\'b5\'fb\u-18564\'b6\'f3}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14560\'c0\'af\u-10920\'c7\'cf\u-17808\'b8\'e7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0\u-16100\'bc\'ad\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14924\'be\'ee\u-19040\'b6\'b0\u-10916\'c7\'d1}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-14679\'bf\'eb\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21108\'b1\'c7\u-18004\'b8\'ae\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14847\'bf\'b5\u-10843\'c7\'e2\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-13104\'c3\'c4\u-16100\'bc\'ad\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15032\'be\'c8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1042\langfe1042\loch\af38\hich\af38\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-15984\'bc\'d5\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21140\'b1\'b8\u-14308\'c1\'a6\u-15848\'bc\'f6\u-19736\'b4\'dc\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17393\'b9\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13887\'c1\'f7\u-14319\'c1\'a2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10916\'c7\'d1\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14784\'bf\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21259\'b0\'f8\u-20983\'b1\'de\u-14448\'c0\'da\u-18340\'b7\'ce\u-17024\'ba\'ce\u-11984\'c5\'cd}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12964\'c3\'d6\u-19712\'b4\'eb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17416\'b9\'cc\u-10668\'c8\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 5}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-20916\'b1\'ee\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-16191\'bb\'f3\u-17381\'b9\'de\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21328\'b0\'e1\u-21252\'b0\'fa\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14476\'c0\'cc\u-14475\'c0\'cd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-15644\'bd\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-11591\'c6\'af\u-17212\'ba\'b0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21500\'b0\'a3\u-14319\'c1\'a2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17024\'ba\'ce\u-15848\'bc\'f6\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8\u-18052\'b8\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-12096\'c5\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10892\'c7\'d8\u-16100\'bc\'ad\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-16191\'bb\'f3\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17381\'b9\'de\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14906\'be\'f8\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid12399921\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14476\'c0\'cc}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-10899\'c7\'d7\u-14528\'c0\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19740\'b4\'d9\u-14516\'c0\'bd\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 +\uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14472\'c0\'ce\u-11984\'c5\'cd\u-20169\'b3\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14476\'c0\'cc\u-11592\'c6\'ae\u-16191\'bb\'f3\u-14504\'c0\'c7}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15988\'bc\'d2\u-11004\'c7\'c1\u-11592\'c6\'ae\u-14616\'bf\'fe\u-14924\'be\'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-16100\'bc\'ad\u-16828\'ba\'f1\u-15708\'bd\'ba}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-12456\'c4\'dc\u-11952\'c5\'d9\u-12768\'c3\'f7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 (}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-12460\'c4\'da\u-19236\'b5\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11284\'c6\'f7\u-10904\'c7\'d4}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 ) }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14448\'c0\'da}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-11004\'c7\'c1\u-18340\'b7\'ce\u-21000\'b1\'d7\u-18520\'b7\'a5\u-21252\'b0\'fa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3\u-10920\'c7\'cf\u-14868\'bf\'a9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17380\'b9\'df\u-16163\'bb\'fd\u-10920\'c7\'cf\u-19820 +\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17752\'b8\'f0\u-19232\'b5\'e7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17608\'b9\'ae\u-14308\'c1\'a6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\loch\af3\hich\af3\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af3\dbch\af20\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21308\'b0\'e8\u-14979\'be\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-17384\'b9\'dd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-13923\'c1\'f5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17164\'ba\'b8\u-14427\'c0\'e5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14224\'c1\'b6\u-21388\'b0\'c7\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-14476\'c0\'cc\u-10871\'c7\'e0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17612\'b9\'ab\u-21252\'b0\'fa\u-15644\'bd\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13243\'c3\'a5\u-14460\'c0\'d3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21252\'b0\'fa\u-15644\'bd\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21248\'b0\'fc\u-18392\'b7\'c3}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17259\'b9\'fd\u-18080\'b7\'fc\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17260\'b9\'fc\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20300\'b3\'bb\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-12096\'c5\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17016\'ba\'d2\u-17259\'b9\'fd}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-10871\'c7\'e0\u-14588\'c0\'a7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19215\'b5\'ee\u-14532\'c0\'b8\u-18340\'b7\'ce}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14472\'c0\'ce\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-13139\'c3\'bb\u-21140\'b1\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 Microsoft} +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21000\'b1\'d7\u-18452\'b7\'af\u-10916\'c7\'d1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1\u-19803\'b4\'c9\u-16079\'bc\'ba\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-19712\'b4\'eb\u-10892\'c7\'d8}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-16212\'bb\'e7\u-14332\'c0\'fc\u-14896\'bf\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15028\'be\'cb\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-14904\'be\'fa\u-21392\'b0\'c5\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15028\'be\'cb\u-15036\'be\'c6\u-14980\'be\'df\u-17972\'b8\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10872\'c7\'df\u-19624\'b4\'f8}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec\u-14896\'bf\'a1\u-19516\'b5\'b5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19415\'b5\'cb\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11828113\charrsid6690595 .}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid11738826\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21056\'b1\'cd\u-10920\'c7\'cf}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21392\'b0\'c5\u-14084\'c1\'d6\u-10920\'c7\'cf\u-21280\'b0\'ed}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21139\'b1\'b9\u-21504\'b0\'a1\u-14896\'bf\'a1\u-16100\'bc\'ad}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17024\'ba\'ce\u-15848\'bc\'f6\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 , }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-21328\'b0\'e1\u-21252\'b0\'fa\u-14335\'c0\'fb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-18928\'b6\'c7\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-20944\'b1\'e2\u-12096\'c5\'b8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15984\'bc\'d5\u-10892\'c7\'d8\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-14308\'c1\'a6\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-10808\'c7\'e3\u-14679\'bf\'eb\u-10920\'c7\'cf\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-21315\'b0\'e6\u-14672\'bf\'ec\u-14896\'bf\'a1\u-19820\'b4\'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14588\'c0\'a7\u-14504\'c0\'c7}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14308\'c1\'a6\u-10916\'c7\'d1\u-14476\'c0\'cc\u-20328\'b3\'aa}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-17360\'b9\'e8\u-14308\'c1\'a6\u-21504\'b0\'a1}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14335\'c0\'fb\u-14679\'bf\'eb\u-19432\'b5\'c7\u-13888\'c1\'f6}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-15030\'be\'ca\u-14524\'c0\'bb}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 +\loch\af38\hich\af38\dbch\f20 \uc2\u-15848\'bc\'f6}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \hich\af38\dbch\af20\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 \loch\af38\hich\af38\dbch\f20 \uc2\u-14456\'c0\'d6\u-15691\'bd\'c0\u-19768\'b4\'cf\u-19740\'b4\'d9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1042\langfe1042\dbch\af20\langnp1042\langfenp1042\insrsid5203533\charrsid6690595 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1033\langfe1042\dbch\af20\langfenp1042\insrsid4684770\charrsid6690595 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000050ad +dd1d37b9ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.PLK.rtf b/setup/resources/eula/VF_EULA.PLK.rtf new file mode 100644 index 00000000000..09d89b443a8 --- /dev/null +++ b/setup/resources/eula/VF_EULA.PLK.rtf @@ -0,0 +1,692 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f40\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f41\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;} +{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);} +{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);} +{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;} +{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;}{\f444\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f454\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f452\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;} +{\f453\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f455\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f456\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f459\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f39\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof +tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f38 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive \f2\cf11\lang1024\langfe1024\noproof +tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \f38\fs19\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 +Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 +\sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid4684770\rsid5858028\rsid9196108\rsid11758563\rsid11828113\rsid14356214\rsid14446677\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0 +\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo4\dy30\hr15\min19}{\version1}{\edmins0}{\nofpages3}{\nofwords1110}{\nofchars6329}{\nofcharsws7425}{\vern49275}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 MICROSOFT VISUAL F# }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which \hich\af38\dbch\af13\loch\f38 +includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 updates,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 supplements,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Internet-based services, and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 support services}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BY USING T\hich\af38\dbch\af13\loch\f38 HE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +You may install and use any number of copies of the software \hich\af38\dbch\af13\loch\f38 on your devices}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 to design, develop and test your programs.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 2.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ADDITIONAL\hich\af38\dbch\af13\loch\f38 LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software contains code that you are permitted to distribute in programs you develop if you comply with the terms belo\hich\af38\dbch\af13\loch\f38 w.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 + The code and text files listed below are \'93\loch\f38 \hich\f38 Distributable Code.\'94}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 REDIST\hich\af38\dbch\af13\loch\f38 .TXT Files}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +. You may copy and distribute the object code form of code listed in REDIST.TXT files.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Third Party Distribution}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 . You may permit distributors o\hich\af38\dbch\af13\loch\f38 +f your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 add significant primary functionality to it in your programs;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 for any Distributable Code\hich\af38\dbch\af13\loch\f38 having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your program;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code included in a setup program only as part of that setup program without modification;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\loch\af38\dbch\af13\hich\f38 \rquote \loch\f38 fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the Distributable Code;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 s trademarks in your programs\hich\f38 \rquote \loch\f38 names or in a way that suggests your\hich\af38\dbch\af13\loch\f38 programs come from or are endorsed by Microsoft;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code to run on a platform other than the Windows platform;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 include Distributable Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 modify or distribute the source code of any Di\hich\af38\dbch\af13\loch\f38 +stributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 others have the\hich\af38\dbch\af13\loch\f38 right to modify it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 THIRD PARTY PROGRAMS AND NOTICES}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 +. Other third party code included in the software is licensed to you by Microsoft under this license agreement, rather than licensed to you by any third party under some other license terms. Notices, if any, for this thir\hich\af38\dbch\af13\loch\f38 +d party code are included with the software and may also be}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 found in the ThirdPartyNotices.txt file. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use \hich\af38\dbch\af13\loch\f38 +the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 revers\hich\af38\dbch\af13\loch\f38 e engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 make more copies of the software than specified in this agreement or allowed by applicable law, despite this li\hich\af38\dbch\af13\loch\f38 mitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 publish the software for others to copy;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may make one backup copy of the +\hich\af38\dbch\af13\loch\f38 software. You may use it only to reinstall the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 TRANSFER TO ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may unin\hich\af38\dbch\af13\loch\f38 +stall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is subject to United States export laws and regulations. You must comply with all domestic and inte\hich\af38\dbch\af13\loch\f38 +rnational export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we +\hich\af38\dbch\af13\loch\f38 may not provide support services for it.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 APPLICABLE LAW.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live gove +\hich\af38\dbch\af13\loch\f38 rn all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Outside the United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 If you acquired the software in any other country, the laws of that country apply.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This agreement des\hich\af38\dbch\af13\loch\f38 +cribes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 laws of your country do not permit it to do so.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f38 \hich\f38 AS-IS.\'94\loch\f38 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY G +\hich\af38\dbch\af13\loch\f38 +UARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 FOR AUSTRALIA \hich\f38 \endash \loch\f38 YOU HAVE +\hich\af38\dbch\af13\loch\f38 STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 +. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.0\hich\af38\dbch\af11\loch\f38 0. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This limitation applies to}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third\hich\af38\dbch\af13\loch\f38 party programs; and}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the pos\hich\af38\dbch\af13\loch\f38 +sibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 3; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1; +\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8; +\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e50000000000000000000000007074 +16b8f045ce010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000707416b8f045ce01 +707416b8f045ce010000000000000000000000005400330042004100430054004b0032005500c400da005100570034005300dc00d7003200d9003300c600d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000707416b8f045 +ce01707416b8f045ce010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30393430 +443034442d394333322d344535322d393035392d4534424344444345354439427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.PTB.rtf b/setup/resources/eula/VF_EULA.PTB.rtf new file mode 100644 index 00000000000..bb4336ff3df --- /dev/null +++ b/setup/resources/eula/VF_EULA.PTB.rtf @@ -0,0 +1,787 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};}{\f60\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Arial Unicode MS};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????\'a8\'ac????};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f574\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\f1044\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Arial Unicode MS};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs107 \additive \rtlch\fcs1 +\ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 \sbasedon106 \slink105 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid2456459\rsid2716364\rsid3373800\rsid3412422\rsid3755635\rsid4684770\rsid4814785\rsid5519702\rsid5640834\rsid5858028\rsid6097773\rsid6226387\rsid6453382\rsid6842898\rsid7494399\rsid7674942\rsid7807714\rsid8205740\rsid8261346 +\rsid9196108\rsid9441969\rsid10452263\rsid11677077\rsid11687511\rsid11758563\rsid11828113\rsid12333227\rsid12418633\rsid12799225\rsid13064779\rsid13513623\rsid14356214\rsid14375208\rsid14377324\rsid14428873\rsid14446677\rsid15548830\rsid15928761 +\rsid16280961\rsid16652294}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo9\dy24\hr3\min44}{\version1}{\edmins0} +{\nofpages3}{\nofwords1346}{\nofchars7673}{\nofcharsws9001}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14377324 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14377324 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14377324 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14377324 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid8205740 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid8205740 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid8205740 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid8205740 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid8205740 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid8205740 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 TERMOS DE LICENCIAMENTO PARA SOFTWARE MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 + +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9441969 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 +Os presentes termo\hich\af38\dbch\af13\loch\f38 \hich\f38 s de licenciamento constituem um contrato entre a Microsoft Corporation (ou dependendo do pa\'ed\loch\f38 s em que reside uma das respetivas afiliadas) e o Adquirente.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 +\hich\af38\dbch\af13\loch\f38 Leia-os.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 Estes termos aplicam-se ao software supra mencionado, o qual inclui os suportes de dados em \hich\af38\dbch\af13\loch\f38 +que o Adquirente os recebeu, caso existam.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Os termos tamb\'e9\loch\f38 m se aplicam a}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid9441969 \~}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 quaisquer}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 atualiza\'e7\'f5 +\loch\f38 es,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 suplementos,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 servi\'e7\loch\f38 os baseados na Internet e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 servi\'e7\loch\f38 os de suporte}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 +da Microsoft para este so\hich\af38\dbch\af13\loch\f38 ftware, exceto quando estes itens forem acompanhados de outros termos.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Se for esse o caso, esses ser\'e3\loch\f38 o os termos aplicados.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 AO UTILIZAR O SOFTWARE EST\'c1\loch\f38 A ACEITAR ESTES TERMOS.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 +\hich\f38 CASO N\'c3\loch\f38 \hich\f38 O ACEITE OS TERMOS, N\'c3\loch\f38 \hich\f38 O DEVER\'c1\loch\f38 UTILIZAR O SOFTWARE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +SE O ADQUIRENTE CUMPRIR COM OS PRESENTES TERMOS DE LICENCIAMENTO, TER\'c1\loch\f38 \hich\f38 OS DIREITOS PERP\'c9\loch\f38 TUOS DESCRITOS INFRA.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang2070\langfe1033\loch\af38\hich\af38\dbch\af13\langnp2070\langfenp1033\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid13064779 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 +DIREITOS DE INSTALA\'c7\'c3\loch\f38 \hich\f38 O E DE UTILIZA\'c7\'c3\loch\f38 O.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O Adquirente pode instalar e utilizar qualquer n\'fa\loch\f38 \hich\f38 mero de c\'f3\loch\f38 +pias do software nos seus dispositivos para \hich\af38\dbch\af11\loch\f38 criar, desenvolver e testar os seus programas.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 REQUISITOS DE LICENCIAMENTO ADICIONAIS E OU DIREITOS DE UTILIZA\'c7\'c3\loch\f38 O.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 C\'f3\loch\f38 +\hich\f38 digo Distribu\'ed\loch\f38 vel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs57\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O software cont\'e9\loch\f38 \hich\f38 m c\'f3\loch\f38 \hich\f38 digo que o Adquirente poder\'e1\hich\af38\dbch\af11\loch\f38 + distribuir em programas desenvolvidos pelo mesmo, desde que observe os termos abaixo.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Direito de Utiliza +\'e7\'e3\loch\f38 \hich\f38 o e Distribui\'e7\'e3\loch\f38 o.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O c\'f3\loch\f38 \hich\f38 digo e os ficheiros de texto listados abaixo s\'e3\loch\f38 \hich\f38 o \'93\loch\f38 \hich\f38 C\'f3\loch\f38 +\hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel\'94.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 Ficheiros REDIST.TXT}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid6097773 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid6097773 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 O Adquirente pode copiar e \hich\af38\dbch\af11\loch\f38 \hich\f38 +distribuir o formato de c\'f3\loch\f38 \hich\f38 digo de objeto do c\'f3\loch\f38 digo listado nos ficheiros REDIST.TXT.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid2456459 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Distribui\'e7\'e3\loch\f38 o por Terceiros}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid3373800 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid3373800 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O Adquirente pode autorizar os distribuidores dos seus programas a c\'f3\loch\f38 pia e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid2456459 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 distribui\'e7\'e3\loch\f38 \hich\f38 +o de C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\hich\af38\dbch\af11\loch\f38 vel como fazendo parte desses programas.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Requisitos de Distribui\'e7\'e3\loch\f38 o.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Para qualquer C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel que o Adquirente distribua, ter\'e1\loch\f38 de}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 +adicionar uma funcionalidade principal significativa aos seus programas;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 no caso de C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\hich\af38\dbch\af11\loch\f38 \hich\f38 vel com a extens\'e3\loch\f38 \hich\f38 +o de nome de ficheiro .lib, distribuir apenas os resultados da execu\'e7\'e3\loch\f38 \hich\f38 o desse C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel atrav\'e9\loch\f38 s de um linker para o programa;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 distribuir C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel, inclu\'ed\loch\f38 \hich\f38 do num programa de configura\'e7\'e3 +\loch\f38 o, como parte desse programa de c\hich\af38\dbch\af11\loch\f38 \hich\f38 onfigura\'e7\'e3\loch\f38 \hich\f38 o sem modifica\'e7\'f5\loch\f38 es;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 requerer que os distribuidores e utilizadores finais externos concordem com os termos que o protegem, no m\'ed\loch\f38 +nimo, conforme previsto pelo presente contrato;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 apresentar a notifica\'e7\'e3\loch\f38 \hich\f38 o relativa a direitos de autor v\'e1\loch\f38 lida nos s\hich\af38\dbch\af11\loch\f38 +eus programas e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 indemnizar, defender e proteger a Microsoft de quaisquer queixas ou processos, incluindo os honor\'e1\loch\f38 \hich\f38 +rios dos advogados, relacionados com a distribui\'e7\'e3\loch\f38 \hich\f38 o ou utiliza\'e7\'e3\loch\f38 o dos seus programas.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Restri\'e7\'f5 +\loch\f38 \hich\f38 es \'e0\loch\f38 \hich\f38 Distribui\'e7\'e3\loch\f38 o.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs58\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O Adquirente n\'e3\loch\f38 o pode}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +alterar quaisquer notifica\'e7\'f5\loch\f38 \hich\f38 es relativas a direitos de autor, marcas registadas ou patentes que apare\'e7\loch\f38 \hich\f38 am no C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 vel;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 utilizar marcas registadas da Microsoft nos nomes de programas do Adquirente ou de uma forma que sugira que os programas s\'e3 +\hich\af38\dbch\af11\loch\f38 o provenientes ou aprovados pela Microsoft;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 distribuir C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel para executar numa plataforma que n\'e3\loch\f38 +o seja uma plataforma Windows;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 incluir o C\'f3\loch\f38 \hich\f38 digo Distribu\'ed\loch\f38 vel em programas maliciosos, enganadores ou ilegais; ou}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\lang2070\langfe1033\loch\af3\hich\af3\dbch\af13\langnp2070\langfenp1033\insrsid11828113\charrsid11677077 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 modificar\hich\af38\dbch\af13\loch\f38 \hich\f38 ou distribuir o c\'f3\loch\f38 \hich\f38 digo fonte de qualquer C\'f3\loch\f38 +\hich\f38 digo Distribu\'ed\loch\f38 \hich\f38 vel de modo que qualquer parte fique sujeita a uma Licen\'e7\loch\f38 \hich\f38 a Exclu\'ed\loch\f38 da.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Uma Licen\'e7\loch\f38 \hich\f38 a Exclu\'ed\loch\f38 \hich\f38 da \'e9\loch\f38 \hich\f38 uma licen\'e7\loch\f38 \hich\f38 a que requer, como condi\'e7\'e3\loch\f38 \hich\f38 o de utiliza\'e7\'e3\loch\f38 \hich\f38 o, modifica\'e7\'e3\loch\f38 +\hich\f38 o ou distribui\'e7\'e3\loch\f38 o, que}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 o c\'f3\loch\f38 +digo seja reve\hich\af38\dbch\af11\loch\f38 \hich\f38 lado ou distribu\'ed\loch\f38 \hich\f38 do no formato de c\'f3\loch\f38 digo fonte ou}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 terceiros tenham o direito de modific\'e1\loch\f38 -lo.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid6842898 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 PROGRAMAS E NOTIFICA +\'c7\'d5\loch\f38 ES DE TERCEIROS}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid2456459 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid6842898\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Outro c\'f3\loch\f38 \hich\f38 digo de terceiros inclu\'ed\loch\f38 +\hich\f38 do no software \'e9\loch\f38 licenciado ao Adquirente pela Mi\hich\af38\dbch\af11\loch\f38 \hich\f38 crosoft ao abrigo do presente contrato de licen\'e7\loch\f38 +a, em vez de ser licenciado ao Adquirente por terceiros ao abrigo de outros termos de licenciamento.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 As notifica\'e7\'f5\loch\f38 \hich\f38 es, se existirem, para o presente c\'f3\loch\f38 \hich\f38 digo de terceiros s +\'e3\loch\f38 \hich\f38 o inclu\'ed\loch\f38 das com o software, constando \hich\af38\dbch\af11\loch\f38 \hich\f38 tamb\'e9\loch\f38 m no ficheiro ThirdPartyNotices.txt.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11758563\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \loch\af38\dbch\af11\hich\f38 \'c2\loch\f38 \hich\f38 MBITO DA LICEN\'c7\loch\f38 A.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +O software \'e9\loch\f38 \hich\f38 licenciado e n\'e3\loch\f38 o vendido.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Este contrato concede apenas alguns direitos de utiliza\'e7\'e3\loch\f38 o do software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 +A Microsoft reserva-se todos os outros direitos.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Salvo se a legisla\'e7\'e3\hich\af38\dbch\af11\loch\f38 \hich\f38 o em vigor conferir mais direitos, n\'e3\loch\f38 \hich\f38 +o obstante esta limita\'e7\'e3\loch\f38 o, o Adquirente pode apenas utilizar o software conforme expressamente permitido no presente contrato.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Ao faz\'ea\loch\f38 \hich\f38 -lo, o Adquirente dever\'e1\loch\f38 +\hich\f38 respeitar quaisquer limita\'e7\'f5\loch\f38 \hich\f38 es t\'e9\loch\f38 cnicas no software que apen\hich\af38\dbch\af11\loch\f38 \hich\f38 as lhe permitem utiliz\'e1\loch\f38 -lo de determinadas formas.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +O Adquirente n\'e3\loch\f38 o pode}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +contornar quaisquer limita\'e7\'f5\loch\f38 \hich\f38 es t\'e9\loch\f38 cnicas no software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 proceder a engenharia inversa, descompila\'e7\'e3\loch\f38 \hich\f38 +o ou desassemblagem do software, exceto e apenas na medida em que a lei aplic\'e1\loch\f38 vel o\hich\af38\dbch\af11\loch\f38 \hich\f38 permita expressamente, n\'e3\loch\f38 \hich\f38 o obstante esta limita\'e7\'e3\loch\f38 o;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 efetuar mais c\'f3\loch\f38 \hich\f38 pias do software do que aquelas especificadas neste contrato ou permitidas pela lei aplic\'e1\loch\f38 +\hich\f38 vel, n\'e3\loch\f38 \hich\f38 o obstante esta limita\'e7\'e3\loch\f38 o;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 publicar o software para que outros o copiem;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 alugar, proc\hich\af38\dbch\af11\loch\f38 \hich\f38 eder a loca\'e7\'e3\loch\f38 \hich\f38 o financeira (\'93\loch\f38 \hich\f38 leasing\'94\loch\f38 +) ou emprestar o software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 transferir o software ou este contrato para quaisquer terceiros; ou}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Utilizar o software para servi\'e7\loch\f38 os de alojamento de software comercial.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 C\'d3\loch\f38 +\hich\f38 PIA DE SEGURAN\'c7\loch\f38 A.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 O Adquirente pode efetuar u\hich\af38\dbch\af11\loch\f38 \hich\f38 ma c\'f3\loch\f38 \hich\f38 pia de seguran\'e7\loch\f38 a do software.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Esta s\'f3\loch\f38 deve ser utilizada para reinstalar o software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 DOCUMENTA\'c7\'c3\loch\f38 O.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Qualquer pessoa com acesso v\'e1\loch\f38 \hich\f38 +lido ao computador ou \'e0\loch\f38 \hich\f38 rede interna do Adquirente pode copiar e utilizar a documenta\'e7\'e3\loch\f38 \hich\f38 o para fins de refer\'ea\loch\f38 ncia interna.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 TRANSFER\'ca\loch\f38 NCIA PARA OUTRO DISPOSITIVO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +O Adquirente pode desinstalar o software e instal\'e1\loch\f38 \hich\f38 -lo noutro dispositivo para sua utiliza\'e7\'e3\loch\f38 o.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 N\'e3\loch\f38 \hich\f38 +o pode proceder deste modo para partilhar esta licen\'e7\loch\f38 a entre dispositivos.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid13064779 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 RESTRI\'c7\'d5\loch\f38 \hich\f38 ES \'c0\loch\f38 \hich\f38 EXPORTA\'c7\'c3\loch\f38 O.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 +O software est\loch\af38\dbch\af11\hich\f38 \'e1\loch\f38 \hich\f38 sujeito \'e0\loch\f38 \hich\f38 s leis e normas de exporta\'e7\'e3\loch\f38 o dos Estados Unidos.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Ter +\'e1\loch\f38 \hich\f38 de cumprir com todas as leis e normas de exporta\'e7\'e3\loch\f38 o locais e internacionais que se apliquem ao software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Estas leis incluem restri\'e7\'f5\loch\f38 \hich\f38 +es relativas aos destinos, utilizadores finais e utiliza\'e7\'e3\hich\af38\dbch\af11\loch\f38 o final.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Para obter informa\'e7\'f5\loch\f38 es adicionais, consulte }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs73\b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid15928761 \hich\af38\dbch\af11\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 \hich\f38 (em ingl\'ea\loch\f38 s).}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang2070\langfe1033\loch\af38\hich\af38\dbch\af13\langnp2070\langfenp1033\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 SERVI\'c7\loch\f38 \hich\f38 OS DE SUPORTE T\'c9\loch\f38 CNICO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Uma vez que este software \'e9\loch\f38 \hich\f38 fornecido \'93\loch\f38 \hich\f38 tal como est\'e1\'94\loch\f38 \hich\f38 , a Microsoft poder\'e1\loch\f38 \hich\f38 n\'e3\loch\f38 \hich\f38 o fornecer suporte t\'e9\loch\f38 cnico.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 CONTRATO INTEGRAL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 O p\hich\af38\dbch\af11\loch\f38 \hich\f38 +resente contrato e os termos para os suplementos, atualiza\'e7\'f5\loch\f38 \hich\f38 es, servi\'e7\loch\f38 \hich\f38 os baseados na Internet e suporte t\'e9\loch\f38 \hich\f38 +cnico que o Adquirente utilize, constituem o contrato integral para o software e suporte t\'e9\loch\f38 cnico.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 LEI APLIC\'c1\loch\f38 VEL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 Estados Unidos.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 Caso o Adquire\hich\af38\dbch\af11\loch\f38 \hich\f38 nte tenha adquirido o software nos Estados Unidos, as leis do estado de Washington regulam a interpreta\'e7\'e3\loch\f38 \hich\f38 o do presente contrato e aplicam-se \'e0 +\loch\f38 \hich\f38 s a\'e7\'f5\loch\f38 \hich\f38 es por viola\'e7\'f5\loch\f38 \hich\f38 es do mesmo, independentemente dos conflitos de princ\'ed\loch\f38 pios de leis.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 +As leis que vigoram no esta\hich\af38\dbch\af11\loch\f38 \hich\f38 do onde o Adquirente reside regulam todas as outras a\'e7\'f5\loch\f38 \hich\f38 es, incluindo as a\'e7\'f5\loch\f38 \hich\f38 es ao abrigo da legisla\'e7\'e3\loch\f38 \hich\f38 o de prote +\'e7\'e3\loch\f38 \hich\f38 o do consumidor do Estado, legisla\'e7\'e3\loch\f38 \hich\f38 o de concorr\'ea\loch\f38 \hich\f38 ncia desleal e ato il\'ed\loch\f38 cito.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 Fora dos Estados Unidos.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 Se o software tiver sido adquirido nout\hich\af38\dbch\af11\loch\f38 \hich\f38 +ro pa\'ed\loch\f38 \hich\f38 s, aplicam-se as leis desse pa\'ed\loch\f38 s.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid5640834 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 EFEITO LEGAL.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 Este contrato descreve determinados direitos legais.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O Adquirente poder\'e1\loch\f38 \hich\f38 ter outros direitos ao abrigo das leis do seu pa\'ed\loch\f38 s.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 \hich\f38 Tamb\'e9\loch\f38 \hich\f38 m poder\'e1\loch\f38 \hich\f38 ter direitos relativamente \'e0\hich\af38\dbch\af11\loch\f38 entidade a partir da qual foi adquirido o}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\lang2070\langfe1033\langnp2070\insrsid5640834 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +O presente contrato n\'e3\loch\f38 \hich\f38 o altera os direitos do Adquirente ao abrigo das leis do seu pa\'ed\loch\f38 \hich\f38 s se estas n\'e3\loch\f38 o o}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid5640834 +\~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 permitirem.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang2070\langfe1033\loch\af38\hich\af38\dbch\af13\langnp2070\langfenp1033\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid5640834 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 EXCLUS\'c3\loch\f38 O DE GARANTIAS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 +\hich\af38\dbch\af13\loch\f38 \hich\f38 O SOFTWARE \'c9\loch\f38 \hich\f38 LICENCIADO \'93\loch\f38 \hich\f38 TAL COMO EST\'c1\'94\loch\f38 \hich\f38 . O ADQUIRENTE \'c9}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid5640834 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 RESPO\hich\af38\dbch\af13\loch\f38 +\hich\f38 NS\'c1\loch\f38 \hich\f38 VEL PELA UTILIZA\'c7\'c3\loch\f38 O DO MESMO.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 A MICROSOFT N\'c3\loch\f38 O CONCEDE OUTRAS GARANTIAS OU}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid5640834 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 CONDI\'c7\'d5\loch\f38 +ES EXPRESSAS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O ADQUIRENTE PODER\'c1\loch\f38 \hich\f38 + TER DIREITOS DE CONSUMIDOR ADICIONAIS OU GARANTIAS LEGAIS DE ACORDO COM AS LEIS LOCAIS E QUE O PRESENTE CONTRATO N\'c3\loch\f38 O TEM AUTORIDADE PARA A\hich\af38\dbch\af11\loch\f38 LTERAR.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 AT\'c9 +\loch\f38 \hich\f38 \'c0\loch\f38 \hich\f38 EXTENS\'c3\loch\f38 \hich\f38 O M\'c1\loch\f38 \hich\f38 XIMA PERMITIDA PELA LEGISLA\'c7\'c3\loch\f38 O LOCAL, A}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid5640834 \~}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 MICROSOFT EXCLUI AS GARANTIAS IMPL\'cd\loch\f38 \hich\f38 CITAS DE COMERCIALIZA\'c7\'c3\loch\f38 \hich\f38 +O, ADEQUA\'c7\'c3\loch\f38 \hich\f38 O A UM FIM ESPEC\'cd\loch\f38 \hich\f38 FICO E N\'c3\loch\f38 \hich\f38 O VIOLA\'c7\'c3\loch\f38 O DE DIREITOS DE AUTOR.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 PARA A AUSTR\'c1 +\loch\f38 LIA \hich\f38 \endash \loch\f38 \hich\f38 AO ABRIGO DA LEI PARA CONSUMIDORES DA AUSTR\'c1\hich\af38\dbch\af11\loch\f38 \hich\f38 LIA, O ADQUIRENTE DISP\'d5\loch\f38 \hich\f38 E DE GARANTIAS LEGAIS E NENHUMA DAS DISPOSI\'c7\'d5\loch\f38 +ES NOS PRESENTES TERMOS SE DESTINA A AFETAR ESSES DIREITOS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid5640834 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 LIMITA\'c7\'c3 +\loch\f38 \hich\f38 O E EXCLUS\'c3\loch\f38 O DE RESSARCIMENTOS E DANOS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 A MICROSOFT E RESPETIVOS FORNECEDORES RESSARCIR\'c3\loch\f38 O \hich\af38\dbch\af11\loch\f38 \hich\f38 O ADQUIRENTE APENAS POR DANOS DIRETOS E AT +\'c9\loch\f38 AO MONTANTE DE}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid5640834 \~}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 \hich\f38 5 D\'d3\loch\f38 LARES ($ 5,00).}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 O ADQUIRENTE N\'c3\loch\f38 \hich\f38 O PODER\'c1\loch\f38 \hich\f38 SER RESSARCIDO POR QUAISQUER OUTROS DANOS, INCLUINDO PREJU\'cd\loch\f38 +\hich\f38 ZOS CONSEQUENTES, LUCROS PERDIDOS, PREJU\'cd\loch\f38 \hich\f38 ZOS EXTRAORDIN\'c1\loch\f38 RIOS, DANOS INDIRETOS OU INCIDENTAIS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 Esta limita\'e7\'e3 +\loch\f38 o aplica-se a}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 +qualquer assunto relacionado com o software, servi\'e7\loch\f38 \hich\f38 os, conte\'fa\loch\f38 \hich\f38 do (incluindo o c\'f3\loch\f38 digo) em sites da Internet de terceiros ou programas de terceiros; e}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang2070\langfe1033\langnp2070\langfenp1033\insrsid13064779\charrsid11677077 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 queixas por viola\'e7\'e3\loch\f38 \hich\f38 o do contrato, viola\'e7\'e3\loch\f38 \hich\f38 o da garantia ou condi\'e7\'e3\loch\f38 o, responsab +\hich\af38\dbch\af11\loch\f38 \hich\f38 ilidade objetiva, neglig\'ea\loch\f38 \hich\f38 ncia ou outro ato il\'ed\loch\f38 \hich\f38 cito at\'e9\loch\f38 \hich\f38 \'e0\loch\f38 \hich\f38 extens\'e3\loch\f38 \hich\f38 o permitida pela lei aplic\'e1 +\loch\f38 vel.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\dbch\af13\langnp2070\insrsid11828113\charrsid11677077 \hich\af38\dbch\af13\loch\f38 \hich\f38 +Aplica-se igualmente se a Microsoft teve ou devia ter tido conhecimento da possibilidade de ocorr\'ea\loch\f38 ncia de tais danos.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\langnp1046\insrsid13064779\charrsid11677077 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang2070\langfe1033\langnp2070\insrsid13064779\charrsid11677077 \hich\af38\dbch\af11\loch\f38 \hich\f38 A limita\'e7\'e3\loch\f38 \hich\f38 o ou exclus\'e3\loch\f38 +o supra mencionada p\hich\af38\dbch\af11\loch\f38 \hich\f38 oder\'e1\loch\f38 \hich\f38 tamb\'e9\loch\f38 \hich\f38 m n\'e3\loch\f38 \hich\f38 o se aplicar ao Adquirente, por o pa\'ed\loch\f38 \hich\f38 s em que reside n\'e3\loch\f38 \hich\f38 +o permitir a exclus\'e3\loch\f38 \hich\f38 o ou limita\'e7\'e3\loch\f38 o de danos incidentais, consequentes ou outros.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1046\langfe1033\dbch\af13\langnp1046\insrsid4684770\charrsid11677077 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000040f8 +3757aab8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.RUS.rtf b/setup/resources/eula/VF_EULA.RUS.rtf new file mode 100644 index 00000000000..3264a07b089 --- /dev/null +++ b/setup/resources/eula/VF_EULA.RUS.rtf @@ -0,0 +1,949 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Times};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ???\'a1\'ec??};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};} +{\f44\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}{\f60\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Arial Unicode MS};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ???\'a1\'ec??};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ???\'a1\'ec??};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f442\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\f443\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f445\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f446\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\f447\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f448\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f449\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\f450\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f462\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f463\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};} +{\f465\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f466\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f467\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};} +{\f468\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f469\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f470\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};} +{\f554\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f552\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f553\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} +{\f555\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f556\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f559\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} +{\f574\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ???\'a1\'ec??};}{\f782\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f783\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};} +{\f785\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f786\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f789\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};} +{\f822\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}{\f823\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f825\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};} +{\f826\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}{\f827\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f828\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};} +{\f829\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}{\f830\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f831\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};} +{\f834\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f832\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f833\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f835\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f836\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f839\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f882\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}{\f883\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f885\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};} +{\f886\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}{\f889\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f1044\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Arial Unicode MS};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ???\'a1\'ec??};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ???\'a1\'ec??};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink106 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af44 \ltrch\fcs0 \b\f44\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink108 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f44\hich\af44\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f44\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive +\f2\cf15\lang1024\langfe1024\noproof LogoportDoNotTranslate;}{\*\cs96 \additive \b\f38 Preamble Char;}{\*\cs97 \additive \f2\fs40\cf4 tw4winError;}{\*\cs98 \additive \cf2 tw4winTerm;}{\*\cs99 \additive \f2\cf11\lang1024\langfe1024\noproof LogoportPopup;} +{\*\cs100 \additive \f2\cf10\lang1024\langfe1024\noproof LogoportJump;}{\*\cs101 \additive \f2\cf6\lang1024\langfe1024\noproof LogoportMarkup;}{\*\cs102 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s103\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext103 \slink104 Body Text 2;}{\*\cs104 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink103 \slocked Body Text 2 Char;}{\s105\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon49 \snext105 \slink107 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs106 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs107 \additive \rtlch\fcs1 +\ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 \sbasedon106 \slink105 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs108 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s109\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext109 \slink110 LIMPA_T4WINEXTERNAL;}{\*\cs110 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink109 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 +\b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\f44\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 +\b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af44\afs20 \ltrch\fcs0 \b\i0\f44\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\strike0\f44\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af44\afs20 \ltrch\fcs0 \b0\i0\f44\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid856736\rsid1048756\rsid1314881\rsid1973927\rsid2188875\rsid2497649\rsid2504352\rsid3755635\rsid4206697\rsid4684770\rsid5519702\rsid5835432\rsid5858028\rsid6766043\rsid7471242\rsid8470505\rsid8988678\rsid9196108\rsid9250398 +\rsid11090679\rsid11758563\rsid11828113\rsid12799225\rsid13191708\rsid14356214\rsid14367754\rsid14375208\rsid14446677\rsid14956750\rsid15019201\rsid15493226\rsid15548830\rsid15612533\rsid16018221\rsid16280961\rsid16604151}{\mmathPr\mmathFont34\mbrkBin0 +\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo9\dy24\hr3\min57}{\version1}{\edmins0}{\nofpages3}{\nofwords1473}{\nofchars8397} +{\nofcharsws9851}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1314881 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1314881 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1314881 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1314881 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid856736 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid856736 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid856736 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid856736 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid856736 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid856736 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'df\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5\'cd\'c7\'c8\'c8\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'cf\'d0\'ce\'c3\'d0\'c0\'cc\'cc\'cd\'ce\'c5\loch\f823 \hich\f823 \'ce\'c1\'c5\'d1 +\'cf\'c5\'d7\'c5\'cd\'c8\'c5\loch\f823 MICROSOFT}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid15612533\charrsid14956750 \hich\af38\dbch\af11\loch\f38 MICROSOFT VISUAL F#}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 + +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8988678 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af823\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 +\loch\af823\dbch\af13\hich\f823 \'cd\'e0\'f1\'f2\'ee\'ff\'f9\'e8\'e5\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\loch\af823\dbch\af13\hich\f823 \'e7\'e8\'e8\loch\f823 \hich\f823 \'ff\'e2\'eb\'ff\'fe\'f2 +\'f1\'ff\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'ec\'e5\'e6\'e4\'f3\loch\f823 \hich\f823 \'ea\'ee\'f0\'ef\'ee\'f0\'e0\'f6\'e8\'e5\'e9\loch\f823 \hich\f823 Microsoft (\'e8\'eb\'e8\loch\f823 \hich\f823 , +\'e2\loch\f823 \hich\f823 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8\loch\f823 \hich\f823 \'ee\'f2\loch\f823 \hich\f823 \'ec\'e5\'f1\'f2\'e0\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'e3\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e6\'e8\'e2\'e0\'ed\'e8\'ff +\loch\f823 \hich\f823 , \'ee\'e4\'ed\'e8\'ec\loch\f823 \hich\f823 \'e8\'e7\loch\f823 \hich\f823 \'e5\'e5\loch\f823 \hich\f823 \'e0\'f4\'f4\'e8\'eb\'e8\'f0\'ee\'e2\'e0\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'eb\'e8\'f6\loch\f823 \hich\f823 ) \'e8 +\loch\f823 \hich\f823 \'e2\'e0\'ec\'e8\loch\f823 \hich\f823 . \'cf\'f0\'ee\'f7\'f2\'e8\'f2\'e5\loch\f823 \hich\f823 \'e8\'f5\loch\f823 \hich\f823 \'e2\'ed\'e8\'ec\'e0\'f2\'e5\'eb\'fc\'ed\'ee\loch\f823 \hich\f823 . \'ce\'ed\'e8\loch\f823 \hich\f823 +\'ef\'f0\'e8\'ec\'e5\'ed\'ff\'fe\'f2\'f1\'ff\loch\f823 \hich\f823 \'ea}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8988678 \~}{\rtlch\fcs1 \ab0\af823\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'e2\'fb\'f8\'e5\'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'ec\'f3\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed +\'ee\'ec\'f3\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'fe\loch\f823 \hich\f823 , \'e2\'ea\'eb\'fe\'f7\'e0\'ff\loch\f823 \hich\f823 \'ed\'ee\'f1\'e8\'f2\'e5\'eb\'e8\loch\f823 \hich\f823 , \'ed\'e0\loch\f823 \hich\f823 \'ea\'ee\'f2 +\'ee\'f0\'fb\'f5\loch\f823 \hich\f823 \'ee\'ed\loch\af823\dbch\af13\hich\f823 \'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 (\'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'ee\'ed\'e8 +\loch\f823 \hich\f823 \'e5\'f1\'f2\'fc\loch\f823 ).}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd\'f2\'e8\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'fe\'f2\'f1 +\'ff\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e2\'f1\'e5}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid9250398 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ee\'e1\'ed\'ee\'e2\'eb +\'e5\'ed\'e8\'ff,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e4\'ee\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\'ed\'fb\'e5\loch\f823 \hich\f823 \'ea\'ee\'ec\'ef\'ee\'ed\'e5\'ed\'f2\'fb,}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f1\'eb\'f3\'e6\'e1\'fb\loch\f823 \hich\f823 \'c8\'ed\'f2\'e5\'f0\'ed\'e5\'f2\'e0,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f1\'eb\'f3\'e6\'e1\'fb\loch\f823 \hich\f823 \'f2\'e5\'f5\'ed\'e8\'f7\'e5\'f1\'ea\'ee\'e9\loch\f823 \hich\f823 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'ea +\'e8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8470505 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af823\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 +\hich\af823\dbch\af13\loch\f823 \hich\f823 Microsoft \'e4\'eb\'ff\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff +\loch\f823 \hich\f823 , \'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'fd\'f2\'e8\loch\f823 \hich\f823 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'fb\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'f1\'ee\'ef\'f0\'ee\'e2\'ee\'e6\'e4\'e0\'fe\'f2\'f1\'ff\loch\f823 +\loch\af823\dbch\af13\hich\f823 \'e4\'f0\'f3\'e3\'e8\'ec\'e8\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\'ec\'e8.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\insrsid8470505 \~}{ +\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'ec\loch\f823 \hich\f823 \'f1\'eb\'f3\'f7\'e0\'e5\loch\f823 \hich\f823 +\'ef\'f0\'e8\'ec\'e5\'ed\'ff\'fe\'f2\'f1\'ff\loch\f823 \hich\f823 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e5\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'c8\'d1\'cf\'ce\'cb\'dc\'c7\'d3\'df\loch\f823 \hich\f823 \'dd\'d2\'ce\loch\f823 \hich\f823 \'cf\'d0\'ce\'c3\'d0\'c0 +\'cc\'cc\'cd\'ce\'c5\loch\f823 \hich\f823 \'ce\'c1\'c5\'d1\'cf\'c5\'d7\'c5\'cd\'c8\'c5\loch\f823 \hich\f823 , \'d2\'c5\'cc\loch\f823 \hich\f823 \'d1\'c0\'cc\'db\'cc\loch\f823 \hich\f823 \'c2\'db\loch\f823 \hich\f823 \'cf\'ce\'c4\'d2\'c2\'c5\'d0\'c6 +\'c4\'c0\'c5\'d2\'c5\loch\f823 \hich\f823 \'d1\'c2\'ce\'c5\loch\f823 \hich\f823 \'d1\'ce\'c3\'cb\'c0\'d1\'c8\'c5\loch\f823 \hich\f823 \'d1\'ce\'c1\'cb\'de\'c4\'c0\'d2\'dc\loch\f823 \hich\f823 \'c4\'c0\'cd\'cd\'db\'c5\loch\f823 \hich\f823 \'d3\'d1\'cb +\'ce\'c2\'c8\'df.}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af823\dbch\af11\loch\f823 \hich\f823 \'c5\'d1\'cb\'c8\loch\f823 \hich\f823 \'c2\'db\loch\f823 \hich\f823 \'cd\'c5 +\loch\f823 \hich\f823 \'d1\'ce\'c3\'cb\'c0\'d1\'cd\'db\loch\f823 \hich\f823 \'d1\loch\f823 \hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'df\'cc\'c8\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5\'cd\'c7\'c8\'c8\loch\f823 \hich\f823 , \'cd\'c5\loch\f823 \hich\f823 \'c8 +\'d1\'cf\'ce\'cb\'dc\'c7\'d3\'c9\'d2\'c5\loch\f823 \hich\f823 \'dd\'d2\'ce\loch\f823 \hich\f823 \'cf\'d0\'ce\'c3\'d0\'c0\'cc\'cc\'cd\'ce\'c5\loch\f823 \hich\f823 \'ce\'c1\loch\af823\dbch\af11\hich\f823 \'c5\'d1\'cf\'c5\'d7\'c5\'cd\'c8\'c5.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid15612533\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c5\'d1\'cb\'c8 +\loch\f823 \hich\f823 \'c2\'db\loch\f823 \hich\f823 \'c2\'db\'cf\'ce\'cb\'cd\'df\'c5\'d2\'c5\loch\f823 \hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'df\loch\f823 \hich\f823 \'c4\'c0\'cd\'cd\'ce\'c9\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5\'cd\'c7\'c8\'c8 +\loch\f823 \hich\f823 , \'c2\'c0\'cc\loch\f823 \hich\f823 \'cf\'d0\'c5\'c4\'ce\'d1\'d2\'c0\'c2\'cb\'df\'de\'d2\'d1\'df\loch\f823 \hich\f823 \'d3\'ca\'c0\'c7\'c0\'cd\'cd\'db\'c5\loch\f823 \hich\f823 \'cd\'c8\'c6\'c5\loch\f823 \hich\f823 \'c1\'c5\'d1 +\'d1\'d0\'ce\'d7\'cd\'db\'c5\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\'c0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1049\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1049\langfenp1033\insrsid11828113\charrsid14956750 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15612533 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 +\loch\af823\dbch\af13\hich\f823 \'cf\'d0\'c0\'c2\'c0\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'d3\'d1\'d2\'c0\'cd\'ce\'c2\'ca\'d3\loch\f823 \hich\f823 \'c8\loch\f823 \hich\f823 \'c8\'d1\'cf\'ce\'cb\'dc\'c7\'ce\'c2\'c0\'cd\'c8\'c5.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid15612533\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\loch\f823 \hich\f823 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'e8\'f1\'ef +\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'f1\'e2\'ee\'e8\'f5\loch\f823 \hich\f823 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\'f5\loch\f823 \hich\f823 \'eb\'fe\'e1\'ee\'e5\loch\f823 \hich\f823 \'f7\'e8\'f1 +\'eb\'ee\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'e9\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 (\'e2\loch\f823 +\loch\af823\dbch\af11\hich\f823 \'f6\'e5\'eb\'ff\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e5\'ea\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff\loch\f823 \hich\f823 , \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'ea\'e8\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f2\'e5 +\'f1\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff\loch\f823 \hich\f823 \'f1\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\loch\f823 ).}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 2.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c4\'ce\'cf\'ce\'cb\'cd\'c8\'d2\'c5\'cb\'dc\'cd\'db\'c5\loch\f823 \hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'df\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5 +\'cd\'c7\'c8\'c8\loch\f823 \hich\f823 \'c8\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\'c0\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'c8\'d1\'cf\'ce\'cb\'dc\'c7\'ce\'c2\'c0\'cd\'c8\'c5.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'f2\'ee\'f0\'e8 +\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\cs57\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'f1 +\'ee\'e4\'e5\'f0\'e6\'e8\'f2\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 , \'ea\'ee\'f2\'ee\'f0\'fb\'e9\loch\f823 \hich\f823 \'f0\'e0\'e7\'f0\'e5\'f8\'e0\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff +\'f2\'fc\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'ee\'f1\'f2\'e0\'e2\'e5\loch\f823 \hich\f823 \'f0\'e0\'e7\'f0\'e0\'e1\'e0\loch\af823\dbch\af11\hich\f823 \'f2\'fb\'e2\'e0\'e5\'ec\'fb\'f5\loch\f823 \hich\f823 \'e2\'e0\'ec\'e8\loch\f823 +\hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\loch\f823 \hich\f823 \'ef\'f0\'e8\loch\f823 \hich\f823 \'f1\'ee\'e1\'eb\'fe\'e4\'e5\'ed\'e8\'e8\loch\f823 \hich\f823 \'e2\'e0\'ec\'e8\loch\f823 \hich\f823 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'f5\loch\f823 +\hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'e9.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 i.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'f0\'e0\'e2\'ee +\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5\loch\f823 . }{\rtlch\fcs1 +\af823\afs20 \ltrch\fcs0 \cs58\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 \'e8\loch\f823 +\hich\f823 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e5\loch\f823 \hich\f823 \'f4\'e0\'e9\'eb\'fb\loch\f823 \hich\f823 , \'ef\'e5\'f0\'e5\'f7\'e8\'f1\'eb\'e5\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 \'ed\'e8\'e6\'e5\loch\f823 \hich\f823 , \'ef\'f0\'e5\'e4\'f1\'f2 +\'e0\'e2\'eb\'ff\'fe\'f2\loch\f823 \hich\f823 \'f1\'ee\'e1\'ee\'e9\loch\f823 \hich\f823 \'ab\'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\'bb.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 + +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d4\'e0\'e9\'eb\'fb +\loch\f823 REDIST.TXT}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\ulnone\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid9250398 \hich\af823\dbch\af11\loch\f823 \hich\f823 . \'c2}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\ulnone\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'fb\loch\f823 \hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'f0 +\loch\af823\dbch\af11\hich\f823 \'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 , \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e9 +\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f4\'e0\'e9\'eb\'e0\'f5\loch\f823 \hich\f823 REDIST.TXT, \'e2\loch\f823 \hich\f823 \'e2\'e8\'e4\'e5\loch\f823 \hich\f823 \'ee\'e1\'fa\'e5\'ea\'f2\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0. +}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'f2\'f0\'e5\'f2\'fc\'e8\'ec\loch\f823 \hich\f823 \'eb\'e8\'f6 +\'e0\'ec}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid15493226 \hich\af38\dbch\af11\loch\f38 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\ulnone\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'ec\'ee\'e6\'e5\'f2\'e5\loch\f823 \hich\f823 \'f0\'e0\'e7\'f0\'e5\'f8\'e8\'f2\'fc\loch\f823 \hich\f823 \'e4 +\'e8\'f1\'f2\'f0\'e8\'e1\'fc\'fe\'f2\'ee\'f0\'e0\'ec\loch\f823 \hich\f823 \'e2\'e0\'f8\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e8\loch\f823 +\hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4 +\loch\f823 \hich\f823 \'ea\'e0\'ea\loch\f823 \hich\f823 \'f7\'e0\'f1\'f2\'fc\loch\f823 \hich\f823 \'fd\'f2\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\ulnone\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 ii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d3\'f1\'eb +\loch\af823\dbch\af11\hich\f823 \'ee\'e2\'e8\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\cs58\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c4\'eb\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'eb\'fe\'e1\'ee\'e3\'ee +\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'ee\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 \hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'e4\'ee\'eb\'e6 +\'ed\'fb\loch\f823 :}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f1\'f3\'f9\'e5\'f1\'f2 +\'e2\'e5\'ed\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'f8\'e8\'f0\'e8\'f2\'fc\loch\f823 \hich\f823 \'ee\'f1\'ed\'ee\'e2\'ed\'fb\'e5\loch\f823 \hich\f823 \'f4\'f3\'ed\'ea\'f6\'e8\'ee\'ed\'e0\'eb\'fc\'ed\'fb\'e5\loch\f823 \hich\f823 \'e2\'ee\'e7\'ec +\'ee\'e6\'ed\'ee\'f1\'f2\'e8\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'e2\'ee\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0\'f5\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'eb\'fe\'e1\'ee\'e3\'ee\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1 +\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'ee\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 LIB \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0 +\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'f2\loch\af823\dbch\af11\hich\f823 \'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'fb\loch\f823 \hich\f823 \'e7\'e0\'ef\'f3\'f1\'ea\'e0\loch\f823 \hich\f823 \'f2\'e0\'ea\'ee +\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 \hich\f823 \'ef\'ee\'f1\'f0\'e5\'e4\'f1\'f2\'e2\'ee\'ec\loch\f823 \hich\f823 \'ea\'ee\'ec\'ef\'ee\'ed\'ee\'e2\'f9\'e8\'ea\'e0\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ef\'ee\'ec\'ee\'f9 +\'fc\'fe\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'e9\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1 +\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 , \'e2\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'fb\'e9\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3\loch\f823 +\hich\f823 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e8\loch\f823 \hich\f823 , \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'ea\'e0\'ea\loch\f823 \hich\f823 \'f7\'e0\'f1\'f2\'fc\loch\f823 \hich\f823 \'fd\'f2\'ee\'e9\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3 +\'f0\'e0\'ec\'ec\'fb\loch\f823 \hich\f823 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e8\loch\f823 \hich\f823 \'e1\'e5\'e7\loch\f823 \hich\f823 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e9\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'ee\'f2\'f0\'e5\'e1\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ee\'f2\loch\f823 \hich\f823 \'e4\'e8\'f1\'f2\'f0\'e8\'e1\'fc\'fe\'f2\'ee +\loch\af823\dbch\af11\hich\f823 \'f0\'ee\'e2\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'e2\'ed\'e5\'f8\'ed\'e8\'f5\loch\f823 \hich\f823 \'ea\'ee\'ed\'e5\'f7\'ed\'fb\'f5\loch\f823 \hich\f823 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'e5\'e9 +\loch\f823 \hich\f823 \'f1\'ee\'e1\'eb\'fe\'e4\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'e9\loch\f823 \hich\f823 , \'ea\'ee\'f2\'ee\'f0\'fb\'e5\loch\f823 \hich\f823 \'e1\'f3\'e4\'f3\'f2\loch\f823 \hich\f823 \'e7\'e0\'f9\'e8\'f9 +\'e0\'f2\'fc\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'ec\'e5\'ed +\'fc\'f8\'e5\loch\f823 \hich\f823 , \'f7\'e5\'ec\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e5\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 ; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ee\'f2\'ee\'e1\'f0\'e0\'e6\'e0\'f2\'fc\loch\f823 \hich\f823 \'e4\'e5\'e9\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'e5\loch\f823 \hich\f823 \'f3 +\'e2\'e5\'e4\'ee\'ec\'eb\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ee\'e1\loch\f823 \hich\f823 \'e0\'e2\'f2\'ee\'f0\'f1\'ea\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\'f5\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'e2\'e0\'f8\'e8\'f5 +\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0\'f5\loch\f823 \hich\f823 ; \'e8}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ee\'f1\'e2\'ee\'e1\'ee\'e4\'e8\'f2\'fc\loch\f823 \hich\f823 \'ee\'f2\loch\f823 \hich\f823 \'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e5\'ed\'ed\'ee\'f1 +\loch\af823\dbch\af11\hich\f823 \'f2\'e8\loch\f823 \hich\f823 , \'e7\'e0\'f9\'e8\'f2\'e8\'f2\'fc\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'e4\'e8\'f2\'fc\loch\f823 \hich\f823 Microsoft \'ee\'f2\loch\f823 \hich\f823 \'eb\'fe\'e1 +\'fb\'f5\loch\f823 \hich\f823 \'ef\'f0\'e5\'f2\'e5\'ed\'e7\'e8\'e9\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'e8\'f1\'ea\'ee\'e2\loch\f823 \hich\f823 , \'f1\'e2\'ff\'e7\'e0\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'e8\'f1 +\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'e2\'e0\'f8\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0 +\'ec\'ec\loch\f823 \hich\f823 , \'e2\'ea\'eb\'fe\'f7\'e0\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'f5\'ee\'e4\'fb\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'ee\'ef\'eb\'e0\'f2\'f3\loch\f823 \hich\f823 \'f3\'f1\'eb\'f3\'e3\loch\f823 \hich\f823 +\'e0\'e4\'e2\'ee\'ea\'e0\'f2\'ee\'e2.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 iii.\tab}}\pard\plain \ltrpar +\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ce\'e3\'f0\'e0\'ed +\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \cs58\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\loch\f823 :}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e8\'e7\'ec\'e5\'ed\'ff +\'f2\'fc\loch\f823 \hich\f823 \'f3\'e2\'e5\'e4\'ee\'ec\'eb\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'ee\'e1\loch\f823 \hich\f823 \'e0\'e2\'f2\'ee\'f0\'f1\'ea\'e8\'f5\hich\af823\dbch\af11\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\'f5\loch\f823 \hich\f823 +, \'ef\'e0\'f2\'e5\'ed\'f2\'ed\'fb\'f5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\'f5\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\'f5\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'f2\'ee\'e2\'e0\'f0\'ed\'fb\'e5 +\loch\f823 \hich\f823 \'e7\'ed\'e0\'ea\'e8\loch\f823 \hich\f823 , \'ef\'f0\'e8\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e5\loch\f823 \hich\f823 \'e2\'ee\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0 +\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'ee\'ec\loch\f823 \hich\f823 \'ea\'ee\'e4\'e5\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'f2\'ee\'e2\'e0\'f0\'ed\'fb\'e5\loch\f823 \hich\f823 \'e7\'ed\'e0\'ea\'e8 +\loch\f823 \hich\f823 \'cc\'e0\'e9\'ea\'f0\'ee\'f1\'ee\'f4\'f2\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ed\'e0\'e7\'e2\'e0\'ed\'e8\'ff\'f5\loch\f823 \hich\f823 \'f1\'e2\'ee\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec +\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'f2\'e0\'ea\'e8\'ec\loch\f823 \hich\f823 \'f1\'ef\'ee\'f1\'ee\'e1\'ee\'ec\loch\f823 \hich\f823 , \'ea\'ee\'f2\'ee\'f0\'fb\'e9\loch\f823 \hich\f823 \'e7\'e0\'f1\'f2\'e0\'e2\'e8\'eb\loch\f823 +\hich\f823 \'e1\'fb\loch\f823 \hich\f823 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff\loch\f823 \hich\f823 \'ef\'f0\'e5\'e4\'ef\'ee\'eb\'ee\'e6\'e8\'f2\'fc\loch\f823 \hich\f823 , \'f7\'f2\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec +\'e0\loch\f823 \hich\f823 \'ff\'e2\'eb\loch\af823\dbch\af11\hich\f823 \'ff\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 \'ef\'f0\'ee\'e4\'f3\'ea\'f2\'ee\'ec\loch\f823 \hich\f823 \'cc\'e0\'e9\'ea\'f0\'ee\'f1\'ee\'f4\'f2\loch\f823 \hich\f823 \'e8\'eb\'e8 +\loch\f823 \hich\f823 \'ee\'e4\'ee\'e1\'f0\'e5\'ed\'e0\loch\f823 \hich\f823 \'e5\'fe\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1 +\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'ff\loch\f823 \hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 +\'ed\'e0\loch\f823 \hich\f823 \'ef\'eb\'e0\'f2\'f4\'ee\'f0\'ec\'e5\loch\f823 \hich\f823 , \'ee\'f2\'eb\'e8\'f7\'ed\'ee\'e9\loch\f823 \hich\f823 \'ee\'f2\loch\f823 Windows;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\cf17\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid16018221 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e2\'ea\'eb\'fe\'f7\'e0\'f2\'fc\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0 +\'e0\'ed\'ff\'e5\'ec\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 \'e2\'ee\loch\f823 \hich\f823 \'e2\'f0\'e5\'e4\'ee\'ed\'ee\'f1\'ed\'fb\'e5\loch\f823 \hich\f823 , \'ed\'e5\'e7\'e0\'ea\'ee\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 \'e8 +\'eb\'e8\loch\f823 \hich\f823 \'e2\'e2\'ee\'e4\'ff\'f9\'e8\'e5\loch\f823 \hich\f823 \'e2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid16018221 \~}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e7\'e0\'e1\'eb\'f3\'e6\'e4\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \fs20\cf17\lang1049\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1049\langfenp1033\insrsid11828113\charrsid14956750 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard \ltrpar +\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1 +\'f2\'f0\'e0\'ed\'ff\'f2\'fc\loch\f823 \hich\f823 \'e8\'f1\'f5\'ee\'e4\'ed\'fb\'e9\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 \'eb\'fe\'e1\'ee\'e3\'ee\loch\f823 \hich\f823 \'c2\'f2\'ee\'f0\'e8\'f7\'ed\'ee\loch\f823 \hich\f823 \'f0\'e0\'f1 +\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'ec\'ee\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 \hich\f823 \'f2\'e0\'ea\'e8\'ec\loch\f823 \hich\f823 \'ee\'e1\'f0\'e0\'e7\'ee\'ec\loch\f823 \hich\f823 , \'f7\'f2\'ee\'e1\'fb\loch\f823 \hich\f823 + \'eb\'fe\'e1\'e0\'ff\loch\f823 \hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 \'f7\'e0\'f1\'f2\'fc\loch\f823 \hich\f823 \'ef\'ee\'e4\'ef\'e0\'e4\'e0\'eb\'e0\loch\f823 \hich\f823 \'ef\'ee\'e4\loch\f823 \hich\f823 \'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 +\loch\f823 \hich\f823 \'e8\'f1\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'ee\'e9\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'e8.}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\hich\af823\dbch\af11\loch\f823 \hich\f823 \'c8\'f1\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'e0\'ff\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'ff\loch\f823 \hich\f823 \emdash \loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'eb\'fe\'e1\'e0\'ff +\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'ff\loch\f823 \hich\f823 , \'f1\'ee\'e3\'eb\'e0\'f1\'ed\'ee\loch\f823 \hich\f823 \'ea\'ee\'f2\'ee\'f0\'ee\'e9\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\loch\f823 +\hich\f823 , \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\loch\af823\dbch\af11\hich\f823 \'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e2\'ee\'e7\'ec\'ee\'e6\'ed\'fb +\loch\f823 \hich\f823 \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'ef\'f0\'e8\loch\f823 \hich\f823 \'f1\'ee\'e1\'eb\'fe\'e4\'e5\'ed\'e8\'e8\loch\f823 \hich\f823 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'f5\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'e9 +\loch\f823 :}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ea\'ee\'e4\loch\f823 +\hich\f823 \'f0\'e0\'f1\'ea\'f0\'fb\'e2\'e0\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'e2\'e8\'e4\'e5\loch\f823 +\hich\f823 \'e8\'f1\'f5\'ee\'e4\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e0\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e4\'f0\'f3\'e3\'e8\'e5\loch\f823 \hich\f823 \'eb\'e8\'f6\'e0\loch\f823 \hich\f823 \'e8\'ec\'e5\'fe\'f2\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee +\loch\f823 \hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid15612533\charrsid14956750 \hich\af38\dbch\af11\loch\f38 3.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid15612533\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'d0\'ce\'c3\'d0 +\'c0\'cc\'cc\'db\loch\f823 \hich\f823 \'c8\loch\f823 \hich\f823 \'d3\'c2\'c5\'c4\'ce\'cc\'cb\'c5\'cd\'c8\'df\loch\f823 \hich\f823 \'d2\'d0\'c5\'d2\'dc\'c8\'d5\loch\f823 \hich\f823 \'cb\'c8\'d6.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ca +\'ee\'e4\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'f5\loch\f823 \hich\f823 \'f2\'f0\'e5\'f2\'fc\'e8\'f5\loch\f823 \hich\f823 \'eb\'e8\'f6\loch\f823 \hich\f823 , \'e2\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'fb\'e9\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 +\'e4\'e0\'ed\'ed\'ee\'e5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\loch\af823\dbch\af11\hich\f823 \'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb +\'ff\'e5\'f2\loch\f823 \hich\f823 \'e2\'e0\'ec\loch\f823 \hich\f823 \'ef\'ee\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'e8\loch\f823 \hich\f823 Microsoft \'f1\'ee\'e3\'eb\'e0\'f1\'ed\'ee\loch\f823 \hich\f823 \'ed\'e0\'f1\'f2\'ee\'ff\'f9\'e5 +\'ec\'f3\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'ee\'ed\'ed\'ee\'ec\'f3\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'fe\loch\f823 \hich\f823 , \'e0\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'f2\'f0\'e5\'f2\'fc\'e8 +\'ec\'e8\loch\f823 \hich\f823 \'eb\'e8\'f6\'e0\'ec\'e8\loch\f823 \hich\f823 \'ef\'ee\loch\f823 \hich\f823 \'ea\'e0\'ea\'e8\'ec-\'eb\'e8\'e1\'ee\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'ec\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\'ec +\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'e8.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d3\'e2\'e5\'e4\'ee\'ec\'eb\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'ee\loch\f823 \hich\f823 \'ea\'ee\'e4\'e5\loch\f823 \hich\f823 \'f2\'f0\'e5 +\'f2\'fc\'e8\'f5\loch\f823 \hich\f823 \'eb\'e8\'f6\loch\f823 \hich\f823 (\'ef\'f0\'e8\loch\f823 \hich\f823 \'ed\'e0\'eb\'e8\'f7\'e8\'e8\loch\f823 \hich\f823 ) \'e2\'ea\'eb\'fe\'f7\'e5\'ed\'fb\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'fd\'f2 +\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'e8\loch\f823 \hich\f823 , \'ea\'f0\'ee\'ec\'e5\loch\f823 \loch\af823\dbch\af11\hich\f823 +\'f2\'ee\'e3\'ee\loch\f823 \hich\f823 , \'ee\'ed\'e8\loch\f823 \hich\f823 \'ef\'f0\'e8\'e2\'e5\'e4\'e5\'ed\'fb\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f4\'e0\'e9\'eb\'e5\loch\f823 ThirdPartyNotices.txt.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid11758563\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 4.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ce\'c1\'da\'c5\'cc\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5\'cd\'c7\'c8\'c8\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ed\'e5 +\loch\f823 \hich\f823 \'ef\'f0\'ee\'e4\'e0\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 , \'e0\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'f0\'f3\'e5\'f2\'f1\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd +\'f2\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e4\'e0\'e5\'f2\loch\f823 \hich\f823 \'e2\'e0\'ec\loch\f823 \hich\f823 \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 +\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5 +\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cc\'e0\'e9\'ea\'f0\'ee\'f1\'ee\'f4\'f2\loch\f823 \hich\f823 \'ee\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2\loch\f823 \hich\f823 \'e7\'e0\loch\f823 +\hich\f823 \'f1\'ee\'e1\'ee\'e9\loch\f823 \hich\f823 \'e2\'f1\'e5\loch\f823 \hich\f823 \'ee\'f1\'f2\'e0\'eb\'fc\'ed\loch\af823\dbch\af11\hich\f823 \'fb\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c7 +\'e0\loch\f823 \hich\f823 \'e8\'f1\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'f1\'eb\'f3\'f7\'e0\'e5\'e2\loch\f823 \hich\f823 , \'ea\'ee\'e3\'e4\'e0\loch\f823 \hich\f823 , \'ed\'e5\'f1\'ec\'ee\'f2\'f0\'ff\loch\f823 \hich\f823 \'ed\'e0 +\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'ef\'f0\'e8\'ec\'e5\'ed\'e8\'ec\'ee\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\loch\f823 \hich\f823 \'ef\'f0 +\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2\loch\f823 \hich\f823 \'e2\'e0\'ec\loch\f823 \hich\f823 \'e1\'ee\'eb\'fc\'f8\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\loch\f823 \hich\f823 , \'e2\'fb\loch\f823 \hich\f823 \'ec\'ee\'e6\'e5\'f2\'e5\loch\f823 +\hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 +\hich\f823 \'f2\'e5\'ec\'e8\loch\f823 \hich\f823 \'f1\'ef\'ee\'f1\'ee\'e1\'e0\'ec\'e8\loch\f823 \hich\f823 , \'ea\'ee\'f2\'ee\'f0\'fb\'e5\loch\f823 \hich\f823 \'ff\'e2\'ed\'ee\loch\f823 \hich\f823 \'f3\'ea\'e0\'e7\'e0\'ed\'fb\loch\f823 \hich\f823 +\'e2\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\'f5\loch\f823 \hich\f823 \'ed\'e0\'f1\'f2\'ee\'ff\'f9\'e5\'e3\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf +\'f0\'e8\loch\f823 \hich\f823 \'fd\'f2\'ee\'ec\loch\f823 \hich\f823 \'e2\loch\af823\dbch\af11\hich\f823 \'fb\loch\f823 \hich\f823 \'e4\'ee\'eb\'e6\'ed\'fb\loch\f823 \hich\f823 \'f1\'ee\'e1\'eb\'fe\'e4\'e0\'f2\'fc\loch\f823 \hich\f823 \'e2\'f1\'e5 +\loch\f823 \hich\f823 \'f2\'e5\'f5\'ed\'e8\'f7\'e5\'f1\'ea\'e8\'e5\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'ec\loch\f823 \hich\f823 \'ee +\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e8\loch\f823 \hich\f823 , \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f9\'e8\'e5\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee +\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'ec\loch\f823 \hich\f823 \'ee\'e1\'f0\'e0\'e7\'ee\'ec.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\loch\f823 :}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'fb\'f2\'e0\'f2\'fc +\'f1\'ff\loch\f823 \hich\f823 \'ee\'e1\'ee\'e9\'f2\'e8\loch\f823 \hich\f823 \'f2\'e5\'f5\'ed\'e8\'f7\'e5\'f1\'ea\'e8\'e5\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3 +\'f0\'e0\'ec\'ec\'ed\'ee\'ec\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e8\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f0\'e5\'ea\'ee\'ed\'f1\'f2\'f0\'f3\'e8\'f0\loch\af823\dbch\af11\hich\f823 \'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 , \'e4\'e5\'ea\'ee\'ec\'ef\'e8 +\'eb\'e8\'f0\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'e4\'e8\'e7\'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e8\'f0\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee +\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'ef\'f0\'ff\'ec\'ee\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'f0\'e0\'e7\'f0\'e5\'f8\'e5\'ed\'ee +\loch\f823 \hich\f823 \'ef\'f0\'e8\'ec\'e5\'ed\'e8\'ec\'fb\'ec\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\'ec\loch\f823 \hich\f823 , \'ed\'e5\'f1\'ec\'ee\'f2\'f0\'ff\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e5\loch\f823 +\hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'f1\'ee\'e7\'e4\'e0\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e1\'ee\'eb\'fc\'f8\'e5\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'e9\loch\f823 \hich\f823 +\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 , \'f7\'e5\'ec\loch\f823 \hich\f823 \'f3\'ea\'e0\'e7\'e0\'ed\'ee\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 +\'fd\'f2\'ee\'ec\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e8\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 , \'ed\'e5\'f1\'ec\'ee\'f2\'f0\'ff\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e5 +\loch\f823 \hich\f823 \'ee\'e3\loch\af823\dbch\af11\hich\f823 \'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'f0\'e0\'e7\'f0\'e5\'f8\'e5\'ed\'ee\loch\f823 \hich\f823 \'ef\'f0\'e8\'ec\'e5\'ed\'e8\'ec\'fb\'ec\loch\f823 \hich\f823 \'ef\'f0 +\'e0\'e2\'ee\'ec\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'f3\'e1\'eb\'e8\'ea\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5 +\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'ff\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'ec\loch\f823 \hich\f823 \'eb\'e8\'f6\'e0\'ec\loch\f823 \hich\f823 \'e2\'ee\'e7\'ec\'ee\'e6\'ed\'ee\'f1 +\'f2\'fc\loch\f823 \hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'f2\'fc\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee +\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ef\'f0\'ee\'ea\'e0\'f2\loch\f823 \hich\f823 , \'e2\loch\f823 \hich\f823 \'e0\'f0\'e5\'ed\'e4\'f3\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'e2\'ee +\loch\f823 \hich\f823 \'e2\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e5\loch\f823 \hich\f823 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ef\'e5\'f0\'e5\'e4\'e0\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1 +\'ef\'e5\'f7\'e5\'ed\loch\af823\dbch\af11\hich\f823 \'e8\'e5\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'f2\'f0\'e5\'f2\'fc\'e8\'ec\loch\f823 +\hich\f823 \'eb\'e8\'f6\'e0\'ec\loch\f823 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee +\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'f3\'f1\'eb\'f3\'e3\loch\f823 \hich\f823 \'f0 +\'e0\'e7\'ec\'e5\'f9\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'ea\'ee\'ec\'ec\'e5\'f0\'f7\'e5\'f1\'ea\'ee\'e9\loch\f823 \hich\f823 \'ee\'f1\'ed\'ee\'e2\'e5.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 5.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d0\'c5\'c7\'c5\'d0 +\'c2\'cd\'c0\'df\loch\f823 \hich\f823 \'ca\'ce\'cf\'c8\'df\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'ec +\'ee\'e6\'e5\'f2\'e5\loch\f823 \hich\f823 \'f1\'e4\'e5\'eb\'e0\'f2\'fc\loch\f823 \hich\f823 \'ee\'e4\'ed\'f3\loch\f823 \hich\f823 \'f0\'e5\'e7\'e5\'f0\'e2\'ed\'f3\'fe\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'fe\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0 +\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 +\af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\loch\f823 \hich\f823 +\'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e5\'e5\hich\af823\dbch\af11\loch\f823 \hich\f823 \'f2\'ee\'eb\'fc\'ea\'ee\loch\f823 \hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'ef\'e5\'f0\'e5\'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea +\'e8\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'ff.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 6.\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c4\'ce\'ca\'d3\'cc\'c5\'cd\'d2\'c0\'d6\'c8\'df\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cb\'fe\'e1\'ee\'e5\loch\f823 \hich\f823 \'eb\'e8\'f6\'ee\loch\f823 \hich\f823 , \'e8\'ec\'e5\'fe\'f9\'e5\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0 +\'e2\'ee\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e4\'ee\'f1\'f2\'f3\'ef\loch\f823 \hich\f823 \'ea\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'ec\'f3\loch\f823 \hich\f823 \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0\'f3\loch\f823 \hich\f823 \'e8\'eb +\'e8\loch\f823 \hich\f823 \'e2\'ed\'f3\'f2\'f0\'e5\'ed\'ed\'e5\'e9\loch\f823 \hich\f823 \'f1\'e5\'f2\'e8\loch\f823 \hich\f823 , \'ec\'ee\'e6\'e5\'f2\loch\f823 \hich\f823 \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e8\loch\f823 +\hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'e0\'f6\'e8\'fe\loch\f823 \hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'e2\'ed\'f3\'f2\'f0\'e5\'ed\'ed\'e8\'f5\loch\f823 \hich\f823 +\'f6\'e5\'eb\'e5\'e9\loch\f823 \hich\f823 \'f1\'ef\'f0\'e0\'e2\'ee\'f7\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'f5\'e0\'f0\'e0\'ea\'f2\'e5\'f0\'e0.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 7.\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'c5\'d0\'c5\'cd\'ce\'d1\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'c4\'d0\'d3\'c3\'ce\'c5\loch\f823 +\loch\af823\dbch\af11\hich\f823 \'d3\'d1\'d2\'d0\'ce\'c9\'d1\'d2\'c2\'ce\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 +\hich\f823 \'e8\'ec\'e5\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\loch\f823 \hich\f823 \'f3\'e4\'e0\'eb\'e8\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5 +\'ed\'e8\'e5\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ee\'e4\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc\loch\f823 +\hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'ee\'ec\loch\f823 \hich\f823 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e5\loch\f823 \hich\f823 \'e4\'eb\'ff\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'e3\'ee +\loch\f823 \hich\f823 \'eb\'e8\'f7\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e8\'ec\'e5 +\'e5\'f2\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\loch\f823 \hich\f823 \'fd\'f2\'f3\loch\f823 \hich\f823 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'fe\loch\f823 \hich\f823 \'ed\'e0 +\loch\f823 \hich\f823 \'ed\'e5\'f1\'ea\'ee\'eb\'fc\'ea\'e8\'f5\loch\f823 \hich\f823 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\'f5.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 8.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15612533 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ce\'c3\'d0\'c0\'cd\'c8\'d7\'c5\'cd\'c8\'df\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'dd\'ca\'d1\'cf\'ce\'d0\'d2\loch\f823 . }{ +\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c4\'e0\'ed\'ed\'ee\'e5\loch\f823 \loch\af823\dbch\af11\hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee +\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'ee\'e4\'ef\'e0\'e4\'e0\'e5\'f2\loch\f823 \hich\f823 \'ef\'ee\'e4\loch\f823 \hich\f823 \'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5\loch\f823 \hich\f823 \'fd\'ea\'f1 +\'ef\'ee\'f0\'f2\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2\'e2\'e0\loch\f823 \hich\f823 \'d1\'d8\'c0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2 +\'fb\loch\f823 \hich\f823 \'ee\'e1\'ff\'e7\'e0\'ed\'fb\loch\f823 \hich\f823 \'f1\'ee\'e1\'eb\'fe\'e4\'e0\'f2\'fc\loch\f823 \hich\f823 \'e2\'f1\'e5\loch\f823 \hich\f823 \'e2\'ed\'f3\'f2\'f0\'e5\'ed\'ed\'e8\'e5\loch\f823 \hich\f823 \'e8\loch\f823 +\hich\f823 \'ec\'e5\'e6\'e4\'f3\'ed\'e0\'f0\'ee\'e4\'ed\'fb\'e5\loch\f823 \hich\f823 \'ed\'ee\'f0\'ec\'fb\loch\f823 \hich\f823 \'fd\'ea\'f1\'ef\'ee\'f0\'f2\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2 +\'e2\'e0\loch\f823 \hich\f823 , \'ef\'f0\'e8\'ec\'e5\'ed\'e8\'ec\'fb\'e5\loch\f823 \hich\f823 \'ea\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'ec\'f3\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'fe.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'ca\loch\f823 \hich\f823 \'f2\'e0\'ea\'e8\'ec\loch\f823 \hich\f823 \'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff\'ec\loch\f823 \hich\f823 \'fd\'ea\'f1\'ef\'ee\'f0\'f2\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed +\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2\'e2\'e0\loch\f823 \loch\af823\dbch\af11\hich\f823 \'ee\'f2\'ed\'ee\'f1\'ff\'f2\'f1\'ff\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'ef\'ee\loch\f823 \hich\f823 \'ea\'ee +\'ed\'e5\'f7\'ed\'fb\'ec\loch\f823 \hich\f823 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff\'ec\loch\f823 \hich\f823 , \'ef\'ee\'f0\'ff\'e4\'ea\'f3\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f0\'e5\'e3\'e8\'ee\'ed\'e0\'ec\loch\f823 \hich\f823 + \'ea\'ee\'ed\'e5\'f7\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'ff.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid15612533\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c4\'ee\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\'ed\'fb\'e5\loch\f823 \hich\f823 \'f1\'e2\'e5\'e4\'e5\'ed\'e8 +\'ff\loch\f823 \hich\f823 \'f1\'ec\loch\f823 \hich\f823 . \'ed\'e0\loch\f823 \hich\f823 \'e2\'e5\'e1-\'f1\'e0\'e9\'f2\'e5\loch\f823 www.microsoft.com/exporting.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs73\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1049\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1049\langfenp1033\insrsid11828113\charrsid14956750 \hich\af38\dbch\af13\loch\f38 9.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'d2\'c5\'d5\'cd\'c8\'d7\'c5\'d1\'ca\'c0\'df\loch\f823 \hich\f823 \'cf\'ce\'c4\'c4\'c5\'d0\'c6\'ca\'c0.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\loch\af823\dbch\af11\hich\f823 \'d2\'e0\'ea\loch\f823 \hich\f823 \'ea\'e0\'ea\loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5 +\loch\f823 \hich\f823 \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2\'f1\'ff\loch\f823 \hich\f823 \'ab\'ea\'e0\'ea\loch\f823 \hich\f823 \'e5\'f1\'f2\'fc\'bb\loch\f823 , Mic\hich\af823\dbch\af11\loch\f823 \hich\f823 rosoft \'ec\'ee\'e6\'e5\'f2 +\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'ef\'f0\'e5\'e4\'ee\'f1\'f2\'e0\'e2\'eb\'ff\'f2\'fc\loch\f823 \hich\f823 \'f3\'f1\'eb\'f3\'e3\loch\f823 \hich\f823 \'ef\'ee\loch\f823 \hich\f823 \'e5\'e3\'ee\loch\f823 \hich\f823 \'f2\'e5\'f5\'ed +\'e8\'f7\'e5\'f1\'ea\'ee\'e9\loch\f823 \hich\f823 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'ea\'e5.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 10.\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'ce\'cb\'cd\'ce\'d2\'c0\loch\f823 \hich\f823 \'d1\'ce\'c3\'cb\'c0\'d8\'c5\'cd\'c8\'df\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd\'f2\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 , \'e0\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5 +\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'ff\loch\f823 \hich\f823 , \'ea\'ee\'f2\'ee\'f0\'fb\'e5\loch\f823 \hich\f823 \'f1\'ee\'ef\'f0\'ee\'e2\'ee\'e6\'e4\'e0\'fe\'f2\loch\f823 \hich\f823 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'ec\'fb\'e5 +\loch\f823 \hich\f823 \'e2\'e0\'ec\'e8\loch\f823 \hich\f823 \'e4\'ee\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 , \'ee\'e1\'ed\'ee\'e2\'eb\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 , \'f1\'eb\'f3\'e6\'e1\'fb\loch\f823 \hich\f823 \'c8\'ed\'f2\'e5 +\'f0\'ed\'e5\'f2\'e0\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f1\'eb\'f3\'e6\'e1\'fb\loch\f823 \hich\f823 \'f2\'e5\'f5\'ed\'e8\'f7\'e5\'f1\'ea\'ee\'e9\loch\f823 \hich\f823 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'ea\'e8\loch\f823 \hich\f823 , \'f1\'ee +\'f1\'f2\'e0\'e2\'eb\'ff\'fe\'f2\loch\f823 \hich\f823 \'ef\'ee\'eb\'ed\'ee\'e5\loch\f823 \hich\f823 \'f1\'ee\'e3\loch\af823\dbch\af11\hich\f823 \'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'ee\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0 +\'ec\'ec\'ed\'ee\'ec\'f3\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'fe\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f1\'eb\'f3\'e6\'e1\'e0\'ec\loch\f823 \hich\f823 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'ea\'e8.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 11.\tab}}\pard \ltrpar +\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'d0\'c8\'cc\'c5\'cd\'c8\'cc\'ce\'c5\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\'ce.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 a.\tab}}\pard\plain \ltrpar +\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cd\'e0\loch\f823 +\hich\f823 \'f2\'e5\'f0\'f0\'e8\'f2\'ee\'f0\'e8\'e8\loch\f823 \hich\f823 \'d1\'ee\'e5\'e4\'e8\'ed\'e5\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'d8\'f2\'e0\'f2\'ee\'e2\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c5\'f1\'eb\'e8\loch\f823 \hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'ef\'f0\'e8\'ee\'e1\'f0\'e5\'eb\'e8\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3 +\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'d1\'ee\'e5\'e4\'e8\'ed\'e5\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'d8\'f2\'e0\'f2\'e0\'f5\loch\f823 +\hich\f823 , \'fd\'f2\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ef\'ee\'e4\'eb\'e5\'e6\'e8\'f2\loch\f823 \hich\f823 \'f2\'ee\'eb\'ea\'ee\'e2\'e0\'ed\'e8\'fe\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 + \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e8\'e8\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2\'e2\'ee\'ec\loch\f823 \hich\f823 \'f8\'f2\'e0\'f2\'e0\loch\f823 \loch\af823\dbch\af11\hich\f823 +\'c2\'e0\'f8\'e8\'ed\'e3\'f2\'ee\'ed\loch\f823 \hich\f823 , \'d1\'d8\'c0\loch\f823 \hich\f823 . \'cb\'fe\'e1\'fb\'e5\loch\f823 \hich\f823 \'ef\'f0\'e5\'f2\'e5\'ed\'e7\'e8\'e8\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'e2\'ff\'e7\'e8 +\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ed\'e0\'f0\'f3\'f8\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'e4\'e0\'ed\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5 +\loch\f823 \hich\f823 \'f0\'e0\'f1\'f1\'ec\'e0\'f2\'f0\'e8\'e2\'e0\'fe\'f2\'f1\'ff\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e8\'e8\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'fd\'f2\'e8\'ec +\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2\'e2\'ee\'ec\loch\f823 \hich\f823 \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\loch\f823 \hich\f823 \'ee\'f2\loch\f823 \hich\f823 \'ef\'f0\'e8\'ed\'f6\'e8\'ef\'ee\'e2\loch\f823 +\hich\f823 \'ea\'ee\'eb\'eb\'e8\'e7\'e8\'ee\'ed\'ed\'ee\'e3\'ee\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{ +\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'f1\'e5\loch\f823 \hich\f823 \'ee\'f1\'f2\'e0\'eb\'fc\'ed\'fb\'e5\loch\f823 \hich\f823 \'ef\'f0\'e5 +\'f2\'e5\'ed\'e7\'e8\'e8\loch\f823 \hich\f823 , \'e2\'ea\'eb\'fe\'f7\'e0\'ff\loch\f823 \hich\f823 \'ef\'f0\'e5\'f2\'e5\'ed\'e7\'e8\'e8\loch\f823 \hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'ee\'f1\'ed\'ee\'e2\'e0\'ed\'e8\'e8\loch\f823 \hich\f823 \'e7 +\'e0\'ea\'ee\'ed\'ee\'e2\loch\f823 \hich\f823 \'f8\'f2\'e0\'f2\'e0\loch\f823 \hich\f823 \'ee\loch\f823 \hich\f823 \'e7\'e0\'f9\'e8\'f2\loch\af823\dbch\af11\hich\f823 \'e5\loch\f823 \hich\f823 \'ef\'ee\'f2\'f0\'e5\'e1\'e8\'f2\'e5\'eb\'e5\'e9\loch\f823 +\hich\f823 \'e8\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'ee\'e2\loch\f823 \hich\f823 \'ee\loch\f823 \hich\f823 \'ed\'e5\'e4\'ee\'e1\'f0\'ee\'f1\'ee\'e2\'e5\'f1\'f2\'ed\'ee\'e9\loch\f823 \hich\f823 \'ea\'ee\'ed\'ea\'f3\'f0\'e5\'ed\'f6\'e8\'e8 +\loch\f823 \hich\f823 , \'e0\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'e2\'ff\'e7\'e8\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'e3\'f0\'e0\'e6\'e4\'e0\'ed\'f1\'ea\'e8\'ec\loch\f823 +\hich\f823 \'ef\'f0\'e0\'e2\'ee\'ed\'e0\'f0\'f3\'f8\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 , \'f0\'e5\'e3\'f3\'eb\'e8\'f0\'f3\'fe\'f2\'f1\'ff\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'e0\'ec\'e8\loch\f823 \hich\f823 \'f8\'f2\'e0\'f2\'e0\loch\f823 +\hich\f823 , \'e2\loch\f823 \hich\f823 \'ea\'ee\'f2\'ee\'f0\'ee\'ec\loch\f823 \hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'ef\'f0\'ee\'e6\'e8\'e2\'e0\'e5\'f2\'e5.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 b.\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c7\'e0\loch\f823 \hich\f823 \'ef\'f0\'e5\'e4\'e5\'eb\'e0\'ec\'e8\loch\f823 \hich\f823 \'d1\'ee\'e5\'e4\'e8\'ed\'e5\'ed\'ed\'fb\'f5\loch\f823 +\hich\f823 \'d8\'f2\'e0\'f2\'ee\'e2\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c5\'f1\'eb\'e8\loch\f823 \hich\f823 \'e2\'fb\loch\f823 +\hich\f823 \'ef\'f0\'e8\'ee\'e1\'f0\'e5\'eb\'e8\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'eb\'fe\'e1\'ee\'e9 +\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'ee\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\loch\af823\dbch\af11\hich\f823 \'e5\loch\f823 \hich\f823 , \'ef\'f0\'e8\'ec\'e5\'ed\'ff\'fe\'f2\'f1\'ff\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'fb\loch\f823 +\hich\f823 \'fd\'f2\'ee\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\'fb.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 12.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'de\'d0\'c8\'c4\'c8 +\'d7\'c5\'d1\'ca\'c0\'df\loch\f823 \hich\f823 \'d1\'c8\'cb\'c0\loch\f823 . }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd\'f2\'ee\loch\f823 +\hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ee\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\loch\f823 \hich\f823 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 \'fe\'f0\'e8\'e4\'e8\'f7\'e5\'f1\'ea\'e8\'e5 +\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'cf\'ee\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'e0\'ec\loch\f823 \hich\f823 \'f1\'e2\'ee\'e5\'e3\'ee\loch\f823 \hich\f823 \'f8\'f2\'e0\'f2 +\'e0\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'f1\'e2\'ee\'e5\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\'fb\loch\f823 \hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'ec\'ee\'e6\'e5\'f2\'e5\loch\f823 \hich\f823 \'e8\'ec\'e5\'f2\'fc +\loch\f823 \hich\f823 \'e4\'ee\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\'ed\'fb\'e5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 +\hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'c2\'fb\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5\loch\f823 \hich\f823 +\'ec\'ee\'e6\'e5\'f2\'e5\loch\f823 \hich\f823 \'e8\'ec\'e5\'f2\'fc\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'e0\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'ee\'f2\'ed\'ee\'f8\'e5\'ed\'e8\'e8\loch\f823 \hich\f823 \'eb\'e8\'f6\'e0\loch\f823 +\hich\f823 , \'f3\loch\f823 \hich\f823 \'ea\'ee\'f2\'ee\'f0\'ee\'e3\'ee\loch\f823 \hich\f823 \'e2\'fb\loch\f823 \hich\f823 \'ef\'f0\'e8\loch\af823\dbch\af11\hich\f823 \'ee\'e1\'f0\'e5\'eb\'e8\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed +\'ee\'e5\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5\'f7\'e5\'ed\'e8\'e5.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 }{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\b0\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd\'f2\'ee\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e8\'e7\'ec\'e5 +\'ed\'ff\'e5\'f2\loch\f823 \hich\f823 \'e2\'e0\'f8\'e8\'f5\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\loch\f823 \hich\f823 , \'ef\'f0\'e5\'e4\'f3\'f1\'ec\'ee\'f2\'f0\'e5\'ed\'ed\'fb\'f5\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'e0\'ec\'e8\loch\f823 +\hich\f823 \'e2\'e0\'f8\'e5\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\'fb\loch\f823 \hich\f823 , \'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'fd\'f2\'ee\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'e5\'f2\'f1\'ff +\loch\f823 \hich\f823 \'e7\'e0\'ea\'ee\'ed\'e0\'ec\'e8\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\'fb.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\lang1049\langfe1033\loch\af38\hich\af38\dbch\af13\langnp1049\langfenp1033\insrsid11828113\charrsid14956750 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid13191708 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'ce\'d2\'ca\'c0\'c7\loch\f823 \hich\f823 \'ce\'d2\loch\f823 \hich\f823 \'cf\'d0\'c5\'c4\'ce\'d1\'d2\'c0\'c2\'cb\'c5 +\'cd\'c8\'df\loch\f823 \hich\f823 \'c3\'c0\'d0\'c0\'cd\'d2\'c8\'c9\loch\f823 \hich\f823 . \'cf\'d0\'ce\'c3\'d0\'c0\'cc\'cc\'cd\'ce\'c5\loch\f823 \hich\f823 \'ce\'c1\'c5\'d1\'cf\'c5\'d7\'c5\'cd\'c8\'c5\loch\f823 \hich\f823 \'cb\'c8\'d6\'c5\'cd\'c7\'c8 +\'d0\'d3\'c5\'d2\'d1\'df\loch\f823 \hich\f823 \'ab\'ca\'c0\'ca}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid13191708 \~}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'c5\'d1\'d2\'dc\'bb\loch\f823 \hich\f823 . \'c2\'db\loch\f823 \hich\f823 \'cf\'ce\'cb\'dc\'c7\'d3\'c5\'d2 +\loch\af823\dbch\af13\hich\f823 \'c5\'d1\'dc\loch\f823 \hich\f823 \'c8\'cc\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'d1\'ce\'c1\'d1\'d2\'c2\'c5\'cd\'cd\'db\'c9\loch\f823 \hich\f823 \'d0\'c8\'d1\'ca\loch\f823 \hich\f823 . MICROSOFT \'cd\'c5 +\loch\f823 \hich\f823 \'cf\'d0\'c5\'c4\'ce\'d1\'d2\'c0\'c2\'cb\'df\'c5\'d2\loch\f823 \hich\f823 \'cd\'c8\'ca\'c0\'ca\'c8\'d5}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid13191708 \~}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'cf\'d0\'df\'cc\'db\'d5\loch\f823 \hich\f823 \'c3\'c0\'d0\'c0\'cd\'d2\'c8\'c9\loch\f823 \hich\f823 \'c8\loch\f823 +\hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'c9\loch\f823 \hich\f823 . \'d1\'ce\'c3\'cb\'c0\'d8\'c5\'cd\'c8\'c5\loch\f823 \hich\f823 \'cd\'c5\loch\f823 \hich\f823 \'cc\'c5\'cd\'df\'c5\'d2\loch\f823 \hich\f823 \'c4\'ce\'cf\'ce\'cb\'cd\'c8\'d2\'c5\'cb\'dc\'cd +\'db\'c5\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\'c0}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid13191708 \~}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'cf\'ce\'d2\'d0\'c5\'c1\'c8\'d2\'c5\'cb\'df\loch\f823 \hich\f823 \'c8\'cb\'c8\loch\f823 \hich\f823 \'c3\'c0\'d0\'c0 +\'cd\'d2\'c8\'c8\loch\f823 \hich\f823 , \'cf\'d0\'c5\'c4\'d3\'d1\'cc\'ce\'d2\'d0\'c5\'cd\'cd\'db\'c5\loch\f823 \hich\f823 \'cc\'c5\'d1\'d2\'cd\'db\'cc\loch\f823 \hich\f823 \'c7\'c0\'ca\'ce\'cd\'ce\'c4\'c0\'d2\'c5\'cb\'dc\'d1\'d2\'c2\'ce\'cc.}{ +\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af823\dbch\af11\loch\f823 \hich\f823 \'c2}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid6766043 \~}{\rtlch\fcs1 \af823\afs20 +\ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'d1\'d2\'c5\'cf\'c5\'cd\'c8\loch\f823 \hich\f823 , \'c4\'ce\'cf\'d3\'d1\'d2\'c8\'cc\'ce\'c9\loch\f823 \hich\f823 \'cc\'c5\'d1\'d2\'cd +\'db\'cc\loch\f823 \hich\f823 \'c7\'c0\'ca\'ce\'cd\'ce\'c4\'c0\'d2\'c5\'cb\'dc\'d1\'d2\'c2\'ce\'cc\loch\f823 , MICROS\hich\af823\dbch\af11\loch\f823 \hich\f823 OFT \'c8\'d1\'ca\'cb\'de\'d7\'c0\'c5\'d2\loch\f823 \hich\f823 \'cf\'ce\'c4\'d0\'c0\'c7\'d3 +\'cc\'c5\'c2\'c0\'c5\'cc\'db\'c5\loch\f823 \hich\f823 \'c3\'c0\'d0\'c0\'cd\'d2\'c8\'c8\loch\f823 \hich\f823 \'d1\'ce\'c1\'cb\'de\'c4\'c5\'cd\'c8\'df\loch\f823 \hich\f823 \'cf\'d0\'c8\'cd\'df\'d2\'db\'d5\loch\f823 \hich\f823 \'d1\'d2\'c0\'cd\'c4\'c0 +\'d0\'d2\'ce\'c2\loch\f823 \hich\f823 \'ca\'c0\'d7\'c5\'d1\'d2\'c2\'c0\loch\f823 \hich\f823 , \'cf\'d0\'c8\'cc\'c5\'cd\'c8\'cc\'ce\'d1\'d2\'c8\loch\f823 \hich\f823 \'c4\'cb\'df\loch\f823 \hich\f823 \'ca\'ce\'cd\'ca\'d0\'c5\'d2\'cd\'ce\'c9\loch\f823 +\hich\f823 \'d6\'c5\'cb\'c8\loch\f823 \hich\f823 \'c8\loch\f823 \hich\f823 \'cd\'c5\'cd\'c0\'d0\'d3\'d8\'c5\'cd\'c8\'df\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\loch\f823 \hich\f823 \'cd\'c0\loch\f823 \hich\f823 \'c8\'cd\'d2\'c5\'cb\'cb\'c5\'ca\'d2\'d3 +\'c0\'cb\'dc\'cd\'d3\'de\loch\f823 \hich\f823 \'d1\'ce\'c1\'d1\'d2\'c2\'c5\'cd\'cd\'ce\'d1\'d2\'dc.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \b\f823\fs20\expnd0\expndtw-1\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14367754 \loch\af823\dbch\af11\hich\f823 \'c4 +\'cb\'df\loch\f823 \hich\f823 \'c0\'c2\'d1\'d2\'d0\'c0\'cb\'c8\'c8\loch\f823 \hich\f823 \emdash \loch\f823 \hich\f823 \'c2\'db\loch\f823 \hich\f823 \'c8\'cc\'c5\'c5\'d2\'c5\loch\f823 \hich\f823 \'c3\'c0\'d0\'c0\'cd\'d2\'c8\'c8\loch\f823 \hich\f823 , +\'cf\'d0\'c5\'c4\'d3\'d1\'cc\'ce\'d2\'d0\'c5\'cd\'cd\'db\'c5\loch\f823 \hich\f823 \'c7\'c0\'ca\'ce\'cd\'ce\'cc\loch\f823 \hich\f823 \'c0\'c2\'d1\'d2\'d0\'c0\'cb\'c8\'c8\loch\f823 \hich\f823 \'ce\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2\'c0\'d5\loch\f823 +\hich\f823 \'cf\'ce\'d2\'d0\'c5\'c1\'c8\'d2\'c5\'cb\loch\af823\dbch\af11\hich\f823 \'c5\'c9\loch\f823 \hich\f823 , \'c8\loch\f823 \hich\f823 \'cd\'c8\'d7\'d2\'ce\loch\f823 \hich\f823 \'c2\loch\f823 \hich\f823 \'cd\'c0\'d1\'d2\'ce\'df\'d9\'c8\'d5 +\loch\f823 \hich\f823 \'d3\'d1\'cb\'ce\'c2\'c8\'df\'d5\loch\f823 \hich\f823 \'cd\'c5\loch\f823 \hich\f823 \'cf\'ce\'c4\'d0\'c0\'c7\'d3\'cc\'c5\'c2\'c0\'c5\'d2\loch\f823 \hich\f823 \'d3\'d9\'c5\'cc\'cb\'c5\'cd\'c8\'c5\loch\f823 \hich\f823 \'dd\'d2\'c8 +\'d5\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\expnd0\expndtw-1\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14367754 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \hich\af38\dbch\af11\loch\f38 14.\tab}}\pard\plain \ltrpar +\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ce\'c3\'d0\'c0\'cd +\'c8\'d7\'c5\'cd\'c8\'c5\loch\f823 \hich\f823 \'c8\loch\f823 \hich\f823 \'ce\'d2\'d1\'d3\'d2\'d1\'d2\'c2\'c8\'c5\loch\f823 \hich\f823 \'d1\'d0\'c5\'c4\'d1\'d2\'c2\loch\f823 \hich\f823 \'c7\'c0\'d9\'c8\'d2\'db\loch\f823 \hich\f823 \'cf\'d0\'c0\'c2 +\loch\f823 \hich\f823 \'cf\'ce\'d2\'d0\'c5\'c1\'c8\'d2\'c5\'cb\'c5\'c9\loch\f823 \hich\f823 \'c2\loch\f823 \hich\f823 \'d1\'c2\'df\'c7\'c8\loch\f823 \hich\f823 \'d1\loch\f823 \hich\f823 \'d3\'c1\'db\'d2\'ca\'c0\'cc\'c8\loch\f823 \hich\f823 \'c8 +\loch\f823 \hich\f823 \'d3\'d9\'c5\'d0\'c1\'ce\'cc\loch\f823 \hich\f823 . \'c2\'db\loch\f823 \hich\f823 \'cc\'ce\'c6\'c5\'d2\'c5\loch\f823 \hich\f823 \'c2\'c7\'db\'d1\'ca\'c0\'d2\'dc\loch\f823 \hich\f823 \'d1\loch\f823 \hich\f823 MICROSOFT \'c8 +\loch\f823 \hich\f823 \'cf\'ce\'d1\'d2\'c0\'c2\'d9\'c8\'ca\'ce\'c2\loch\f823 \hich\f823 MICROSOFT \'d2\'ce\'cb\'dc\'ca\'ce\loch\f823 \hich\f823 \'cf\'d0\'df\'cc\'db\'c5\loch\f823 \hich\f823 \'d3\'c1\'db\'d2\'ca\'c8\loch\f823 \hich\f823 \'c2 +\loch\f823 \hich\f823 \'d0\'c0\'c7\'cc\'c5\'d0\'c5\loch\f823 \hich\f823 \'cd\'c5\loch\f823 \hich\f823 \'c1\'ce\'cb\'c5\loch\af823\dbch\af11\hich\f823 \'c5\loch\f823 \hich\f823 5,00 \'c4\'ce\'cb\'cb\'c0\'d0\'ce\'c2\loch\f823 \hich\f823 \'d1\'d8\'c0 +\loch\f823 \hich\f823 . \'c2\'db\loch\f823 \hich\f823 \'cd\'c5\loch\f823 \hich\f823 \'cc\'ce\'c6\'c5\'d2\'c5\loch\f823 \hich\f823 \'c2\'c7\'db\'d1\'ca\'c0\'d2\'dc\loch\f823 \hich\f823 \'cd\'c8\'ca\'c0\'ca\'c8\'c5\loch\f823 \hich\f823 \'c4\'d0\'d3\'c3 +\'c8\'c5\loch\f823 \hich\f823 \'d3\'c1\'db\'d2\'ca\'c8\loch\f823 \hich\f823 , \'c2\'ca\'cb\'de\'d7\'c0\'df\loch\f823 \hich\f823 \'ca\'ce\'d1\'c2\'c5\'cd\'cd\'db\'c5\loch\f823 \hich\f823 , \'d1\'cf\'c5\'d6\'c8\'c0\'cb\'dc\'cd\'db\'c5\loch\f823 +\hich\f823 , \'ce\'cf\'ce\'d1\'d0\'c5\'c4\'ce\'c2\'c0\'cd\'cd\'db\'c5\loch\f823 \hich\f823 \'c8\'cb\'c8\loch\f823 \hich\f823 \'d1\'cb\'d3\'d7\'c0\'c9\'cd\'db\'c5\loch\f823 \hich\f823 \'d3\'c1\'db\'d2\'ca\'c8\loch\f823 \hich\f823 , \'c0\loch\f823 +\hich\f823 \'d2\'c0\'ca\'c6\'c5\loch\f823 \hich\f823 \'d3\'c1\'db\'d2\'ca\'c8\loch\f823 \hich\f823 \'c2\loch\f823 \hich\f823 \'d1\'c2\'df\'c7\'c8\loch\f823 \hich\f823 \'d1\loch\f823 \hich\f823 \'d3\'cf\'d3\'d9\'c5\'cd\'cd\'ce\'c9\loch\f823 +\hich\f823 \'c2\'db\'c3\'ce\'c4\'ce\'c9.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'dd\'f2\'ee\loch\f823 +\hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'f2\'f1\'ff\loch\f823 :}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar +\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ed\'e0\loch\f823 +\hich\f823 \'e2\'f1\'e5\loch\f823 \hich\f823 , \'f7\'f2\'ee\loch\f823 \hich\f823 \'f1\'e2\'ff\'e7\'e0\'ed\'ee\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'ec\loch\f823 \hich\f823 \'ee\'e1\'e5\'f1\'ef\'e5 +\'f7\loch\af823\dbch\af11\hich\f823 \'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 , \'f1\'eb\'f3\'e6\'e1\'e0\'ec\'e8\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'ec\'fb\'ec\loch\f823 \hich\f823 \'e2\'e5\'e1-\'f1\'e0\'e9\'f2 +\'ee\'e2\loch\f823 \hich\f823 \'f2\'f0\'e5\'f2\'fc\'e8\'f5\loch\f823 \hich\f823 \'eb\'e8\'f6\loch\f823 \hich\f823 (\'e2\'ea\'eb\'fe\'f7\'e0\'ff\loch\f823 \hich\f823 \'ea\'ee\'e4\loch\f823 \hich\f823 ), \'e0\loch\f823 \hich\f823 \'f2\'e0\'ea\'e6\'e5 +\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0\'ec\'e8\loch\f823 \hich\f823 \'f1\'f2\'ee\'f0\'ee\'ed\'ed\'e8\'f5\loch\f823 \hich\f823 \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'f7\'e8\'ea\'ee\'e2\loch\f823 ;}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f3\fs20\lang1049\langfe1033\langnp1049\langfenp1033\insrsid1048756\charrsid14956750 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 +\f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \loch\af823\dbch\af11\hich\f823 \'ed\'e0\loch\f823 \hich\f823 \'ef\'f0\'e5\'f2\'e5\'ed\'e7\'e8\'e8\loch\f823 \hich\f823 , \'f1\'e2\'ff\'e7\'e0\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 + \'f1\loch\f823 \hich\f823 \'ed\'e0\'f0\'f3\'f8\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'e9\loch\f823 \hich\f823 \'f1\'ee\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 , \'e3\'e0\'f0\'e0\'ed\'f2\'e8\'e8\loch\f823 +\hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'f5\loch\f823 \hich\f823 \'f3\'f1\'eb\'ee\'e2\'e8\'e9\loch\f823 \hich\f823 , \'f1\'f2\'f0\'ee\'e3\'ee\'e9\loch\f823 \hich\f823 \'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e5\'ed\'ed\'ee\'f1\'f2 +\'fc\'fe\loch\f823 \hich\f823 , \'ed\'e5\'ee\'f1\'f2\'ee\'f0\'ee\'e6\'ed\'ee\'f1\'f2\'fc\'fe\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'ec\loch\f823 \hich\f823 \'e3\loch\af823\dbch\af11\hich\f823 \'f0\'e0\'e6\'e4\'e0 +\'ed\'f1\'ea\'e8\'ec\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\'ed\'e0\'f0\'f3\'f8\'e5\'ed\'e8\'e5\'ec\loch\f823 \hich\f823 , \'e2\loch\f823 \hich\f823 \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'ee\loch\f823 \hich\f823 \'e4\'ee\'ef\'f3\'f1\'f2\'e8\'ec +\'ee\'e9\loch\f823 \hich\f823 \'f1\'f2\'e5\'ef\'e5\'ed\'e8\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e8\'e8\loch\f823 \hich\f823 \'f1\loch\f823 \hich\f823 \'ef\'f0\'e8\'ec\'e5\'ed\'e8\'ec\'fb\'ec +\loch\f823 \hich\f823 \'ef\'f0\'e0\'e2\'ee\'ec.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid14367754 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 +\loch\af823\dbch\af13\hich\f823 \'dd\'f2\'ee\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\loch\f823 \hich\f823 \'e4\'e5\'e9\'f1\'f2\'e2\'f3\'e5\'f2\loch\f823 \hich\f823 \'e4\'e0\'e6\'e5\loch\f823 \hich\f823 \'e2\loch\f823 +\hich\f823 \'f1\'eb\'f3\'f7\'e0\'e5\loch\f823 \hich\f823 , \'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'e2\loch\f823 \hich\f823 \'cc\'e0\'e9\'ea\'f0\'ee\'f1\'ee\'f4\'f2\loch\f823 \hich\f823 \'e1\'fb\'eb\'ee\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 +\hich\f823 \'e4\'ee\'eb\'e6\'ed\'ee\loch\f823 \hich\f823 \'e1\'fb\'eb\'ee\loch\f823 \hich\f823 \'e1\'fb\'f2\'fc\loch\f823 \hich\f823 \'e8\'e7\'e2\'e5\'f1\'f2\'ed\'ee\loch\f823 \hich\f823 \'ee}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid14367754 \~}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\loch\af823\hich\af823\dbch\af13\langnp1049\insrsid11828113\charrsid14956750 \loch\af823\dbch\af13\hich\f823 \'e2\'ee\'e7\'ec\'ee\'e6\'ed\'ee\'f1\'f2\'e8 +\loch\f823 \hich\f823 \'f2\'e0\'ea\'e8\'f5\loch\f823 \hich\f823 \'f3\'e1\'fb\'f2\'ea\'ee\'e2.}{\rtlch\fcs1 \af823\afs20 \ltrch\fcs0 \f823\fs20\lang1049\langfe1033\langnp1049\insrsid1048756\charrsid14956750 \hich\af823\dbch\af11\loch\f823 \hich\f823 +\'c2\'fb\'f8\'e5\'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'e8\loch\f823 \hich\f823 \'e8\'f1\'ea\'eb\'fe\'f7\'e5\'ed\loch\af823\dbch\af11\hich\f823 \'e8\'ff\loch\f823 +\hich\f823 \'ec\'ee\'e3\'f3\'f2\loch\f823 \hich\f823 \'ea\loch\f823 \hich\f823 \'e2\'e0\'ec\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'ee\'f2\'ed\'ee\'f1\'e8\'f2\'fc\'f1\'ff\loch\f823 \hich\f823 , \'e5\'f1\'eb\'e8\loch\f823 \hich\f823 \'e7 +\'e0\'ea\'ee\'ed\'ee\'e4\'e0\'f2\'e5\'eb\'fc\'f1\'f2\'e2\'ee\loch\f823 \hich\f823 \'e2\'e0\'f8\'e5\'e9\loch\f823 \hich\f823 \'f1\'f2\'f0\'e0\'ed\'fb\loch\f823 \hich\f823 \'ed\'e5\loch\f823 \hich\f823 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'e5\'f2\loch\f823 +\hich\f823 \'e8\'f1\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'ff\loch\f823 \hich\f823 \'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'e5\'ed\'ed\'ee\'f1\'f2\'e8\loch\f823 +\hich\f823 \'e7\'e0\loch\f823 \hich\f823 \'f1\'eb\'f3\'f7\'e0\'e9\'ed\'fb\'e5\loch\f823 \hich\f823 , \'ea\'ee\'f1\'e2\'e5\'ed\'ed\'fb\'e5\loch\f823 \hich\f823 \'e8\'eb\'e8\loch\f823 \hich\f823 \'e4\'f0\'f3\'e3\'e8\'e5\loch\f823 \hich\f823 \'f3\'e1 +\'fb\'f2\'ea\'e8.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\lang1049\langfe1033\dbch\af13\langnp1049\insrsid4684770\charrsid14956750 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2; +\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5; +\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000003092 +f922acb8ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/setup/resources/eula/VF_EULA.TRK.rtf b/setup/resources/eula/VF_EULA.TRK.rtf new file mode 100644 index 00000000000..09d89b443a8 --- /dev/null +++ b/setup/resources/eula/VF_EULA.TRK.rtf @@ -0,0 +1,692 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f40\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f41\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} +{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;} +{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);} +{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);} +{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;} +{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;}{\f444\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f454\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f452\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;} +{\f453\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f455\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f456\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f459\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt \'cb\'ce\'cc\'e5};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\* +\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive +\rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 +\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked +Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{ +\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{ +\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{ +\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{ +\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{ +\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 +\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{ +\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{ +\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50 +Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{ +\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink54 \slocked \ssemihidden +Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af38\afs19\alang1025 \ltrch\fcs0 +\i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\* +\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60 +\additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{ +\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super +\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden +Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 +\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{ +\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 +\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 +page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked +Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{ +\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af38\afs19 +\ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs18\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \b\f39\fs24\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0 +Heading French Warranty;}{\*\cs94 \additive \f38\lang1033\langfe0\langnp1033 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive \f2\cf15\lang1024\langfe1024\noproof +tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f38 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive \f2\cf11\lang1024\langfe1024\noproof +tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof DO_NOT_TRANSLATE;}{ +\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \f38\fs19\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 +Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af38\afs19 \ltrch\fcs0 \b0\f38\fs19 +\sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{ +\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1026\langfe2052\super\loch\f38\hich\af38\dbch\af11\cgrid\langnp1026\langfenp2052 +\sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable +{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660 +{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 +\b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname +;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 +\b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 +\b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers +\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers +;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;} +\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818} +{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname +;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506 +\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271} +{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1} +{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764 +\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10} +{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898 +\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19} +{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271 +\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28} +{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945 +\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136 +\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1} +{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40} +{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel +\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927 +\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46} +{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid462051\rsid4684770\rsid5858028\rsid9196108\rsid11758563\rsid11828113\rsid14356214\rsid14446677\rsid15548830\rsid16280961}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0 +\mnaryLim1}{\info{\creatim\yr2013\mo4\dy30\hr15\min18}{\revtim\yr2013\mo4\dy30\hr15\min19}{\version1}{\edmins0}{\nofpages3}{\nofwords1110}{\nofchars6329}{\nofcharsws7425}{\vern49275}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot4684770\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal +\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 +\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid462051 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar +\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14446677 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid14356214\charrsid14446677 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid4684770 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 MICROSOFT VISUAL F# }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which \hich\af38\dbch\af13\loch\f38 +includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 updates,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 supplements,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Internet-based services, and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 support services}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BY USING T\hich\af38\dbch\af13\loch\f38 HE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +You may install and use any number of copies of the software \hich\af38\dbch\af13\loch\f38 on your devices}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 to design, develop and test your programs.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 2.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ADDITIONAL\hich\af38\dbch\af13\loch\f38 LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software contains code that you are permitted to distribute in programs you develop if you comply with the terms belo\hich\af38\dbch\af13\loch\f38 w.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 + The code and text files listed below are \'93\loch\f38 \hich\f38 Distributable Code.\'94}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 REDIST\hich\af38\dbch\af13\loch\f38 .TXT Files}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +. You may copy and distribute the object code form of code listed in REDIST.TXT files.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Third Party Distribution}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 . You may permit distributors o\hich\af38\dbch\af13\loch\f38 +f your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 add significant primary functionality to it in your programs;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 for any Distributable Code\hich\af38\dbch\af13\loch\f38 having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your program;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code included in a setup program only as part of that setup program without modification;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\loch\af38\dbch\af13\hich\f38 \rquote \loch\f38 fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the Distributable Code;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 s trademarks in your programs\hich\f38 \rquote \loch\f38 names or in a way that suggests your\hich\af38\dbch\af13\loch\f38 programs come from or are endorsed by Microsoft;}{ +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 distribute Distributable Code to run on a platform other than the Windows platform;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 include Distributable Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 modify or distribute the source code of any Di\hich\af38\dbch\af13\loch\f38 +stributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 others have the\hich\af38\dbch\af13\loch\f38 right to modify it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid11758563 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 THIRD PARTY PROGRAMS AND NOTICES}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 +. Other third party code included in the software is licensed to you by Microsoft under this license agreement, rather than licensed to you by any third party under some other license terms. Notices, if any, for this thir\hich\af38\dbch\af13\loch\f38 +d party code are included with the software and may also be}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11758563 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid11758563\charrsid11758563 \hich\af38\dbch\af13\loch\f38 found in the ThirdPartyNotices.txt file. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use \hich\af38\dbch\af13\loch\f38 +the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 revers\hich\af38\dbch\af13\loch\f38 e engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 make more copies of the software than specified in this agreement or allowed by applicable law, despite this li\hich\af38\dbch\af13\loch\f38 mitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 publish the software for others to copy;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may make one backup copy of the +\hich\af38\dbch\af13\loch\f38 software. You may use it only to reinstall the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 TRANSFER TO ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 You may unin\hich\af38\dbch\af13\loch\f38 +stall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + The software is subject to United States export laws and regulations. You must comply with all domestic and inte\hich\af38\dbch\af13\loch\f38 +rnational export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we +\hich\af38\dbch\af13\loch\f38 may not provide support services for it.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 APPLICABLE LAW.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live gove +\hich\af38\dbch\af13\loch\f38 rn all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 Outside the United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 If you acquired the software in any other country, the laws of that country apply.}{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This agreement des\hich\af38\dbch\af13\loch\f38 +cribes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 laws of your country do not permit it to do so.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 13.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 \hich\f38 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f38 \hich\f38 AS-IS.\'94\loch\f38 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY G +\hich\af38\dbch\af13\loch\f38 +UARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 FOR AUSTRALIA \hich\f38 \endash \loch\f38 YOU HAVE +\hich\af38\dbch\af13\loch\f38 STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid11828113 \hich\af38\dbch\af11\loch\f38 +. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.0\hich\af38\dbch\af11\loch\f38 0. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\insrsid4684770 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 This limitation applies to}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third\hich\af38\dbch\af13\loch\f38 party programs; and}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid4684770 +\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid11828113 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 +\hich\af38\dbch\af13\loch\f38 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid11828113 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the pos\hich\af38\dbch\af13\loch\f38 +sibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid4684770 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 3; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1; +\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8; +\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e50000000000000000000000007074 +16b8f045ce010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000707416b8f045ce01 +707416b8f045ce010000000000000000000000005400330042004100430054004b0032005500c400da005100570034005300dc00d7003200d9003300c600d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000707416b8f045 +ce01707416b8f045ce010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30393430 +443034442d394333322d344535322d393035392d4534424344444345354439427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file From a7ece93eea49717496ae5a6271c4ef965b42d7d9 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 6 May 2016 12:43:59 -0700 Subject: [PATCH 130/334] Remove Old scripts --- jenkins-build.cmd | 38 --------------- .../FSharp.Data.TypeProviders.fsproj | 47 ------------------- .../ItemTemplates/AppConfig/AppConfig.csproj | 1 + .../ItemTemplates/CodeFile/CodeFile.csproj | 1 + .../ScriptFile/ScriptFile.csproj | 1 + .../SignatureFile/SignatureFile.csproj | 1 + .../ItemTemplates/TextFile/TextFile.csproj | 1 + .../ItemTemplates/XMLFile/XMLFile.csproj | 1 + .../ConsoleProject/ConsoleProject.csproj | 1 + .../LibraryProject/LibraryProject.csproj | 1 + .../NetCore259Project.csproj | 1 + .../NetCore78Project/NetCore78Project.csproj | 1 + .../NetCoreProject/NetCoreProject.csproj | 1 + .../PortableLibraryProject.csproj | 1 + .../SilverlightProject.csproj | 1 + .../TutorialProject/TutorialProject.csproj | 1 + 16 files changed, 14 insertions(+), 85 deletions(-) delete mode 100644 jenkins-build.cmd delete mode 100644 src/fsharp/FSharp.Data.TypeProviders/FSharp.Data.TypeProviders.fsproj diff --git a/jenkins-build.cmd b/jenkins-build.cmd deleted file mode 100644 index cab6aac97b5..00000000000 --- a/jenkins-build.cmd +++ /dev/null @@ -1,38 +0,0 @@ -@if "%_echo%"=="" echo off - -:ARGUMENTS_VALIDATION - -if /I "%1" == "/help" (goto :USAGE) -if /I "%1" == "/h" (goto :USAGE) -if /I "%1" == "/?" (goto :USAGE) - -set BUILD_PROFILE=%* - -if /I "%BUILD_PROFILE%" == "debug" ( - set BUILD_ARGS=debug compiler coreclr pcls vs notests - goto :ARGUMENTS_OK -) -if /I "%BUILD_PROFILE%" == "release" ( - set BUILD_ARGS=release compiler coreclr pcls vs notests - goto :ARGUMENTS_OK -) - -echo '%BUILD_PROFILE%' is not a valid profile -goto :USAGE - -:USAGE - -echo Usage: -echo Builds the source tree using a specific configuration -echo jenkins-build.cmd ^ -exit /b 1 - -:ARGUMENTS_OK - -rem Do build only for now -call build.cmd %BUILD_ARGS% - -goto :eof - -:failure -exit /b 1 \ No newline at end of file diff --git a/src/fsharp/FSharp.Data.TypeProviders/FSharp.Data.TypeProviders.fsproj b/src/fsharp/FSharp.Data.TypeProviders/FSharp.Data.TypeProviders.fsproj deleted file mode 100644 index 810ecac2122..00000000000 --- a/src/fsharp/FSharp.Data.TypeProviders/FSharp.Data.TypeProviders.fsproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - - ..\.. - - - - Debug - AnyCPU - Library - FSharp.Data.TypeProviders - true - {cb7d20c4-6506-406d-9144-5342c3595f03} - $(OtherFlags) --warnon:1182 - - - - - - - TypeProviderRuntimeAttribute.fs - true - - - - - - assemblyinfo.FSharp.Data.TypeProviders.dll.fs - - - - - - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - - \ No newline at end of file diff --git a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj index 3291c931d36..44f7229c131 100644 --- a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj +++ b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index 1878943a362..51b9039653c 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index 81f19113812..dc0661f24d7 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index 1768ada4162..2f0c168b660 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index a3ff9ad0849..18babd20332 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index ab0e9c4faa3..b7f97c1dafe 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index 1dcfa606324..2ba803f4a02 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index 7cf51d301c8..4bec3d1a4ab 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 686edfbb897..6687c2115b7 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index 962f4f8df36..ac0badd9a1d 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 888ef4ada76..0e0251e4e4c 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 47fb1eab272..ec4bc41bf46 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index 2fa165570a2..d5412632636 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 2dfc1492bb2..24d87f1df8a 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -9,6 +9,7 @@ true false None + true ..\..\..\src From 22a905392ab5e8068bc359c50dc3b56c5df7fd9d Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 6 May 2016 14:51:48 -0700 Subject: [PATCH 131/334] Preventing deploying vsix on Microbuild --- vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index d1541abeb46..fa54ea55a2a 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -44,8 +44,8 @@ FSharp true 14.0 - False - True + False + True {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} From af90c62481013c8bbae4aa8f02fca87936aa853f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 6 May 2016 15:26:48 -0700 Subject: [PATCH 132/334] Declare vsixs as packages --- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index fa54ea55a2a..8d8095e7f4e 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -11,6 +11,7 @@ 15.0 2.0 + true {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -47,6 +48,7 @@ False True {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} + true Program @@ -340,4 +342,14 @@ + + + + + + Microsoft + StrongName + + + \ No newline at end of file From 119d5678426b9c4eb6976b4fa009fdb966437bfd Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sat, 7 May 2016 21:07:24 -0700 Subject: [PATCH 133/334] Updates and fixes to CallerMemberName --- src/fsharp/TypeChecker.fs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 544a649c16e..b2960457a39 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9626,10 +9626,15 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt match bind with | NormalizedBinding(vis,bkind,isInline,isMutable,attrs,doc,_,valSynData,pat,NormalizedBindingRhs(spatsL,rtyOpt,rhsExpr),mBinding,spBind) -> - let name = match pat with - | SynPat.Named(_,name,_,_,_) -> Some(name.idText) - | _ -> None - let envinner = {envinner with eCallerMemberName = name } + let callerName = + match declKind, bkind, pat with + | ExpressionBinding, _, _ -> envinner.eCallerMemberName + | _, _, SynPat.Named(_,name,_,_,_) -> Some(name.idText) + | ClassLetBinding, DoBinding, _ -> Some(".ctor") + | ModuleOrMemberBinding, StandaloneExpression, _ -> Some(".cctor") + | _, _, _ -> envinner.eCallerMemberName + + let envinner = {envinner with eCallerMemberName = callerName } let (SynValData(memberFlagsOpt,valSynInfo,_)) = valSynData From 7938a7d7990c4ce1febc569d5dbe853c49f531a3 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sat, 7 May 2016 21:47:09 -0700 Subject: [PATCH 134/334] Remove warning for scenarios where there is no calling member --- src/fsharp/FSComp.txt | 3 +-- src/fsharp/TypeChecker.fs | 43 ++++++++++++++++----------------------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 172022d9379..c0fa84e4877 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1293,5 +1293,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3194,optsResponseFileNotFound,"Response file '%s' not found in '%s'" 3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long" 3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory" -3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" -3198,tcNoCallerMemberName,"There is no caller member name" \ No newline at end of file +3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" \ No newline at end of file diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b2960457a39..997236d893e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9207,18 +9207,13 @@ and TcMethodApplication | ByrefTy cenv.g inst -> build inst (PassByRef(inst, currDfltVal)) | _ -> - match calledArg.CallerInfoInfo with - | CallerLineNumber when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> + match calledArg.CallerInfoInfo, env.eCallerMemberName with + | CallerLineNumber, _ when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> emptyPreBinder,Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) - | CallerFilePath when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> + | CallerFilePath, _ when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> emptyPreBinder,Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) - | CallerMemberName when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> - let name = match env.eCallerMemberName with - | Some(name) -> name - | None -> - warning(Error(FSComp.SR.tcNoCallerMemberName(), mMethExpr)) - System.String.Empty - emptyPreBinder,Expr.Const(Const.String(name), mMethExpr, currCalledArgTy) + | CallerMemberName, Some(callerName) when (typeEquiv cenv.g currCalledArgTy cenv.g.string_ty) -> + emptyPreBinder,Expr.Const(Const.String(callerName), mMethExpr, currCalledArgTy) | _ -> emptyPreBinder,Expr.Const(TcFieldInit mMethExpr fieldInit,mMethExpr,currCalledArgTy) @@ -9250,22 +9245,18 @@ and TcMethodApplication else calledArgTy // should be unreachable - match calledArg.CallerInfoInfo with - | CallerLineNumber when typeEquiv cenv.g calledNonOptTy cenv.g.int_ty -> - let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) - emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[lineExpr],mMethExpr) - | CallerFilePath when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> - let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) - emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) - | CallerMemberName when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> - let name = match env.eCallerMemberName with - | Some(name) -> name - | None -> - warning(Error(FSComp.SR.tcNoCallerMemberName(), mMethExpr)) - System.String.Empty - let memberNameExpr = Expr.Const(Const.String(name), mMethExpr, calledNonOptTy) - emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[memberNameExpr],mMethExpr) - | _ -> emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) + match calledArg.CallerInfoInfo, env.eCallerMemberName with + | CallerLineNumber, _ when typeEquiv cenv.g calledNonOptTy cenv.g.int_ty -> + let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[lineExpr],mMethExpr) + | CallerFilePath, _ when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> + let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[filePathExpr],mMethExpr) + | CallerMemberName, Some(callerName) when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> + let memberNameExpr = Expr.Const(Const.String(callerName), mMethExpr, calledNonOptTy) + emptyPreBinder,mkUnionCaseExpr(mkSomeCase cenv.g,[calledNonOptTy],[memberNameExpr],mMethExpr) + | _ -> + emptyPreBinder,mkUnionCaseExpr(mkNoneCase cenv.g,[calledNonOptTy],[],mMethExpr) // Combine the variable allocators (if any) let wrapper = (wrapper >> wrapper2) From f6ddde6cd6e1b2b5a5ff02b1227b2d80de9738e1 Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sat, 7 May 2016 22:07:27 -0700 Subject: [PATCH 135/334] Adjust tests --- .../Imported/CallerInfo/CallerMemberName.fs | 6 +++--- .../Imported/CallerInfo/ViaInteractive.fsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index 5854c470412..28eb7f208b6 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -29,9 +29,9 @@ module Program = let getCallerLineNumber = CallerInfoTest.MemberName if () |> CallerInfoTest.MemberName <> "main" then - failwith "Unexpected C# CallerLineNumber" + failwith "Unexpected C# CallerMemberName" - if getCallerLineNumber () <> "getCallerLineNumber" then - failwith "Unexpected C# CallerLineNumber" + if getCallerLineNumber () <> "main" then + failwith "Unexpected C# CallerMemberName" 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx index 2357128cabf..8a9e9928e4e 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/ViaInteractive.fsx @@ -24,7 +24,7 @@ if MyTy.GetCallerLineNumber() <> Some(23) then failwith "Unexpected F# CallerLineNumber" match CallerInfoTest.AllInfo(21) with -| (path, 26, "") when matchesPath checkPath path -> () +| (path, 26, ".cctor") when matchesPath checkPath path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x #q \ No newline at end of file From b278b0ce2e9bd716a063763b0e78d7f4ede6c315 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Sun, 8 May 2016 11:56:12 -0700 Subject: [PATCH 136/334] Fix vsix signing cert --- vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 8d8095e7f4e..1bfe3f43629 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -347,8 +347,7 @@ - Microsoft - StrongName + VsixSHA2 From df57a318f27446bd2098368cb6e96b42b301dfda Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Sun, 8 May 2016 12:28:41 -0700 Subject: [PATCH 137/334] Disable building coreclr in microbuild --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 9810e3c2ebf..07c479c8168 100644 --- a/build.cmd +++ b/build.cmd @@ -102,7 +102,7 @@ if /i '%ARG%' == 'all' ( if /i '%ARG%' == 'microbuild' ( set BUILD_PROTO=1 set BUILD_NET40=1 - set BUILD_CORECLR=1 + set BUILD_CORECLR=0 set BUILD_PORTABLE=1 set BUILD_VS=1 set BUILD_SETUP=1 From ed5de912f5ed687e42ec4e1a0ebd2c6ae345bf25 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Sun, 8 May 2016 12:48:28 -0700 Subject: [PATCH 138/334] Skip tests in microbuild --- build.cmd | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.cmd b/build.cmd index 07c479c8168..9d0386d7852 100644 --- a/build.cmd +++ b/build.cmd @@ -106,6 +106,15 @@ if /i '%ARG%' == 'microbuild' ( set BUILD_PORTABLE=1 set BUILD_VS=1 set BUILD_SETUP=1 + + set TEST_COMPILERUNIT=0 + set TEST_NET40_COREUNIT=0 + set TEST_CORECLR=0 + set TEST_PORTABLE_COREUNIT=0 + set TEST_VS=0 + set TEST_FSHARP_SUITE=0 + set TEST_FSHARPQA_SUITE=0 + set SKIP_EXPENSIVE_TESTS=1 ) if /i '%ARG%' == 'proto' ( From 5254d1e22908e322d9af506c5483a5304964fea1 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Sun, 8 May 2016 13:55:28 -0700 Subject: [PATCH 139/334] Prevented item/project templates from generating pdbs --- vsintegration/ItemTemplates/AppConfig/AppConfig.csproj | 1 + vsintegration/ItemTemplates/CodeFile/CodeFile.csproj | 1 + vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj | 1 + vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj | 1 + vsintegration/ItemTemplates/TextFile/TextFile.csproj | 1 + vsintegration/ItemTemplates/XMLFile/XMLFile.csproj | 1 + .../ProjectTemplates/ConsoleProject/ConsoleProject.csproj | 1 + .../ProjectTemplates/LibraryProject/LibraryProject.csproj | 1 + .../ProjectTemplates/NetCore259Project/NetCore259Project.csproj | 1 + .../ProjectTemplates/NetCore78Project/NetCore78Project.csproj | 1 + .../ProjectTemplates/NetCoreProject/NetCoreProject.csproj | 1 + .../PortableLibraryProject/PortableLibraryProject.csproj | 1 + .../SilverlightProject/SilverlightProject.csproj | 1 + .../ProjectTemplates/TutorialProject/TutorialProject.csproj | 1 + 14 files changed, 14 insertions(+) diff --git a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj index 44f7229c131..9ade25df3b8 100644 --- a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj +++ b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index 51b9039653c..bc4e540f926 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index dc0661f24d7..8bd735560f2 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index 2f0c168b660..e75833e9f1d 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index 18babd20332..91062a06f48 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index b7f97c1dafe..8fb39ad587b 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index 2ba803f4a02..092482646cf 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index 4bec3d1a4ab..9b136206b58 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 6687c2115b7..076afb433dc 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index ac0badd9a1d..f9ba4f24e86 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 0e0251e4e4c..66be6d87bc5 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index ec4bc41bf46..56f2483f513 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index d5412632636..44c1d54c3e4 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 24d87f1df8a..2aff9d65835 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -10,6 +10,7 @@ false None true + Template ..\..\..\src From b757790f18abb989f025a12e4eb426141aa8e3e4 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 10 May 2016 11:30:26 -0700 Subject: [PATCH 140/334] Fix building wix setup for multiple languages --- setup/fsharp-setup-build.proj | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj index 1f957273c00..916be4b1637 100644 --- a/setup/fsharp-setup-build.proj +++ b/setup/fsharp-setup-build.proj @@ -1,13 +1,16 @@ + + . net40 + ENU - + @@ -15,21 +18,19 @@ - + - + - + - - From c229973392ffd1e3a5d7d326c15687a45e358ce3 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 10 May 2016 15:36:07 -0700 Subject: [PATCH 141/334] Copy VSIX to setup directory after signing --- vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 1bfe3f43629..bd34128d9ae 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -351,4 +351,12 @@ + + + + + + + + \ No newline at end of file From 549f0c04222f1519fe83311eb52b3682072646b9 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 10 May 2016 17:17:11 -0700 Subject: [PATCH 142/334] Added FSharp.Compiler.Server.Shared.pkgdef --- .gitignore | 1 + ...{InternalsVisibleTo.fs => AssemblyInfo.fs} | 5 ++++ .../FSharp.Compiler.Server.Shared.fsproj | 24 ++++++++++++++++++- src/fsharp/fsi/Fsi.fsproj | 2 +- src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj | 2 +- .../Source.extension.vsixmanifest | 1 + .../VisualFSharpVsix/VisualFSharpVsix.csproj | 2 +- .../fsharp-vsintegration-vsix-build.proj | 3 ++- 8 files changed, 35 insertions(+), 5 deletions(-) rename src/fsharp/FSharp.Compiler.Server.Shared/{InternalsVisibleTo.fs => AssemblyInfo.fs} (91%) diff --git a/.gitignore b/.gitignore index 2ab68013c42..211e7914429 100644 --- a/.gitignore +++ b/.gitignore @@ -94,4 +94,5 @@ ossreadme*.txt *.mdf *.ldf *.cto +*.vstman project.lock.json diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/InternalsVisibleTo.fs b/src/fsharp/FSharp.Compiler.Server.Shared/AssemblyInfo.fs similarity index 91% rename from src/fsharp/FSharp.Compiler.Server.Shared/InternalsVisibleTo.fs rename to src/fsharp/FSharp.Compiler.Server.Shared/AssemblyInfo.fs index 195d257e42d..e5b536f8b6f 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/InternalsVisibleTo.fs +++ b/src/fsharp/FSharp.Compiler.Server.Shared/AssemblyInfo.fs @@ -1,10 +1,15 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.FSharp + open System.Reflection +open Microsoft.VisualStudio.Shell + [] [] [] +[] + do() diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj index 6001757a06b..c5b6dda79a9 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj +++ b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj @@ -11,9 +11,17 @@ {d5870cf0-ed51-4cbc-b3d7-6f56da84ac06} Library FSharp.Compiler.Server.Shared + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true + false + false + true + true + true + v4.6 - + assemblyinfo.FSharp.Compiler.Server.Shared.dll.fs @@ -29,6 +37,19 @@ + + + + + + + + + + + + + {DED3BBD7-53F4-428A-8C9F-27968E768605} @@ -36,4 +57,5 @@ + diff --git a/src/fsharp/fsi/Fsi.fsproj b/src/fsharp/fsi/Fsi.fsproj index 35fce219f64..901d38b9e9d 100644 --- a/src/fsharp/fsi/Fsi.fsproj +++ b/src/fsharp/fsi/Fsi.fsproj @@ -20,10 +20,10 @@ 0x0A000000 EXTENSIONTYPING;COMPILER;$(DefineConstants) $(DefineConstants);PREFERRED_UI_LANG - v3.5 true $(OtherFlags) --warnon:1182 fsi.res + v4.6 $(OtherFlags) --targetprofile:netcore diff --git a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj index 96beb402101..997ec987782 100644 --- a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj +++ b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj @@ -15,10 +15,10 @@ 0x0A000000 EXTENSIONTYPING;COMPILER;$(DefineConstants) $(DefineConstants);PREFERRED_UI_LANG - v3.5 true $(OtherFlags) --warnon:1182 ..\fsi\fsi.res + v4.6 diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 1aee2c892ed..3c8c262b663 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -23,6 +23,7 @@ + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index bd34128d9ae..c2031a766ef 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -182,7 +182,7 @@ {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06} FSharp.Compiler.Server.Shared - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b false diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index fc1fa57e940..3bcead14a6b 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -5,6 +5,8 @@ + + @@ -12,7 +14,6 @@ - From 656578c9e075596e07400189a2a65ad998f187a7 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 10 May 2016 17:58:34 -0700 Subject: [PATCH 143/334] Remove private assemblies from wix projects --- setup/Common.Wix.Properties.wxs | 1 - setup/FSharp.SDK/FSharp.SDK.wixproj | 1 - setup/FSharp.SDK/FSharp.SDK.wxs | 1 - .../Compiler_PrivateAssemblies.wxs | 65 ------------------- vsintegration/update-vsintegration.cmd | 9 --- 5 files changed, 77 deletions(-) delete mode 100644 setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs diff --git a/setup/Common.Wix.Properties.wxs b/setup/Common.Wix.Properties.wxs index bb590d7d31d..8a6d610cb6e 100644 --- a/setup/Common.Wix.Properties.wxs +++ b/setup/Common.Wix.Properties.wxs @@ -39,7 +39,6 @@ - diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj index 8f008813dbc..49b6081da69 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wixproj +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -46,7 +46,6 @@ - diff --git a/setup/FSharp.SDK/FSharp.SDK.wxs b/setup/FSharp.SDK/FSharp.SDK.wxs index 5559097ca49..11b64086912 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wxs +++ b/setup/FSharp.SDK/FSharp.SDK.wxs @@ -29,7 +29,6 @@ - diff --git a/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs b/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs deleted file mode 100644 index 895e101e3cd..00000000000 --- a/setup/FSharp.SDK/component-groups/Compiler_PrivateAssemblies.wxs +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/update-vsintegration.cmd b/vsintegration/update-vsintegration.cmd index 7c0626fcd80..d87d5ee6e6e 100644 --- a/vsintegration/update-vsintegration.cmd +++ b/vsintegration/update-vsintegration.cmd @@ -138,15 +138,6 @@ if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( %SN64% -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a ) -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies" ( - copy /y %BINDIR%\FSharp.Compiler.Server.Shared.dll "%ProgramFiles(x86)%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies\FSharp.Compiler.Server.Shared.dll" - copy /y %BINDIR%\FSharp.Compiler.Interactive.Settings.dll "%ProgramFiles(x86)%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies\FSharp.Compiler.Interactive.Settings.dll" -) -if exist "%ProgramFiles%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies" ( - copy /y %BINDIR%\FSharp.Compiler.Server.Shared.dll "%ProgramFiles%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies\FSharp.Compiler.Server.Shared.dll" - copy /y %BINDIR%\FSharp.Compiler.Interactive.Settings.dll "%ProgramFiles%\Microsoft Visual Studio %VisualStudioVersion%\Common7\IDE\PrivateAssemblies\FSharp.Compiler.Interactive.Settings.dll" -) - rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll "%NGEN32%" install "%COMPILERSDKPATH%\fsc.exe" /queue:1 From ed2d519c377bef06c8cf804d1e0a16870683cfc8 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 10 May 2016 18:03:32 -0700 Subject: [PATCH 144/334] Update DEVGUIDE with new vsix name --- DEVGUIDE.md | 8 ++++---- .../VisualFSharpVsix/Source.extension.vsixmanifest | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index ebf915398be..5b7e783f84a 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -151,13 +151,13 @@ components installed into Visual Studio 15. You can revert this step by disabli For **Debug**: -1. Ensure that the VSIX package is uninstalled. In VS, select Tools/Extensions and Updates and if the package `VisualStudio.FSharp.EnableOpenSource` is installed, select Uninstall -1. Run ``debug\net40\bin\EnableOpenSource.vsix`` +1. Ensure that the VSIX package is uninstalled. In VS, select Tools/Extensions and Updates and if the package `Visual F# Tools` is installed, select Uninstall +1. Run ``debug\net40\bin\VisualFSharpVsix.vsix`` For **Release**: -1. Ensure that the VSIX package is uninstalled. In VS, select Tools/Extensions and Updates and if the package `VisualStudio.FSharp.EnableOpenSource` is installed, select Uninstall -1. Run ``release\net40\bin\EnableOpenSource.vsix`` +1. Ensure that the VSIX package is uninstalled. In VS, select Tools/Extensions and Updates and if the package `Visual F# Tools` is installed, select Uninstall +1. Run ``release\net40\bin\VisualFSharpVsix.vsix`` Restart Visual Studio, it should now be running your freshly-built Visual F# IDE Tools with updated F# Interactive. diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index 3c8c262b663..c2ced20884b 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -3,7 +3,7 @@ - Visual F# Tools Templates + Visual F# Tools Deploy Visual F# Tools templates to Visual Studio From 4ad54917eaf88e51e982d81775b62e6c7cec307d Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Wed, 11 May 2016 18:01:29 +0300 Subject: [PATCH 145/334] fix CallerMemberName for properties add some tests --- src/fsharp/TypeChecker.fs | 16 ++++++++++++---- .../Imported/CallerInfo/CallerMemberName.fs | 13 ++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 997236d893e..4047c365fb9 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9617,18 +9617,26 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt match bind with | NormalizedBinding(vis,bkind,isInline,isMutable,attrs,doc,_,valSynData,pat,NormalizedBindingRhs(spatsL,rtyOpt,rhsExpr),mBinding,spBind) -> - let callerName = + let (SynValData(memberFlagsOpt,valSynInfo,_)) = valSynData + + let callerName = match declKind, bkind, pat with | ExpressionBinding, _, _ -> envinner.eCallerMemberName - | _, _, SynPat.Named(_,name,_,_,_) -> Some(name.idText) + | _, _, SynPat.Named(_,name,_,_,_) -> + match memberFlagsOpt with + | Some(memberFlags) -> + match memberFlags.MemberKind with + | MemberKind.PropertyGet | MemberKind.PropertySet | MemberKind.PropertyGetSet -> Some(name.idText.Substring(4)) + | MemberKind.ClassConstructor -> Some(".ctor") + | MemberKind.Constructor -> Some(".ctor") + | _ -> Some(name.idText) + | _ -> Some(name.idText) | ClassLetBinding, DoBinding, _ -> Some(".ctor") | ModuleOrMemberBinding, StandaloneExpression, _ -> Some(".cctor") | _, _, _ -> envinner.eCallerMemberName let envinner = {envinner with eCallerMemberName = callerName } - let (SynValData(memberFlagsOpt,valSynInfo,_)) = valSynData - let attrTgt = DeclKind.AllowedAttribTargets memberFlagsOpt declKind // Check the attributes of the binding, parameters or return value diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index 28eb7f208b6..dc3b9cbb019 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -3,9 +3,14 @@ namespace Test open System.Runtime.CompilerServices open CSharpLib -type MyTy() = +type MyTy() = static member GetCallerMemberName([] ?memberName : string) = memberName + + static member GetCallerMemberNameProperty + with get () = MyTy.GetCallerMemberName() + + member val GetCallerMemberNameProperty1 = MyTy.GetCallerMemberName() with get, set module Program = [] @@ -15,7 +20,13 @@ module Program = if MyTy.GetCallerMemberName("foo") <> Some("foo") then failwith "Unexpected F# CallerMemberName" + + if MyTy.GetCallerMemberNameProperty <> Some("GetCallerMemberNameProperty") then + failwith "Unexpected F# CallerMemberName" + if MyTy().GetCallerMemberNameProperty1 <> Some("GetCallerMemberNameProperty1") then + failwith "Unexpected F# CallerMemberName" + if CallerInfoTest.MemberName() <> "main" then failwith "Unexpected C# CallerMemberName" From 1508e32749033ad2760d31d23378f89925f2bef0 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 11 May 2016 12:08:10 -0700 Subject: [PATCH 146/334] Created insertion folder after vsix/msi build --- setup/FSharp.SDK/FSharp.SDK.wixproj | 8 ++++++++ vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj index 49b6081da69..9620548e26e 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wixproj +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -62,4 +62,12 @@ + + + + + + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index c2031a766ef..425c43d5358 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -352,11 +352,11 @@ - + - + \ No newline at end of file From f216c80a471e31790566c838944134ced285a48f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 11 May 2016 14:32:24 -0700 Subject: [PATCH 147/334] Added parser id for localizing vsct files --- .../src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj | 1 + 1 file changed, 1 insertion(+) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 48512268a4a..7bcb41872aa 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -45,6 +45,7 @@ false false FSharp.ProjectSystem.FSharp.dll + 210 From fde322923ae9505b40c39b7b17ecab38d1e0bb6f Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Thu, 12 May 2016 01:23:28 -0700 Subject: [PATCH 148/334] Expand CallerMemberName tests --- .../Imported/CallerInfo/CSharpLib.cs | 10 ++ .../Imported/CallerInfo/CallerMemberName.fs | 146 +++++++++++++++--- 2 files changed, 134 insertions(+), 22 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs index 627c9b30181..352115961c3 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CSharpLib.cs @@ -36,4 +36,14 @@ public MyCallerInfoAttribute([CallerLineNumber] int lineNumber = -1) LineNumber = lineNumber; } } + + public class MyCallerMemberNameAttribute : Attribute + { + public string MemberName { get; set; } + + public MyCallerMemberNameAttribute([CallerMemberName] string member = "dflt") + { + MemberName = member; + } + } } \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index dc3b9cbb019..ee73b3f795e 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -1,48 +1,150 @@ namespace Test open System.Runtime.CompilerServices +open System.Reflection open CSharpLib -type MyTy() = +[] +do + () + +[] +type MyTy() = + let functionVal = MyTy.GetCallerMemberName + let typeLetValue = MyTy.GetCallerMemberName() + let typeLetFunc (i:int) = i, MyTy.GetCallerMemberName() + let typeLetFuncNested () = + let nestedFunc () = MyTy.GetCallerMemberName() + nestedFunc () + do + MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), "primary ctor") + + new(i : int) = + MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), ".NET ctor") + MyTy() + + member __.Item + with get(i:int) = MyTy.GetCallerMemberName() + and set(i:int) (v:string option) = + MyTy.Check(MyTy.GetCallerMemberName(), Some("Item"), "index setter") + + member __.CheckMembers() = + MyTy.Check(MyTy.GetCallerMemberName(), Some("CheckMembers"), ".NET method") + MyTy.Check(typeLetValue, Some("typeLetValue"), "type let value") + MyTy.Check(typeLetFunc 2 |> snd, Some("typeLetFunc"), "type let func") + MyTy.Check((typeLetFuncNested ()) , Some("typeLetFuncNested"), "type let func nested") + MyTy.Check(__.GetCallerMemberNameProperty1, Some("GetCallerMemberNameProperty1@"), "auto property getter") + MyTy.Check(MyTy.GetCallerMemberNameProperty, Some("GetCallerMemberNameProperty"), "property getter") + MyTy.GetCallerMemberNameProperty <- Some("test") + MyTy.Check(__.[10], Some("Item"), "indexer getter") + __.[10] <- Some("test") + + let result = + [1..10] + |> List.map (fun i -> MyTy.GetCallerMemberName()) + |> List.head + MyTy.Check(result, Some("CheckMembers"), "lambda") + MyTy.Check(functionVal (), Some("functionVal"), "functionVal") + () + static member GetCallerMemberName([] ?memberName : string) = memberName + + static member Check(actual : string option, expected : string option, message) = + printfn "%A" actual + if actual <> expected then + failwith message static member GetCallerMemberNameProperty with get () = MyTy.GetCallerMemberName() + and set (v : string option) = + MyTy.Check(MyTy.GetCallerMemberName(), Some("GetCallerMemberNameProperty"), "property setter") member val GetCallerMemberNameProperty1 = MyTy.GetCallerMemberName() with get, set +[] +type MyStruct = + val A : int + new(a : int) = + { A = a } + then + MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), "struct ctor") + +[] +type Extensions = + [] + static member DotNetExtensionMeth(instance : System.DateTime) = + MyTy.GetCallerMemberName() + module Program = + type System.String with + member __.StringExtensionMeth() = + MyTy.Check(MyTy.GetCallerMemberName(),Some("StringExtensionMeth"), "extension method") + 1 + member __.StringExtensionProp = + MyTy.Check(MyTy.GetCallerMemberName(), Some("StringExtensionProp"), "extension property") + 2 + + let callerInfoAsFunc = MyTy.GetCallerMemberName + let rebindFunc = callerInfoAsFunc + let moduleLetVal = MyTy.GetCallerMemberName() + let moduleFunc (i : int) = i, MyTy.GetCallerMemberName() + let moduleFuncNested i = + let nestedFunc j = + (j + 1),MyTy.GetCallerMemberName() + nestedFunc i + let ``backtick value name`` = MyTy.GetCallerMemberName() + let (+++) a b = + (a+b, MyTy.GetCallerMemberName()) + + MyTy.Check(MyTy.GetCallerMemberName(), Some(".cctor"), "module cctor") + [] let main (_:string[]) = - if MyTy.GetCallerMemberName() <> Some("main") then - failwith "Unexpected F# CallerMemberName" + MyTy.Check(MyTy.GetCallerMemberName(), Some("main"), "main") - if MyTy.GetCallerMemberName("foo") <> Some("foo") then - failwith "Unexpected F# CallerMemberName" - - if MyTy.GetCallerMemberNameProperty <> Some("GetCallerMemberNameProperty") then - failwith "Unexpected F# CallerMemberName" - - if MyTy().GetCallerMemberNameProperty1 <> Some("GetCallerMemberNameProperty1") then - failwith "Unexpected F# CallerMemberName" - - if CallerInfoTest.MemberName() <> "main" then - failwith "Unexpected C# CallerMemberName" - - if CallerInfoTest.MemberName("foo") <> "foo" then - failwith "Unexpected C# CallerMemberName" + MyTy.Check(MyTy.GetCallerMemberName("foo"), Some("foo"), "passed value") + + MyTy.Check(moduleLetVal, Some("moduleLetVal"), "module let value") + + MyTy.Check(``backtick value name``, Some("backtick value name"), "backtick identifier") + + MyTy.Check(moduleFunc 3 |> snd, Some("moduleFunc"), "module func") + + MyTy.Check(moduleFuncNested 10 |> snd, Some("moduleFuncNested"), "module func nested") + + let inst = MyTy() + inst.CheckMembers() + let inst2 = MyTy(2) + inst2.CheckMembers() + + let v = CallerInfoTest.MemberName() + MyTy.Check(Some(v), Some("main"), "C# main") + + MyTy.Check(Some(CallerInfoTest.MemberName("foo")), Some("foo"), "C# passed value") match CallerInfoTest.AllInfo(21) with | (_, _, "main") -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x - let getCallerLineNumber = CallerInfoTest.MemberName + MyTy.Check(() |> callerInfoAsFunc, Some("callerInfoAsFunc"), "method as function value 1") + MyTy.Check(() |> rebindFunc, Some("callerInfoAsFunc"), "method as function value 2") + + let typeAttr = typeof.GetCustomAttributes(typeof, false).[0] :?> MyCallerMemberNameAttribute + MyTy.Check(Some(typeAttr.MemberName), Some("dflt"), "attribute on type") + + let asmAttr = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof, false).[0] :?> MyCallerMemberNameAttribute + MyTy.Check(Some(asmAttr.MemberName), Some("dflt"), "attribute on asm") + + let s = "123" + let s1 = s.StringExtensionMeth() + let s2 = s.StringExtensionProp + + let dt = System.DateTime.Now + MyTy.Check(dt.DotNetExtensionMeth(), Some("DotNetExtensionMeth"), ".NET extension method") - if () |> CallerInfoTest.MemberName <> "main" then - failwith "Unexpected C# CallerMemberName" + let strct = MyStruct(10) - if getCallerLineNumber () <> "main" then - failwith "Unexpected C# CallerMemberName" + MyTy.Check(1 +++ 2 |> snd, Some("op_PlusPlusPlus"), "operator") 0 \ No newline at end of file From 8927df42d48e8b7d01bb23cb98ba125ebafe426a Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 12 May 2016 12:31:26 +0300 Subject: [PATCH 149/334] fix build --- src/fsharp/vs/Symbols.fs | 4 ++-- src/fsharp/vs/service.fs | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/fsharp/vs/Symbols.fs b/src/fsharp/vs/Symbols.fs index 195a1dc3217..ec3317ddfd1 100644 --- a/src/fsharp/vs/Symbols.fs +++ b/src/fsharp/vs/Symbols.fs @@ -1531,7 +1531,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = match d with | P p -> - [ [ for (ParamData(isParamArrayArg,isOutArg,optArgInfo,nmOpt,_reflArgInfo,pty)) in p.GetParamDatas(cenv.amap,range0) do + [ [ for (ParamData(isParamArrayArg,isOutArg,optArgInfo,_callerInfoInfo,nmOpt,_reflArgInfo,pty)) in p.GetParamDatas(cenv.amap,range0) do // INCOMPLETENESS: Attribs is empty here, so we can't look at attributes for // either .NET or F# parameters let argInfo : ArgReprInfo = { Name=nmOpt; Attribs= [] } @@ -1543,7 +1543,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = | M m -> [ for argtys in m.GetParamDatas(cenv.amap,range0,m.FormalMethodInst) do yield - [ for (ParamData(isParamArrayArg,isOutArg,optArgInfo,nmOpt,_reflArgInfo,pty)) in argtys do + [ for (ParamData(isParamArrayArg,isOutArg,optArgInfo,_callerInfoInfo,nmOpt,_reflArgInfo,pty)) in argtys do // INCOMPLETENESS: Attribs is empty here, so we can't look at attributes for // either .NET or F# parameters let argInfo : ArgReprInfo = { Name=nmOpt; Attribs= [] } diff --git a/src/fsharp/vs/service.fs b/src/fsharp/vs/service.fs index 90f0c9d827c..653d23671d6 100644 --- a/src/fsharp/vs/service.fs +++ b/src/fsharp/vs/service.fs @@ -88,13 +88,13 @@ module internal Params = let ParamOfUnionCaseField g denv isGenerated (i : int) f = let initial = ParamOfRecdField g denv f - let display = if isGenerated i f then initial.Display else NicePrint.stringOfParamData denv (ParamData(false, false, NotOptional, Some f.rfield_id, ReflectedArgInfo.None, f.rfield_type)) + let display = if isGenerated i f then initial.Display else NicePrint.stringOfParamData denv (ParamData(false, false, NotOptional, NoCallerInfo, Some f.rfield_id, ReflectedArgInfo.None, f.rfield_type)) FSharpMethodGroupItemParameter( name=initial.ParameterName, canonicalTypeTextForSorting=initial.CanonicalTypeTextForSorting, display=display) - let ParamOfParamData g denv (ParamData(_isParamArrayArg, _isOutArg, _optArgInfo, nmOpt, _reflArgInfo, pty) as paramData) = + let ParamOfParamData g denv (ParamData(_isParamArrayArg, _isOutArg, _optArgInfo, _callerInfoInfo, nmOpt, _reflArgInfo, pty) as paramData) = FSharpMethodGroupItemParameter( name = (match nmOpt with None -> "" | Some pn -> pn.idText), canonicalTypeTextForSorting = printCanonicalizedTypeName g denv pty, @@ -104,7 +104,7 @@ module internal Params = let ParamsOfParamDatas g denv (paramDatas:ParamData list) rty = let paramNames,paramPrefixes,paramTypes = paramDatas - |> List.map (fun (ParamData(isParamArrayArg, _isOutArg, optArgInfo, nmOpt, _reflArgInfo, pty)) -> + |> List.map (fun (ParamData(isParamArrayArg, _isOutArg, optArgInfo, _callerInfoInfo, nmOpt, _reflArgInfo, pty)) -> let isOptArg = optArgInfo.IsOptional match nmOpt, isOptArg, tryDestOptionTy denv.g pty with // Layout an optional argument @@ -251,7 +251,7 @@ module internal Params = let paramDatas = argInfo |> List.map ParamNameAndType.FromArgInfo - |> List.map (fun (ParamNameAndType(nmOpt, pty)) -> ParamData(false, false, NotOptional, nmOpt, ReflectedArgInfo.None, pty)) + |> List.map (fun (ParamNameAndType(nmOpt, pty)) -> ParamData(false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None, pty)) ParamsOfParamDatas g denv paramDatas returnTy | Item.UnionCase(ucr,_) -> match ucr.UnionCase.RecdFields with @@ -281,7 +281,7 @@ module internal Params = | None -> let argNamesAndTys = ItemDescriptionsImpl.ParamNameAndTypesOfUnaryCustomOperation g minfo let _, argTys, _ = PrettyTypes.PrettifyTypesN g (argNamesAndTys |> List.map (fun (ParamNameAndType(_,ty)) -> ty)) - let paramDatas = (argNamesAndTys, argTys) ||> List.map2 (fun (ParamNameAndType(nmOpt, _)) argTy -> ParamData(false, false, NotOptional, nmOpt, ReflectedArgInfo.None,argTy)) + let paramDatas = (argNamesAndTys, argTys) ||> List.map2 (fun (ParamNameAndType(nmOpt, _)) argTy -> ParamData(false, false, NotOptional, NoCallerInfo, nmOpt, ReflectedArgInfo.None,argTy)) let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst) ParamsOfParamDatas g denv paramDatas rty | Some _ -> @@ -290,7 +290,7 @@ module internal Params = | Item.FakeInterfaceCtor _ -> [] | Item.DelegateCtor delty -> let (SigOfFunctionForDelegate(_, _, _, fty)) = GetSigOfFunctionForDelegate infoReader delty m AccessibleFromSomeFSharpCode - ParamsOfParamDatas g denv [ParamData(false, false, NotOptional, None, ReflectedArgInfo.None, fty)] delty + ParamsOfParamDatas g denv [ParamData(false, false, NotOptional, NoCallerInfo, None, ReflectedArgInfo.None, fty)] delty | _ -> [] @@ -653,7 +653,7 @@ type TypeCheckInfo methods |> List.collect (fun meth -> match meth.GetParamDatas(amap, m, meth.FormalMethodInst) with - | x::_ -> x |> List.choose(fun (ParamData(_isParamArray, _isOut, _optArgInfo, name, _, ty)) -> + | x::_ -> x |> List.choose(fun (ParamData(_isParamArray, _isOut, _optArgInfo, _callerInfoInfo, name, _, ty)) -> match name with | Some n -> Some (Item.ArgName(n, ty, Some (ArgumentContainer.Method meth))) | None -> None From 72d70e4b8fa24bca697498f32c28e40ad41e69ca Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 12 May 2016 17:35:34 +0100 Subject: [PATCH 150/334] updates for testing --- src/fsharp/FSComp.txt | 2 +- src/fsharp/TypeChecker.fs | 179 +- .../core/members/basics-hw-mutrec/test.fsx | 5591 +++++++++++++++++ tests/fsharp/core/tests_core.fs | 9 + tests/fsharp/typecheck/tests_typecheck.fs | 3 +- .../StaticLetDoDeclarations/E_RecMutable01.fs | 2 +- 6 files changed, 5708 insertions(+), 78 deletions(-) create mode 100644 tests/fsharp/core/members/basics-hw-mutrec/test.fsx diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index c8f3344942f..3e0e96dd73b 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -688,7 +688,7 @@ tcUnnamedArgumentsDoNotFormPrefix,"The unnamed arguments do not form a prefix of 871,tcConstructorsIllegalForThisType,"Constructors cannot be defined for this type" 872,tcRecursiveBindingsWithMembersMustBeDirectAugmentation,"Recursive bindings that include member specifications can only occur as a direct augmentation of a type" 873,tcOnlySimplePatternsInLetRec,"Only simple variable patterns can be bound in 'let rec' constructs" -874,tcOnlyRecordFieldsAndSimpleLetCanBeMutable,"Only record fields and simple 'let' bindings may be marked mutable" +874,tcOnlyRecordFieldsAndSimpleLetCanBeMutable,"Only record fields and simple, non-recursive 'let' bindings may be marked mutable" 875,tcMemberIsNotSufficientlyGeneric,"This member is not sufficiently generic" 876,tcLiteralAttributeRequiresConstantValue,"A declaration may only be the [] attribute if a constant value is also given, e.g. 'val x : int = 1'" 877,tcValueInSignatureRequiresLiteralAttribute,"A declaration may only be given a value in a signature if the declaration has the [] attribute" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index eb8c61e2a97..72329cd5503 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -902,7 +902,7 @@ let AdjustValSynInfoInSignature g ty (SynValInfo(argsData,retData) as sigMD) = /// The ValReprInfo for a value, except the number of typars is not yet inferred type PartialValReprInfo = PartialValReprInfo of ArgReprInfo list list * ArgReprInfo -let TranslateTopArgSynInfo isArg m tcAttribute (SynArgInfo(attrs,isOpt,nm)) = +let TranslateTopArgSynInfo isArg m tcAttributes (SynArgInfo(attrs,isOpt,nm)) = // Synthesize an artificial "OptionalArgument" attribute for the parameter let optAttrs = if isOpt then @@ -921,7 +921,7 @@ let TranslateTopArgSynInfo isArg m tcAttribute (SynArgInfo(attrs,isOpt,nm)) = errorR(Error(FSComp.SR.tcReturnValuesCannotHaveNames(),m)) // Call the attribute checking function - let attribs = tcAttribute (optAttrs@attrs) + let attribs = tcAttributes (optAttrs@attrs) ({ Attribs = attribs; Name = nm } : ArgReprInfo) /// Members have an arity inferred from their syntax. This "valSynData" is not quite the same as the arities @@ -930,9 +930,9 @@ let TranslateTopArgSynInfo isArg m tcAttribute (SynArgInfo(attrs,isOpt,nm)) = /// Hence remove all "zeros" from arity and replace them with 1 here. /// Note we currently use the compiled form for choosing unique names, to distinguish overloads because this must match up /// between signature and implementation, and the signature just has "unit". -let TranslateTopValSynInfo m tcAttribute (SynValInfo(argsData,retData)) = - PartialValReprInfo (argsData |> List.mapSquared (TranslateTopArgSynInfo true m (tcAttribute AttributeTargets.Parameter)), - retData |> TranslateTopArgSynInfo false m (tcAttribute AttributeTargets.ReturnValue)) +let TranslateTopValSynInfo m tcAttributes (SynValInfo(argsData,retData)) = + PartialValReprInfo (argsData |> List.mapSquared (TranslateTopArgSynInfo true m (tcAttributes AttributeTargets.Parameter)), + retData |> TranslateTopArgSynInfo false m (tcAttributes AttributeTargets.ReturnValue)) let TranslatePartialArity tps (PartialValReprInfo (argsData,retData)) = ValReprInfo(ValReprInfo.InferTyparInfo tps,argsData,retData) @@ -3951,11 +3951,11 @@ type MutRecDefnsInitialData = MutRecShape list -type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * ParentRef * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK +type MutRecDefnsPhase2DataForTycon = MutRecDefnsPhase2DataForTycon of Tycon option * ParentRef * DeclKind * TyconRef * Val option * SafeInitData * Typars * SynMemberDefn list * range * NewSlotsOK * fixupFinalAttribs: (unit -> unit) type MutRecDefnsPhase2DataForModule = MutRecDefnsPhase2DataForModule of ModuleOrNamespaceType ref * ModuleOrNamespace type MutRecDefnsPhase2Data = MutRecShape list -type MutRecDefnsPhase2InfoForTycon = MutRecDefnsPhase2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list +type MutRecDefnsPhase2InfoForTycon = MutRecDefnsPhase2InfoForTycon of Tycon option * TyconRef * Typars * DeclKind * TyconBindingDefn list * fixupFinalAttrs: (unit -> unit) type MutRecDefnsPhase2Info = MutRecShape list @@ -9954,7 +9954,7 @@ and TcNonRecursiveBinding declKind cenv env tpenv ty b = // TcAttribute* //------------------------------------------------------------------------ -and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = +and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let (LongIdentWithDots(tycon,_))= synAttr.TypeName let arg = synAttr.ArgExpr let targetIndicator = synAttr.Target @@ -9986,7 +9986,7 @@ and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = match conditionalCallDefineOpt with | Some d when not (List.mem d cenv.conditionalDefines) -> - [] + [], false | _ -> // REVIEW: take notice of inherited? @@ -10045,7 +10045,10 @@ and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = else error(Error(FSComp.SR.tcAttributeIsNotValidForLanguageElement(),mAttr)) - let item = ForceRaise (ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mAttr ad ty) + match ResolveObjectConstructor cenv.nameResolver env.DisplayEnv mAttr ad ty with + | ResultOrException.Exception _ when canFail -> [ ], true + | res -> + let item = ForceRaise res let attrib = match item with | Item.CtorGroup(methodName,minfos) -> @@ -10097,9 +10100,9 @@ and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let args = args |> List.map mkAttribExpr Attrib(tcref,ILAttrib(ilMethRef),args,namedAttribArgMap,isAppliedToGetterOrSetter,Some constrainedTgts,m) - | Expr.App(Expr.Val(vref,_,_),_,_,args,_) -> - let try_dest_unit_or_tuple = function Expr.Const(Const.Unit,_,_) -> [] | expr -> tryDestTuple expr - let args = args |> List.collect (try_dest_unit_or_tuple) |> List.map mkAttribExpr + | Expr.App((InnerExprPat(ExprValWithPossibleTypeInst(vref,_,_,_))),_,_,args,_) -> + let tryDestUnitOrTuple = function Expr.Const(Const.Unit,_,_) -> [] | expr -> tryDestTuple expr + let args = args |> List.collect tryDestUnitOrTuple |> List.map mkAttribExpr Attrib(tcref,FSAttrib(vref),args,namedAttribArgMap,isAppliedToGetterOrSetter,Some constrainedTgts,mAttr) | _ -> @@ -10108,13 +10111,13 @@ and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = | _ -> error(Error(FSComp.SR.tcAttributeExpressionsMustBeConstructorCalls(),mAttr)) - [ (constrainedTgts, attrib) ] + [ (constrainedTgts, attrib) ], false -and TcAttributesWithPossibleTargets cenv env attrTgt synAttribs = +and TcAttributesWithPossibleTargets canFail cenv env attrTgt synAttribs = - synAttribs |> List.collect (fun synAttrib -> + (false,synAttribs) ||> List.collectFold (fun didFail synAttrib -> try - let attribsAndTargets = TcAttribute cenv env attrTgt synAttrib + let attribsAndTargets, didFail2 = TcAttribute canFail cenv env attrTgt synAttrib // This is where we place any checks that completely exclude the use of some particular // attributes from F#. @@ -10124,14 +10127,22 @@ and TcAttributesWithPossibleTargets cenv env attrTgt synAttribs = HasFSharpAttribute cenv.g cenv.g.attrib_CompilationMappingAttribute attribs then errorR(Error(FSComp.SR.tcUnsupportedAttribute(),synAttrib.Range)) - attribsAndTargets + attribsAndTargets, didFail || didFail2 with e -> errorRecovery e synAttrib.Range - []) + [], false) + +and TcAttributesMaybeFail canFail cenv env attrTgt synAttribs = + let attribsAndTargets, didFail = TcAttributesWithPossibleTargets canFail cenv env attrTgt synAttribs + attribsAndTargets |> List.map snd, didFail + +and TcAttributesCanFail cenv env attrTgt synAttribs = + let attrs, didFail = TcAttributesMaybeFail true cenv env attrTgt synAttribs + attrs, (fun () -> if didFail then TcAttributes cenv env attrTgt synAttribs else attrs) and TcAttributes cenv env attrTgt synAttribs = - TcAttributesWithPossibleTargets cenv env attrTgt synAttribs |> List.map snd + TcAttributesMaybeFail false cenv env attrTgt synAttribs |> fst //------------------------------------------------------------------------- // TcLetBinding @@ -11326,7 +11337,7 @@ module TcRecdUnionAndEnumDeclarations = begin NewRecdField isStatic konst id ty' isMutable vol attrsForProperty attrsForField xmldoc vis false let TcFieldDecl cenv env parent isIncrClass tpenv (isStatic,synAttrs,id,ty,isMutable,xmldoc,vis,m) = - let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.FieldDecl synAttrs + let attrs, _ = TcAttributesWithPossibleTargets false cenv env AttributeTargets.FieldDecl synAttrs let attrsForProperty,attrsForField = attrs |> List.partition (fun (attrTargets,_) -> (attrTargets &&& AttributeTargets.Property) <> enum 0) let attrsForProperty = (List.map snd attrsForProperty) let attrsForField = (List.map snd attrsForField) @@ -11348,7 +11359,7 @@ module TcRecdUnionAndEnumDeclarations = begin match parent with | Parent tcref when useGenuineField tcref.Deref rfspec -> // Recheck the attributes for errors if the definition only generates a field - TcAttributesWithPossibleTargets cenv env AttributeTargets.FieldDeclRestricted synAttrs |> ignore + TcAttributesWithPossibleTargets false cenv env AttributeTargets.FieldDeclRestricted synAttrs |> ignore | _ -> () rfspec @@ -12435,7 +12446,7 @@ module MutRecBindingChecking = let defnAs = MutRecShape.Lets binds defnAs,(tpenv,recBindIdx,List.rev binds @ uncheckedBindsRev) - | MutRecShape.Tycon (MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, binds)) -> + | MutRecShape.Tycon (MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, binds, _)) -> // Class members can access protected members of the implemented type // Class members can access private members in the typ @@ -12993,7 +13004,7 @@ module MutRecBindingChecking = /// Compute the active environments within each nested module. - let TcMutRecDefns_ComputeEnvs (cenv: cenv) report getTyconOpt scopem m envInitial mutRecShape = + let TcMutRecDefns_ComputeEnvs getTyconOpt getVals (cenv: cenv) report scopem m envInitial mutRecShape = (envInitial, mutRecShape) ||> MutRecShapes.computeEnvs (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> @@ -13002,6 +13013,7 @@ module MutRecBindingChecking = let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) let moduleAbbrevs = decls |> List.choose (function MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev (id,mp,m)) -> Some (id,mp,m) | _ -> None) let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpen (mp,m)) -> Some (mp,m) | _ -> None) + let lets = decls |> List.collect (function MutRecShape.Lets binds -> getVals binds | _ -> []) // Add the type definitions, exceptions, modules and "open" declarations let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envAbove else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove @@ -13009,6 +13021,7 @@ module MutRecBindingChecking = let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) let envForDecls = (envForDecls, moduleAbbrevs) ||> List.fold (TcModuleAbbrevDecl cenv scopem) + let envForDecls = AddLocalVals cenv.tcSink scopem lets envForDecls envForDecls) /// Check the members and 'let' definitions in a mutually recursive group of definitions. @@ -13021,6 +13034,10 @@ module MutRecBindingChecking = // Phase2A: also processes their arg patterns - collecting type assertions let (defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRecPrelimWithReprs, mutRecDefns) + // Now basic member values are created we can compute the final attributes (i.e. in the case where attributes refer to constructors being defined) + mutRecDefns |> MutRecShapes.iterTycons (fun (MutRecDefnsPhase2InfoForTycon(_, _, _, _, _, fixupFinalAttrs)) -> + fixupFinalAttrs()) + // Updates the types of the modules to contain the inferred contents to far, which includes values and members defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) @@ -13029,7 +13046,10 @@ module MutRecBindingChecking = // We must open all modules from scratch again because there may be extension methods and/or AutoOpen let envMutRec, defnsAs = (envInitial, MutRecShapes.dropEnvs defnsAs) - ||> TcMutRecDefns_ComputeEnvs cenv false (fun (TyconBindingsPhase2A(tyconOpt,_,_,_,_,_,_)) -> tyconOpt) scopem scopem + ||> TcMutRecDefns_ComputeEnvs + (fun (TyconBindingsPhase2A(tyconOpt,_,_,_,_,_,_)) -> tyconOpt) + (fun binds -> [ for bind in binds -> bind.RecBindingInfo.Val ]) + cenv false scopem scopem ||> MutRecShapes.extendEnvs (fun envForDecls decls -> let prelimRecValues = @@ -13142,7 +13162,7 @@ module MutRecBindingChecking = /// Check and generalize the interface implementations, members, 'let' definitions in a mutually recursive group of definitions. let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = - let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) members |> List.collect (function | SynMemberDefn.Interface(ity,defnOpt,_) -> @@ -13175,7 +13195,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec | _ -> []) let interfaceMembersFromTypeDefn tyconMembersData (ity',defn,_) implTySet = - let (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK)) = tyconMembersData + let (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK, _)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity',implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) defn |> List.choose (fun mem -> match mem with @@ -13188,7 +13208,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec try // Some preliminary checks mutRecDefns |> MutRecShapes.iterTycons (fun tyconData -> - let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, _, members, m, newslotsOK)) = tyconData + let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, _, members, m, newslotsOK, _)) = tyconData let tcaug = tcref.TypeContents if tcaug.tcaug_closed && declKind <> ExtrinsicExtensionBinding then error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type",m)) @@ -13204,7 +13224,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec // The rest should have been removed by splitting, they belong to "core" (they are "shape" of type, not implementation) | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(),mem.Range)))) - let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK)) = + let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK, _)) = let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) members |> List.choose (fun memb -> @@ -13229,13 +13249,13 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec let binds : MutRecDefnsPhase2Info = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> - let (MutRecDefnsPhase2DataForTycon(tyconOpt, _, declKind, tcref, _, _, declaredTyconTypars, _, _, _)) = tyconData + let (MutRecDefnsPhase2DataForTycon(tyconOpt, _, declKind, tcref, _, _, declaredTyconTypars, _, _, _, fixupFinalAttrs)) = tyconData let obinds = tyconBindingsOfTypeDefn tyconData let ibinds = let intfTypes = interfacesFromTypeDefn envForDecls tyconData let slotImplSets = DispatchSlotChecking.GetSlotImplSets cenv.infoReader envForDecls.DisplayEnv false (List.map (fun (ity,_,m) -> (ity,m)) intfTypes) (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat - MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds)) + MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds, fixupFinalAttrs)) MutRecBindingChecking.TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRec, binds) @@ -13734,7 +13754,7 @@ module TcExceptionDeclarations = let binds1,exnc = TcExnDefnCore cenv envInitial parent core let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) - let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots))] + let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots, (fun () -> ())))] let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type @@ -13931,9 +13951,10 @@ module EstablishTypeDefinitionCores = let (ComponentInfo(synAttrs,typars, _,_, _, _,_,_)) = synTyconInfo let m = tycon.Range let id = tycon.Id - // 'Check' the attributes. We return the results to avoid having to re-check them in all other phases. - let attrs = TcAttributes cenv envinner AttributeTargets.TyconDecl synAttrs + // 'Check' the attributes. We return the results to avoid having to re-check them in all other phases. + // Allow failure of constructor resolution because Vals for members in the same recursive group are not yet available + let attrs, getFinalAttrs = TcAttributesCanFail cenv envinner AttributeTargets.TyconDecl synAttrs let hasMeasureAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureAttribute attrs // Set the compiled name, if any @@ -14009,7 +14030,7 @@ module EstablishTypeDefinitionCores = // OK, now fill in the (partially computed) type representation tycon.Data.entity_tycon_repr <- repr - attrs + attrs, getFinalAttrs #if EXTENSIONTYPING /// Get the items on the r.h.s. of a 'type X = ABC<...>' definition @@ -14207,14 +14228,13 @@ module EstablishTypeDefinitionCores = // such as 'isTupleTy' will return reliable results, e.g. isTupleTy on the /// TAST type for 'PairOfInts' will report 'true' // - let private TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envinner inSig tpenv pass (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (attrs:Attribs) = let m = tycon.Range let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) try let id = tycon.Id let thisTyconRef = mkLocalTyconRef tycon - let attrs = checkedAttrs let hasMeasureAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureAttribute attrs let hasMeasureableAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureableAttribute attrs @@ -14270,7 +14290,7 @@ module EstablishTypeDefinitionCores = // Third phase: check and publish the supr types. Run twice, once before constraints are established // and once after - let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * Attribs) option),_,_,_,_> list) = + let private TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig pass (envMutRec, mutRecDefns:MutRecShape<(_ * (Tycon * (Attribs * _)) option),_,_,_,_> list) = let checkCxs = if (pass = SecondPass) then CheckCxs else NoCheckCxs let firstPass = (pass = FirstPass) @@ -14278,7 +14298,7 @@ module EstablishTypeDefinitionCores = let tyconWithImplementsL = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envinner (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (typeDefCore,_,_), Some (tycon, checkedAttrs) -> + | (typeDefCore,_,_), Some (tycon, (attrs,_)) -> let (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,explicitImplements,_,_,_)) = typeDefCore let m = tycon.Range let tcref = mkLocalTyconRef tycon @@ -14287,8 +14307,6 @@ module EstablishTypeDefinitionCores = let implementedTys,_ = List.mapFold (mapFoldFst (TcTypeAndRecover cenv NoNewTypars checkCxs ItemOccurence.UseInType envinner)) tpenv explicitImplements - let attrs = checkedAttrs - if firstPass then tycon.Data.entity_attribs <- attrs @@ -14370,15 +14388,13 @@ module EstablishTypeDefinitionCores = with e -> errorRecovery e m)) /// Establish the fields, dispatch slots and union cases of a type - let private TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (checkedAttrs:Attribs) = + let private TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envinner tpenv inSig (MutRecDefnsPhase1DataForTycon(_,synTyconRepr,_,_,_,_)) (tycon:Tycon) (attrs:Attribs) = let m = tycon.Range try let id = tycon.Id let thisTyconRef = mkLocalTyconRef tycon let innerParent = Parent(thisTyconRef) let thisTyInst,thisTy = generalizeTyconRef thisTyconRef - let attrs = checkedAttrs - let hasAbstractAttr = HasFSharpAttribute cenv.g cenv.g.attrib_AbstractClassAttribute attrs let hasSealedAttr = @@ -14999,7 +15015,7 @@ module EstablishTypeDefinitionCores = // Add the types to the environment. This does not add the fields and union cases (because we haven't established them yet). // We re-add them to the original environment later on. We don't report them to the Language Service yet as we don't know if // they are well-formed (e.g. free of abbreviation cycles) - let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv false snd scopem m + let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs snd (fun _ -> []) cenv false scopem m // Updates the types of the modules to contain the inferred contents so far withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> @@ -15020,7 +15036,7 @@ module EstablishTypeDefinitionCores = // Phase 1C. Establish the abbreviations (no constraint checking, because constraints not yet established) (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (typeDefCore, _,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass typeDefCore tycon attrs + | (typeDefCore, _,_), Some (tycon,(attrs,_)) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv FirstPass typeDefCore tycon attrs | _ -> ()) // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. @@ -15061,7 +15077,7 @@ module EstablishTypeDefinitionCores = // Phase1E. OK, now recheck the abbreviations, super/interface and explicit constraints types (this time checking constraints) (envMutRecPrelim, withAttrs) ||> MutRecShapes.iterTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> match origInfo, tyconAndAttrsOpt with - | (typeDefCore, _, _), Some (tycon,attrs) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass typeDefCore tycon attrs + | (typeDefCore, _, _), Some (tycon,(attrs,_)) -> TcTyconDefnCore_Phase1C_Phase1E_EstablishAbbreviations cenv envForDecls inSig tpenv SecondPass typeDefCore tycon attrs | _ -> ()) // Phase1F. Establish inheritance hierarchy @@ -15085,9 +15101,14 @@ module EstablishTypeDefinitionCores = (envMutRecPrelim,withAttrs) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls (origInfo,tyconAndAttrsOpt) -> let info = match origInfo, tyconAndAttrsOpt with - | (typeDefCore,_,_), Some (tycon,attrs) -> TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envForDecls tpenv inSig typeDefCore tycon attrs + | (typeDefCore,_,_), Some (tycon,(attrs,_)) -> TcTyconDefnCore_Phase1G_EstablishRepresentation cenv envForDecls tpenv inSig typeDefCore tycon attrs | _ -> None, NoSafeInitInfo - (origInfo, Option.map fst tyconAndAttrsOpt, info)) + let tyconOpt, fixupFinalAttrs = + match tyconAndAttrsOpt with + | None -> None, (fun () -> ()) + | Some (tycon, (_prelimAttrs, getFinalAttrs)) -> Some tycon, (fun () -> tycon.Data.entity_attribs <- getFinalAttrs()) + + (origInfo, tyconOpt, fixupFinalAttrs, info)) // Now check for cyclic structs and inheritance. It's possible these should be checked as separate conditions. // REVIEW: checking for cyclic inheritance is happening too late. See note above. @@ -15101,10 +15122,13 @@ module TcDeclarations = begin /// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an /// intrinsic or extrinsic extension - let private ComputeTyconDeclKind isAtOriginalTyconDefn cenv envInitial inSig m (typars:SynTyparDecl list) cs longPath = + let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envInitial inSig m (typars:SynTyparDecl list) cs longPath = let ad = envInitial.eAccessRights let tcref = + match tyconOpt with + | Some tycon when isAtOriginalTyconDefn -> mkLocalTyconRef tycon + | _ -> let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs typars.Length match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envInitial.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with | Result res -> res @@ -15118,14 +15142,6 @@ module TcDeclarations = begin tcref.Deref.IsFSharpDelegateTycon || tcref.Deref.IsFSharpEnumTycon - let isInSameModuleOrNamespace = - match envInitial.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with - | Some tycon -> (tyconOrder.Compare(tcref.Deref,tycon) = 0) - | None -> - //false - // There is a special case we allow when compiling FSharp.Core.dll which permits interface implementations across namespace fragments - (cenv.g.compilingFslib && tcref.LogicalName.StartsWith("Tuple`")) - let reqTypars = tcref.Typars(m) // Member definitions are intrinsic (added directly to the type) if: @@ -15133,10 +15149,19 @@ module TcDeclarations = begin // Augmentations to interfaces via partial type defns will always be extensions, e.g. extension members on interfaces. // b) For other types, if the type is isInSameModuleOrNamespace let declKind,typars = - if isAtOriginalTyconDefn then - ModuleOrMemberBinding, reqTypars + if isAtOriginalTyconDefn then + ModuleOrMemberBinding, reqTypars - elif isInSameModuleOrNamespace && not isInterfaceOrDelegateOrEnum then + else + let isInSameModuleOrNamespace = + match envInitial.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with + | Some tycon -> (tyconOrder.Compare(tcref.Deref,tycon) = 0) + | None -> + //false + // There is a special case we allow when compiling FSharp.Core.dll which permits interface implementations across namespace fragments + (cenv.g.compilingFslib && tcref.LogicalName.StartsWith("Tuple`")) + + if isInSameModuleOrNamespace && not isInterfaceOrDelegateOrEnum then IntrinsicExtensionBinding, reqTypars else if isInSameModuleOrNamespace && isInterfaceOrDelegateOrEnum then @@ -15381,33 +15406,33 @@ module TcDeclarations = begin | _ -> false) let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m) let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) - let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isAtOriginalTyconDefn) core, members @ extraMembers | SynTypeDefnRepr.Simple(repr,_) -> let members = [] let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) - let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,repr,implements1,false,false,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements1, false, false, isAtOriginalTyconDefn) core, members @ extraMembers | SynTypeDefnRepr.Exception(r) -> let isAtOriginalTyconDefn = true - let core = MutRecDefnsPhase1DataForTycon(synTyconInfo,SynTypeDefnSimpleRepr.Exception r,implements1,false,false,isAtOriginalTyconDefn) + let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, SynTypeDefnSimpleRepr.Exception r, implements1, false, false, isAtOriginalTyconDefn) core, extraMembers let SplitMutRecDefns mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn - let private PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv innerParent envMutRecPrelim (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclm, m) = + let private PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envMutRecPrelim (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclRange) = let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo - let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envMutRecPrelim false tyDeclm typars cs longPath + let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envMutRecPrelim false tyDeclRange typars cs longPath let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) // NewSlotsOK only on fsobjs - if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclm)) + if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclRange)) - MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, m, newslotsOK) + MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs) //------------------------------------------------------------------------- // Bind type definitions - main @@ -15423,9 +15448,9 @@ module TcDeclarations = begin let mutRecDefnsAfterPrep = (envMutRecPrelim,mutRecDefnsAfterCore) - ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((typeDefnCore, members, innerParent), tyconOpt, (baseValOpt, safeInitInfo)) -> + ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((typeDefnCore, members, innerParent), tyconOpt, fixupFinalAttrs, (baseValOpt, safeInitInfo)) -> let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore - PrepareTyconMemberDefns tyconOpt isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range, m)) + PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range)) // By now we've established the full contents of type definitions apart from their // members and any fields determined by implicit construction. We know the kinds and @@ -15436,7 +15461,11 @@ module TcDeclarations = begin // Note: This environment reconstruction doesn't seem necessary. We're about to create Val's for all members, // which does require type checking, but no more information than is already available. let envMutRecPrelimWithReprs, withEnvs = - (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs cenv true (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _)) -> tyconOpt) scopem m + (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterPrep) + ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs + (fun (MutRecDefnsPhase2DataForTycon(tyconOpt, _, _, _, _, _, _, _, _, _, _)) -> tyconOpt) + (fun _binds -> [ (* no values are available yet *) ]) + cenv true scopem m // Check the members and decide on representations for types with implicit constructors. let withBindings,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRecPrelimWithReprs, withEnvs) @@ -15530,11 +15559,11 @@ module TcDeclarations = begin let private TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefns = (envMutRec,mutRecDefns) ||> MutRecShapes.mapWithEnv // Do this for the members in each 'type' declaration - (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), _, _) -> + (fun envForDecls ((tyconCore, (synTyconInfo,members), innerParent), tyconOpt, _fixupFinalAttrs, _) -> let tpenv = emptyUnscopedTyparEnv let (MutRecDefnsPhase1DataForTycon (_, _, _, _, _, isAtOriginalTyconDefn)) = tyconCore let (ComponentInfo(_,typars,cs,longPath, _, _, _,m)) = synTyconInfo - let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath + let declKind,tcref,declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls true m typars cs longPath let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTyconTypars envForDecls let envForTycon = MakeInnerEnvForTyconRef cenv envForTycon tcref (declKind = ExtrinsicExtensionBinding) @@ -15874,7 +15903,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = | SynModuleDecl.DoExpr _ -> return! failwith "unreachable" | SynModuleDecl.Attributes (synAttrs,_) -> - let attrs = TcAttributesWithPossibleTargets cenv env AttributeTargets.Top synAttrs + let attrs, _ = TcAttributesWithPossibleTargets false cenv env AttributeTargets.Top synAttrs return ((fun e -> e), attrs), env, env | SynModuleDecl.HashDirective _ -> @@ -16038,7 +16067,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns,m,scopem) // Check the assembly attributes - let attrs = TcAttributesWithPossibleTargets cenv envAfter AttributeTargets.Top synAttrs + let attrs, _ = TcAttributesWithPossibleTargets false cenv envAfter AttributeTargets.Top synAttrs // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = diff --git a/tests/fsharp/core/members/basics-hw-mutrec/test.fsx b/tests/fsharp/core/members/basics-hw-mutrec/test.fsx new file mode 100644 index 00000000000..03f308debf1 --- /dev/null +++ b/tests/fsharp/core/members/basics-hw-mutrec/test.fsx @@ -0,0 +1,5591 @@ +// #Regression #Conformance #SignatureFiles #Classes #ObjectConstructors #ObjectOrientedTypes #Fields #MemberDefinitions #MethodsAndProperties #Unions #InterfacesAndImplementations #Events #Overloading #Recursion #Regression + + + +module rec Tests + +open System +open System.Collections +open System.Collections.Generic +open System.Diagnostics +open System.Windows.Forms + +let failures = ref [] +let report_failure s = + stderr.WriteLine " NO"; failures := s :: failures.Value +let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure s +let check s v1 v2 = test s (v1 = v2) + +//-------------------------------------------------------------- +// Test defining a record using object-expression syntax + +type RecordType = { a: int; mutable b: int } + +let rval = { new RecordType with a = 1 and b = 2 } +let rvalaaa2 = { new RecordType + with a = 1 + and b = 2 } + +test "fweoew091" (rval.a = 1) +test "fweoew092" (rval.b = 2) +rval.b <- 3 +test "fweoew093" (rval.b = 3) + +type RecordType2<'a,'b> = { a: 'a; mutable b: 'b } + +let rval2 = { new RecordType2 with a = 1 and b = 2 } + +test "fweoew091" (rval2.a = 1) +test "fweoew092" (rval2.b = 2) +rval2.b <- 3 +test "fweoew093" (rval2.b = 3) + +let f(x) = + { new RecordType2<'a,int> with a = x and b = 2 } + +test "fweoew091" ((f(1)).a = 1) +test "fweoew092" ((f(1)).b = 2) +(f(1)).b <- 3 +test "fweoew093" ((f(1)).b = 2) + + + + + + +//----------------------------------------- +// Some simple object-expression tests + +let x0 = { new System.Object() with member __.GetHashCode() = 3 } +let x1 = { new System.Windows.Forms.Form() with member __.GetHashCode() = 3 } + +//----------------------------------------- +// Test defining an F# class + + +type ClassType1 = + class + inherit System.Object + val someField : string + + interface IEnumerable + + abstract VirtualMethod1: string -> int + abstract VirtualMethod2: string * string -> int + abstract VirtualMethod1PostHoc: string -> int + abstract VirtualMethod2PostHoc: string * string -> int + default x.VirtualMethod1(s) = 3 + default x.VirtualMethod2(s1,s2) = 3 + + new(s: string) = { inherit System.Object(); someField = "abc" } + end + +type ClassType1 + with + default x.VirtualMethod1PostHoc(s) = 3 + default x.VirtualMethod2PostHoc(s1,s2) = 3 + new(s1,s2) = + { inherit System.Object(); someField = "constructor2" + s1 + s2 } + end + + + +type ClassType1 + with + member x.GetEnumerator() = failwith "no implementation" + interface IEnumerable + with + member x.GetEnumerator() = failwith "no implementation" + end + end +let x = 1 + +let x2 = { new ClassType1("a") with member __.GetHashCode() = 3 } +let x3 = { new ClassType1("a") with member __.VirtualMethod1(s) = 4 } +let x4 = { new ClassType1("a") with + member __.VirtualMethod1(s) = 5 + member __.VirtualMethod2(s1,s2) = s1.Length + s2.Length } + + + +test "e09wckj2d" (try ignore((x2 :> IEnumerable).GetEnumerator()); false with Failure "no implementation" -> true) + +test "e09wckj2ddwdw" (try ignore(((x2 :> obj) :?> IEnumerable).GetEnumerator()); false with Failure "no implementation" -> true) +test "e09wckj2defwe" (x2.VirtualMethod1("abc") = 3) +test "e09wckd2jfew3" (x3.VirtualMethod1("abc") = 4) +test "e09wckf3q2j" (x4.VirtualMethod1("abc") = 5) +test "e09wckj321" (x4.VirtualMethod2("abc","d") = 4) + + +//----------------------------------------- +// Test inheriting from an F# type + + +type ClassType2 = + class + inherit ClassType1 + val someField2 : string + + override x.VirtualMethod1(s) = 2001 + override x.VirtualMethod2(s1,s2) = s1.Length + s2.Length + String.length x.someField2 + + new(s) = { inherit ClassType1(s); someField2 = s } + end + + +let x22 = { new ClassType2("a") with member __.GetHashCode() = 3 } +let x32 = { new ClassType2("abc") with member __.VirtualMethod1(s) = 4002 } +let x42 = { new ClassType2("abcd") with + member __.VirtualMethod1(s) = 5004 + member __.VirtualMethod2(s1,s2) = 500 + s1.Length + s2.Length } + +test "e09wckj2ddwdw" (ignore(((x22 :> obj) :?> ClassType1)); true) +test "e09wckj2ddwdw" (ignore((x22 :> ClassType1)); true) + +test "e09wckjd3" (x22.VirtualMethod1("abc") = 2001) +test "e09wckjd3" (x32.VirtualMethod1("abc") = 4002) +test "e09wckjfew" (x42.VirtualMethod1("abc") = 5004) +test "e09wckjd3" (x22.VirtualMethod2("abcd","dqw") = 8) +test "e09wckjd3" (x32.VirtualMethod2("abcd","dqw") = 10) + + + +//----------------------------------------- +// Test defining an F# class + + +module AbstractClassTest = begin + + [] + type ClassType1 = + class + inherit System.Object + val someField : string + + interface IEnumerable + + abstract AbstractMethod1: string -> int + abstract AbstractMethod2: string * string -> int + + new(s: string) = { inherit System.Object(); someField = "abc" } + end + + type ClassType1 + with + interface IEnumerable with + member x.GetEnumerator() = failwith "no implementation" + end + + end + + //let shouldGiveError1 = { new ClassType1("a") with GetHashCode() = 3 } + //let shouldGiveError2 = { new ClassType1("a") with AbstractMethod1(s) = 4 } + //let shouldGiveError3a = new ClassType1("a") + let x4 = { new ClassType1("a") with + member __.AbstractMethod1(s) = 5 + member __.AbstractMethod2(s1,s2) = s1.Length + s2.Length } + + + do test "e09wckj2d" (try ignore((x2 :> IEnumerable).GetEnumerator()); false with Failure "no implementation" -> true) + + test "e09wckj2ddwdw" (try ignore(((x2 :> obj) :?> IEnumerable).GetEnumerator()); false with Failure "no implementation" -> true) + test "e09wckf3q2j" (x4.AbstractMethod1("abc") = 5) + test "e09wckj321" (x4.AbstractMethod2("abc","d") = 4) + + + type ClassType2 = + class + inherit ClassType1 + val someField2 : string + + override x.AbstractMethod1(s) = 2001 + override x.AbstractMethod2(s1,s2) = s1.Length + s2.Length + String.length x.someField2 + + new(s) = { inherit ClassType1(s); someField2 = s } + end + + + let x22 = { new ClassType2("a") with member __.GetHashCode() = 3 } + let x32 = { new ClassType2("abc") with member __.AbstractMethod1(s) = 4002 } + let x42 = { new ClassType2("abcd") with + member __.AbstractMethod1(s) = 5004 + member __.AbstractMethod2(s1,s2) = 500 + s1.Length + s2.Length } + + do test "e09wckj2ddwdw" (ignore(((x22 :> obj) :?> ClassType1)); true) + do test "e09wckj2ddwdw" (ignore((x22 :> ClassType1)); true) + + test "e09wckjd3" (x22.AbstractMethod1("abc") = 2001) + test "e09wckjd3" (x32.AbstractMethod1("abc") = 4002) + test "e09wckjfew" (x42.AbstractMethod1("abc") = 5004) + test "e09wckjd3" (x22.AbstractMethod2("abcd","dqw") = 8) + test "e09wckjd3" (x32.AbstractMethod2("abcd","dqw") = 10) + + type ClassType3 = + class + inherit ClassType2 + val someField3 : string + + override x.AbstractMethod1(s) = 2001 + override x.AbstractMethod2(s1,s2) = s1.Length + s2.Length + String.length x.someField2 + x.someField3.Length + + new(s) = { inherit ClassType2(s); someField3 = s } + end + + + +end + +//----------------------------------------- +//----------------------------------------- + + + + +// Various rejected syntaxes for constructors: +// new(s: string) = { base=new Form(); x = "abc" } +// new ClassType1(s: string) : base() = { x = "abc" } +// new(s: string) = { inherit Form(); x = "abc" } +// member ClassType1(s: string) = new { inherit Form(); x = "abc" } +// member ClassType1(s: string) = { inherit Form(); x = "abc" } +// initializer(s: string) = { inherit Form(); x = "abc" } +// new ClassType1(s: string) = { inherit Form(); x = "abc" } + +// new(s: string) = { inherit Form(); x = "abc" } + +// new((s: string), (s2:string)) = { inherit Form(); x = s } + + +// abstract AbstractProperty: string +// abstract AbstractMutableProperty: string with get,set + + +// new(s: string) = { new ClassType1 with base=new Object() and x = "abc" } +// new(s: string) = { new ClassType1 with base=new Form() and x = "abc" } +// new(s: string) = ((new System.Object()) :?> ClassType1) + + +//----------------------------------------- +// Thorough testing of members for records. + +module RecordTypeTest = begin + + type AbstractType = + { instanceField: string; + mutable mutableInstanceField: string; + instanceArray: string array; + instanceArray2: string array array; + mutableInstanceArray: string array; + mutableInstanceArray2: string array array; + recursiveInstance: AbstractType; + } + + let staticField = "staticField" + let mutableStaticField = ref "mutableStaticFieldInitialValue" + let staticArray = [| "staticArrayElement1"; "staticArrayElement2" |] + let mutableStaticArray = [| "mutableStaticArrayElement1InitialValue"; "mutableStaticArrayElement2InitialValue" |] + + let NewAbstractValue(s) = + let rec self = + { instanceField=s; + mutableInstanceField=s; + instanceArray=[| s;s |]; + instanceArray2=[| [| s;s |];[| s;s |] |]; + mutableInstanceArray =[| s;s |]; + mutableInstanceArray2 =[| [| s;s |];[| s;s |] |]; + recursiveInstance=self; + } + self + + type AbstractType + with + // properties + member x.ToString() = x.instanceField + member x.InstanceProperty = x.instanceField+".InstanceProperty" + member x.RecursiveInstance = x.recursiveInstance + member x.RecursiveInstanceMethod() = x.recursiveInstance + member x.MutableInstanceProperty + with get() = x.mutableInstanceField + and set(v:string) = x.mutableInstanceField <- v + + member x.InstanceIndexerCount = Array.length x.instanceArray + + member x.InstanceIndexer + with get(idx) = x.instanceArray.[idx] + member x.InstanceIndexer2 + with get(idx1,idx2) = x.instanceArray2.[idx1].[idx2] + member x.InstanceIndexer2Count1 = 2 + member x.InstanceIndexer2Count2 = 2 + + member x.MutableInstanceIndexerCount = Array.length x.mutableInstanceArray + + member x.MutableInstanceIndexer + with get (idx1) = x.mutableInstanceArray.[idx1] + and set (idx1) (v:string) = x.mutableInstanceArray.[idx1] <- v + + member x.MutableInstanceIndexer2 + with get (idx1,idx2) = x.mutableInstanceArray2.[idx1].[idx2] + and set (idx1,idx2) (v:string) = x.mutableInstanceArray2.[idx1].[idx2] <- v + member x.MutableInstanceIndexer2Count1 = 2 + member x.MutableInstanceIndexer2Count2 = 2 + + static member StaticProperty = staticField + static member MutableStaticProperty + with get() = !mutableStaticField + and set(v:string) = mutableStaticField := v + + static member StaticIndexer + with get(idx) = staticArray.[idx] + + static member StaticIndexerCount = Array.length staticArray + + static member MutableStaticIndexer + with get(idx:int) = mutableStaticArray.[idx] + and set(idx:int) (v:string) = mutableStaticArray.[idx] <- v + + static member MutableStaticIndexerCount = Array.length mutableStaticArray + + // methods + member x.InstanceMethod(s1:string) = Printf.sprintf "%s.InstanceMethod(%s)" x.instanceField s1 + static member StaticMethod((s1:string),(s2:string)) = Printf.sprintf "AbstractType.StaticMethod(%s,%s)" s1 s2 + + // private versions of the above + member x.PrivateInstanceProperty = x.instanceField+".InstanceProperty" + member x.PrivateMutableInstanceProperty + with get() = x.mutableInstanceField + and set(v:string) = x.mutableInstanceField <- v + + member x.PrivateInstanceIndexerCount = Array.length x.instanceArray + + member x.PrivateInstanceIndexer + with get(idx) = x.instanceArray.[idx] + member x.PrivateInstanceIndexer2 + with get(idx1,idx2) = x.instanceArray2.[idx1].[idx2] + member x.PrivateInstanceIndexer2Count1 = 2 + member x.PrivateInstanceIndexer2Count2 = 2 + + member x.PrivateMutableInstanceIndexerCount = Array.length x.mutableInstanceArray + + member x.PrivateMutableInstanceIndexer + with get (idx1) = x.mutableInstanceArray.[idx1] + and set (idx1) (v:string) = x.mutableInstanceArray.[idx1] <- v + + member x.PrivateMutableInstanceIndexer2 + with get (idx1,idx2) = x.mutableInstanceArray2.[idx1].[idx2] + and set (idx1,idx2) (v:string) = x.mutableInstanceArray2.[idx1].[idx2] <- v + member x.PrivateMutableInstanceIndexer2Count1 = 2 + member x.PrivateMutableInstanceIndexer2Count2 = 2 + + static member PrivateStaticProperty = staticField + static member PrivateMutableStaticProperty + with get() = !mutableStaticField + and set(v:string) = mutableStaticField := v + + static member PrivateStaticIndexer + with get(idx) = staticArray.[idx] + + static member PrivateStaticIndexerCount = Array.length staticArray + + static member PrivateMutableStaticIndexer + with get(idx:int) = mutableStaticArray.[idx] + and set(idx:int) (v:string) = mutableStaticArray.[idx] <- v + + static member PrivateMutableStaticIndexerCount = Array.length mutableStaticArray + + // methods + member x.PrivateInstanceMethod(s1:string) = Printf.sprintf "%s.InstanceMethod(%s)" x.instanceField s1 + static member PrivateStaticMethod((s1:string),(s2:string)) = Printf.sprintf "AbstractType.StaticMethod(%s,%s)" s1 s2 + + + end + + + + // Test accesses of static properties, methods + do System.Console.WriteLine("AbstractType.StaticProperty = {0}", AbstractType.StaticProperty) + do AbstractType.MutableStaticProperty <- "MutableStaticProperty (mutated!)" + do System.Console.WriteLine("AbstractType.StaticIndexer(0) = {0}", AbstractType.StaticIndexer(0) ) + do System.Console.WriteLine("AbstractType.StaticMethod(abc,def) = {0}", AbstractType.StaticMethod("abc","def") ) + do System.Console.WriteLine("AbstractType.PrivateStaticProperty = {0}", AbstractType.PrivateStaticProperty ) + do AbstractType.PrivateMutableStaticProperty <- "PrivateMutableStaticProperty (mutated!)" + do System.Console.WriteLine("AbstractType.PrivateStaticIndexer(0) = {0}", AbstractType.PrivateStaticIndexer(0) ) + do System.Console.WriteLine("AbstractType.PrivateStaticMethod(abc,def) = {0}", AbstractType.PrivateStaticMethod("abc","def") ) + + // Torture this poor object + let xval = NewAbstractValue("abc") + + // Test dynamic rediscovery of type + do test "e09wckdw" (not ((xval :> obj) :? IEnumerable)) + do test "e09wckdwddw" (not ((xval :> obj) :? string)) + do test "e09dwdw" (not ((xval :> obj) :? list)) + do test "e09dwwd2" ((xval :> obj) :? AbstractType) + + // Test access of instance properties, methods through variables + do System.Console.WriteLine("abc.instanceField = {0}", xval.instanceField) + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do xval.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.MutableInstanceIndexer(0) ) + do xval.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.MutableInstanceIndexer2(0,1) ) + do xval.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + do xval.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.PrivateMutableInstanceIndexer(0) ) + do xval.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.PrivateMutableInstanceIndexer2(0,1) ) + do xval.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc..PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + + // repeat all the above through a long-path field lookup + do System.Console.WriteLine("abc.instanceField = {0}", xval.recursiveInstance.instanceField) + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.recursiveInstance.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.recursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.recursiveInstance.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.recursiveInstance.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.recursiveInstance.MutableInstanceProperty ) + do xval.recursiveInstance.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.recursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.recursiveInstance.MutableInstanceIndexer(0) ) + do xval.recursiveInstance.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.recursiveInstance.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.recursiveInstance.MutableInstanceIndexer2(0,1) ) + do xval.recursiveInstance.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.recursiveInstance.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.recursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.recursiveInstance.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.recursiveInstance.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.recursiveInstance.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.recursiveInstance.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.recursiveInstance.PrivateMutableInstanceProperty ) + do xval.recursiveInstance.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.recursiveInstance.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.recursiveInstance.PrivateMutableInstanceIndexer(0) ) + do xval.recursiveInstance.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.recursiveInstance.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.recursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do xval.recursiveInstance.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.recursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.recursiveInstance.PrivateMutableInstanceProperty ) + + + // repeat all the above through a long-path property lookup + do System.Console.WriteLine("abc.instanceField = {0}", xval.RecursiveInstance.instanceField) + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.RecursiveInstance.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.RecursiveInstance.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do xval.RecursiveInstance.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do xval.RecursiveInstance.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.RecursiveInstance.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.RecursiveInstance.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do xval.RecursiveInstance.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + + // repeat all the above through a long-path method lookup + do System.Console.WriteLine("abc.instanceField = {0}", (xval.RecursiveInstanceMethod()).instanceField) + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", (xval.RecursiveInstanceMethod()).InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", (xval.RecursiveInstanceMethod()).InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", (xval.RecursiveInstanceMethod()).InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", (xval.RecursiveInstanceMethod()).InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do (xval.RecursiveInstanceMethod()).MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) ) + do (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) ) + do (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + +end + +//----------------------------------------- +// Thorough testing of members for records. + +module UnionTypeTest = begin + + type AbstractType = A of AbstractType | B of string + + let staticField = "staticField" + let mutableStaticField = ref "mutableStaticFieldInitialValue" + let staticArray = [| "staticArrayElement1"; "staticArrayElement2" |] + let mutableStaticArray = [| "mutableStaticArrayElement1InitialValue"; "mutableStaticArrayElement2InitialValue" |] + + let NewAbstractValue(s) = B(s) + + type AbstractType + with + // properties + member x.ToString() = match x with A _ -> "A" | B(s) -> "B" + member x.InstanceProperty = "instanceProperty" + member x.RecursiveInstance = match x with A y -> y | B s -> x + member x.RecursiveInstanceMethod() = x.RecursiveInstance + member x.MutableInstanceProperty + with get() = x.InstanceProperty + and set(v:string) = Printf.printf "called MutableInstanceProperty.set\n" + + member x.InstanceIndexerCount = 1 + + member x.InstanceIndexer + with get(idx) = "a" + member x.InstanceIndexer2 + with get(idx1,idx2) = "a" + member x.InstanceIndexer2Count1 = 2 + member x.InstanceIndexer2Count2 = 2 + + member x.MutableInstanceIndexerCount = 1 + + member x.MutableInstanceIndexer + with get (idx1) = "a" + and set (idx1) (v:string) = Printf.printf "called MutableInstanceIndexer.set\n" + + member x.MutableInstanceIndexer2 + with get (idx1,idx2) = "a" + and set (idx1,idx2) (v:string) = Printf.printf "called MutableInstanceIndexer2.set\n" + member x.MutableInstanceIndexer2Count1 = 2 + member x.MutableInstanceIndexer2Count2 = 2 + + static member StaticProperty = staticField + static member MutableStaticProperty + with get() = !mutableStaticField + and set(v:string) = mutableStaticField := v + + static member StaticIndexer + with get(idx) = staticArray.[idx] + + static member StaticIndexerCount = Array.length staticArray + + static member MutableStaticIndexer + with get(idx:int) = mutableStaticArray.[idx] + and set(idx:int) (v:string) = mutableStaticArray.[idx] <- v + + static member MutableStaticIndexerCount = Array.length mutableStaticArray + + // methods + member x.InstanceMethod(s1:string) = Printf.sprintf "InstanceMethod(%s)" s1 + static member StaticMethod((s1:string),(s2:string)) = Printf.sprintf "AbstractType.StaticMethod(%s,%s)" s1 s2 + + // private versions of the above + member x.PrivateInstanceProperty = "InstanceProperty" + member x.PrivateMutableInstanceProperty + with get() = "a" + and set(v:string) = Printf.printf "called mutator\n" + + member x.PrivateInstanceIndexerCount = 1 + + member x.PrivateInstanceIndexer + with get(idx) = "b" + member x.PrivateInstanceIndexer2 + with get(idx1,idx2) = "c" + member x.PrivateInstanceIndexer2Count1 = 1 + member x.PrivateInstanceIndexer2Count2 = 1 + + member x.PrivateMutableInstanceIndexerCount = 3 + + member x.PrivateMutableInstanceIndexer + with get (idx1) = "a" + and set (idx1) (v:string) = Printf.printf "called mutator\n" + + member x.PrivateMutableInstanceIndexer2 + with get (idx1,idx2) = "a" + and set (idx1,idx2) (v:string) = Printf.printf "called mutator\n" + member x.PrivateMutableInstanceIndexer2Count1 = 2 + member x.PrivateMutableInstanceIndexer2Count2 = 2 + + static member PrivateStaticProperty = staticField + static member PrivateMutableStaticProperty + with get() = !mutableStaticField + and set(v:string) = mutableStaticField := v + + static member PrivateStaticIndexer + with get(idx) = staticArray.[idx] + + static member PrivateStaticIndexerCount = Array.length staticArray + + static member PrivateMutableStaticIndexer + with get(idx:int) = mutableStaticArray.[idx] + and set(idx:int) (v:string) = mutableStaticArray.[idx] <- v + + static member PrivateMutableStaticIndexerCount = Array.length mutableStaticArray + + // methods + member x.PrivateInstanceMethod(s1:string) = Printf.sprintf "InstanceMethod(%s)" s1 + static member PrivateStaticMethod((s1:string),(s2:string)) = Printf.sprintf "AbstractType.StaticMethod(%s,%s)" s1 s2 + + end + + + + // Test accesses of static properties, methods + do System.Console.WriteLine("AbstractType.StaticProperty = {0}", AbstractType.StaticProperty) + do AbstractType.MutableStaticProperty <- "MutableStaticProperty (mutated!)" + do System.Console.WriteLine("AbstractType.StaticIndexer(0) = {0}", AbstractType.StaticIndexer(0) ) + do System.Console.WriteLine("AbstractType.StaticMethod(abc,def) = {0}", AbstractType.StaticMethod("abc","def") ) + do System.Console.WriteLine("AbstractType.PrivateStaticProperty = {0}", AbstractType.PrivateStaticProperty ) + do AbstractType.PrivateMutableStaticProperty <- "PrivateMutableStaticProperty (mutated!)" + do System.Console.WriteLine("AbstractType.PrivateStaticIndexer(0) = {0}", AbstractType.PrivateStaticIndexer(0) ) + do System.Console.WriteLine("AbstractType.PrivateStaticMethod(abc,def) = {0}", AbstractType.PrivateStaticMethod("abc","def") ) + + // Torture this poor object + let xval = NewAbstractValue("abc") + + // Test dynamic rediscovery of type + do test "e09wckdw" (not ((xval :> obj) :? IEnumerable)) + do test "e09wckdwddw" (not ((xval :> obj) :? string)) + do test "e09dwdw" (not ((xval :> obj) :? list)) + do test "e09dwwd2" ((xval :> obj) :? AbstractType) + + // Test access of instance properties, methods through variables + + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do xval.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.MutableInstanceIndexer(0) ) + do xval.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.MutableInstanceIndexer2(0,1) ) + do xval.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + do xval.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.PrivateMutableInstanceIndexer(0) ) + do xval.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.PrivateMutableInstanceIndexer2(0,1) ) + do xval.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc..PrivateMutableInstanceProperty = {0}", xval.PrivateMutableInstanceProperty ) + + // repeat all the above through a long-path field lookup + + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.RecursiveInstance.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.RecursiveInstance.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do xval.RecursiveInstance.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do xval.RecursiveInstance.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.RecursiveInstance.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.RecursiveInstance.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do xval.RecursiveInstance.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + + + // repeat all the above through a long-path property lookup + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", xval.RecursiveInstance.InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", xval.RecursiveInstance.InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", xval.RecursiveInstance.InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do xval.RecursiveInstance.MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do xval.RecursiveInstance.MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", xval.RecursiveInstance.MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", xval.RecursiveInstance.MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", xval.RecursiveInstance.MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", xval.RecursiveInstance.PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", xval.RecursiveInstance.PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", xval.RecursiveInstance.PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do xval.RecursiveInstance.PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", xval.RecursiveInstance.PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", xval.RecursiveInstance.PrivateMutableInstanceProperty ) + + // repeat all the above through a long-path method lookup + do System.Console.WriteLine("abc.InstanceMethod(def) = {0}", (xval.RecursiveInstanceMethod()).InstanceMethod("def") ) + do System.Console.WriteLine("abc.InstanceProperty = {0}", (xval.RecursiveInstanceMethod()).InstanceProperty ) + do System.Console.WriteLine("abc.InstanceIndexer(0) = {0}", (xval.RecursiveInstanceMethod()).InstanceIndexer(0) ) + do System.Console.WriteLine("abc.InstanceIndexer2(0,1) = {0}", (xval.RecursiveInstanceMethod()).InstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do (xval.RecursiveInstanceMethod()).MutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) ) + do (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) ) + do (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.MutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.MutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).MutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceMethod(def) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceMethod("def") ) + do System.Console.WriteLine("abc.PrivateInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceProperty ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer(0) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateInstanceIndexer2(0,1) = {0}", (xval.RecursiveInstanceMethod()).PrivateInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty <- "MutableInstanceProperty (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) <- "MutableInstanceIndexer(0) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer(0) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) ) + do (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) <- "MutableInstanceIndexer2(0,1) (mutated!)" + do System.Console.WriteLine("abc.PrivateMutableInstanceIndexer2 = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceIndexer2(0,1) ) + do System.Console.WriteLine("abc.PrivateMutableInstanceProperty = {0}", (xval.RecursiveInstanceMethod()).PrivateMutableInstanceProperty ) + +end + + +//--------------------------------------------------------------------- +// Test that we can change the default structural comparison semantics + + +module OverrideIComparableOnClassTest = begin + + type MyStringClass = + class + val cache: int + val v: string + interface IStructuralComparable with + member x.CompareTo(y:obj,comp:System.Collections.IComparer) = compare x.v (y :?> MyStringClass).v + end + interface IStructuralEquatable with + member x.GetHashCode(comp:System.Collections.IEqualityComparer) = hash(x.v) + member x.Equals(y:obj,comp:System.Collections.IEqualityComparer) = (compare x.v (y :?> MyStringClass).v ) = 0 + end + member x.Length = x.cache + new(s:string) = { inherit Object(); cache=s.Length; v=s } + end + + let s1 = new MyStringClass("abc") + let s2 = new MyStringClass("def") + let s3 = new MyStringClass("abc") + let s4 = new MyStringClass("abcd") + do test "cepoiwelk" (s1.Length = 3) + do test "cepoiwelk" (s2.Length = 3) + let testc (s1:MyStringClass) (s2:MyStringClass) = + test "cepoiwelk1" ((s1 = s2) = (s1.v = s2.v)) + test "cepoiwelk2" ((s1 < s2) = (s1.v < s2.v)) + test "cepoiwelk3" ((s1 > s2) = (s1.v > s2.v)) + test "cepoiwelk4" ((s1 <= s2) = (s1.v <= s2.v)) + test "cepoiwelk5" ((s1 >= s2) = (s1.v >= s2.v)) + test "cepoiwelk6" ((s1 <> s2) = (s1.v <> s2.v)) + Printf.printf "hash s1 = %d\n" (hash(s1)) + Printf.printf "hash s1.v = %d\n" (hash(s1.v)) + test "cepoiwelk7" (hash(s1) = hash(s1.v)) + test "cepoiwelk8" (hash(s2) = hash(s2.v)) + + do testc s1 s2 + do testc s1 s3 + do testc s2 s3 + do testc s2 s1 + do testc s3 s1 + do testc s3 s2 + do testc s4 s2 +end + +module OverrideIComparableOnRecordTest = begin + + [] + type MyStringClass = { cache: int; v: string } + with + interface IStructuralComparable with + member x.CompareTo(y:obj,comp:System.Collections.IComparer) = compare x.v (y :?> MyStringClass).v + end + interface IStructuralEquatable with + member x.GetHashCode(comp:System.Collections.IEqualityComparer) = hash(x.v) + member x.Equals(y:obj,comp:System.Collections.IEqualityComparer) = (compare x.v (y :?> MyStringClass).v ) = 0 + end + member x.Length = x.cache + static member Create(s:string) = { cache=s.Length; v=s } + end + + + let s1 = MyStringClass.Create("abc") + let s2 = MyStringClass.Create("def") + let s3 = MyStringClass.Create("abc") + let s4 = MyStringClass.Create("abcd") + do test "recd-cepoiwelk" (s1.Length = 3) + do test "recd-cepoiwelk" (s2.Length = 3) + let testc s1 s2 = + test "recd-cepoiwelk1" ((s1 = s2) = (s1.v = s2.v)) + test "recd-cepoiwelk2" ((s1 < s2) = (s1.v < s2.v)) + test "recd-cepoiwelk3" ((s1 > s2) = (s1.v > s2.v)) + test "recd-cepoiwelk4" ((s1 <= s2) = (s1.v <= s2.v)) + test "recd-cepoiwelk5" ((s1 >= s2) = (s1.v >= s2.v)) + test "recd-cepoiwelk6" ((s1 <> s2) = (s1.v <> s2.v)) + Printf.printf "hash s1 = %d\n" (hash(s1)) + Printf.printf "hash s1.v = %d\n" (hash(s1.v)) + test "recd-cepoiwelk7" (hash(s1) = hash(s1.v)) + test "recd-cepoiwelk8" (hash(s2) = hash(s2.v)) + + do testc s1 s2 + do testc s1 s3 + do testc s2 s3 + do testc s2 s1 + do testc s3 s1 + do testc s3 s2 + do testc s4 s2 +end + +module OverrideIComparableOnUnionTest = begin + + [] + type MyStringClass = A of int * string | B of int * string + with + member x.Value = match x with A(_,s) | B(_,s) -> s + interface IStructuralComparable with + member x.CompareTo(y:obj,comp:System.Collections.IComparer) = compare x.Value (y :?> MyStringClass).Value + end + interface IStructuralEquatable with + member x.GetHashCode(comp:System.Collections.IEqualityComparer) = hash(x.Value) + member x.Equals(y:obj,comp:System.Collections.IEqualityComparer) = x.Value = (y :?> MyStringClass).Value + end + member x.Length = match x with A(n,_) | B(n,_) -> n + static member Create(s:string) = A(s.Length,s) + end + + + let s1 = MyStringClass.Create("abc") + let s2 = MyStringClass.Create("def") + let s3 = MyStringClass.Create("abc") + let s4 = MyStringClass.Create("abcd") + do test "union-cepoiwelk" (s1.Length = 3) + do test "union-cepoiwelk" (s2.Length = 3) + let testc (s1:MyStringClass) (s2:MyStringClass) = + test "union-cepoiwelk1" ((s1 = s2) = (s1.Value = s2.Value)) + test "union-cepoiwelk2" ((s1 < s2) = (s1.Value < s2.Value)) + test "union-cepoiwelk3" ((s1 > s2) = (s1.Value > s2.Value)) + test "union-cepoiwelk4" ((s1 <= s2) = (s1.Value <= s2.Value)) + test "union-cepoiwelk5" ((s1 >= s2) = (s1.Value >= s2.Value)) + test "union-cepoiwelk6" ((s1 <> s2) = (s1.Value <> s2.Value)) + Printf.printf "hash s1 = %d\n" (hash(s1)) + Printf.printf "hash s1.Value = %d\n" (hash(s1.Value)) + test "union-cepoiwelk7" (hash(s1) = hash(s1.Value)) + test "union-cepoiwelk8" (hash(s2) = hash(s2.Value)) + + do testc s1 s2 + do testc s1 s3 + do testc s2 s3 + do testc s2 s1 + do testc s3 s1 + do testc s3 s2 + do testc s4 s2 +end + +//--------------------------------------------------------------------- +// Test we can define an attribute + + +type DontPressThisButtonAttribute = + class + inherit System.Attribute + val v: string + member x.Message = x.v + new(s:string) = { inherit System.Attribute(); v=s } + end + +// BUG: +type [] button = Buttpon +let [] button () = 1 + + +//--------------------------------------------------------------------- +// Test we can use base calls + + + +type MyCanvas2 = + class + inherit Form + override x.OnPaint(args) = Printf.printf "OnPaint\n"; base.OnPaint(args) + + new() = { inherit Form(); } + end + +let form2 = new MyCanvas2() + + +//--------------------------------------------------------------------- +// Test we can inherit from the Event<'a> type to define our listeners + +let (|>) x f = f x + +(* +type MyEventListeners<'a> = + class + inherit Event<'a> + + val mutable listeners2: (Handler<'a>) list + + member l.Fire(x : 'a) = + let arg = new SimpleEventArgs<_>(x) + l.listeners2 |> List.iter (fun d -> ignore(d.Invoke((null:obj),arg))) + + new() = + { inherit Event<'a>(); + listeners2 = [] } + + end + +*) + +(* +type MyCanvas2 = + class + inherit Form + member x.Redraw : Event + new: unit -> MyCanvas2 + end +*) + +(* +type MyCanvas2 = + class + inherit Form + val redrawListeners: MyEventListeners + member x.Redraw = x.redrawListeners + override x.OnPaint(args) = x.redrawListeners.Fire(args) + + new() = { inherit Form(); redrawListeners= new MyEventListeners() } + end +*) + +(* +class MyCanvas2() = + let l = MyEventListeners() + object + inherit Form() + member x.Redraw = l + override x.OnPaint(args) = l.Fire(args) + end + +class MyCanvas2 = + let l = MyEventListeners() + object + inherit Form + member x.Redraw = l + override x.OnPaint(args) = l.Fire(args) + end +*) + +(* +let form = new MyCanvas2() +// form.Paint.Add(...) +// form.add_Paint(...) +form.Redraw.AddHandler(new Handler(fun _ args -> Printf.printf "OnRedraw\n")) +form.Redraw.Add(fun args -> Printf.printf "OnRedraw\n") + + +form.Activate() +Application.Run(form) +*) + +//x.add_Redraw + +//--------------------------------------------------------------------- +// Test we can define an exception + +type MyException = + class + inherit System.Exception + val v: string + member x.Message = x.v + new(s:string) = { inherit System.Exception(); v=s } + end + +let _ = try raise(new MyException("help!")) with :? MyException as me -> Printf.printf "message = %s\n" me.Message + +//--------------------------------------------------------------------- +// Test we can define and subscribe to an interface + +(* +type IMyInterface = + interface + abstract MyMethod: string -> int + end +*) + +// type IMyStructuralConstraint = < MyMethod: string -> int > +// 'a :> < MyMethod: string -> int > +// 'a :> IMyStructuralConstraint +// 'a : IMyStructuralConstraint + + +//--------------------------------------------------------------------- +// Test we can define and subscribe to a generic interface + + +//--------------------------------------------------------------------- +// Test we can define a struct + + +(* +type MyStruct = + struct + val x: int + val y: int + end +*) + + +//--------------------------------------------------------------------- +// Test we can define a generic struct + +//--------------------------------------------------------------------- +// Test we can define a class with no fields + +type NoFieldClass = + class + new() = { inherit System.Object() } + end + +//--------------------------------------------------------------------- +// Test we can implement more than one interface on a class + +module MultiInterfaceTest = begin + type PrivateInterfaceA1 = interface abstract M1 : unit -> unit end + type PrivateInterfaceA2 = interface abstract M2 : unit -> unit end + + type C1 = + class + interface PrivateInterfaceA1 with + member x.M1() = () + end + interface PrivateInterfaceA2 with + member x.M2() = () + end + end +end + +module MultiInterfaceTestNameConflict = begin + type PrivateInterfaceA1 = interface abstract M : unit -> unit end + type PrivateInterfaceA2 = interface abstract M : unit -> unit end + + type C1 = + class + interface PrivateInterfaceA1 with + member x.M() = () + end + interface PrivateInterfaceA2 with + member x.M() = () + end + end +end + + +module GenericMultiInterfaceTestNameConflict = begin + type PrivateInterfaceA1<'a> = interface abstract M : 'a -> 'a end + type PrivateInterfaceA2<'a> = interface abstract M : 'a -> 'a end + + type C1 = + class + interface PrivateInterfaceA1 with + member x.M(y) = y + end + interface PrivateInterfaceA2 with + member x.M(y) = y + end + end +end + + +module DeepInterfaceInheritance = begin + type InterfaceA1 = interface abstract M1 : int -> int end + type InterfaceA2 = interface inherit InterfaceA1 abstract M2 : int -> int end + type InterfaceA3 = interface inherit InterfaceA1 inherit InterfaceA2 abstract M3 : int -> int end + + type C1 = + class + interface InterfaceA2 with + member x.M1(y) = y + member x.M2(y) = y + y + end + new() = { inherit Object(); } + end + type C2 = + class + interface InterfaceA3 with + member x.M1(y) = y + member x.M2(y) = y + y + member x.M3(y) = y + y + y + end + new() = { inherit Object(); } + end + type C3 = + class + interface InterfaceA2 with + member x.M1(y) = y + member x.M2(y) = y + y + end + interface InterfaceA3 with + member x.M3(y) = y + y + y + end + new() = { inherit Object(); } + end + + do test "fewopvrej1" (((new C1()) :> InterfaceA1).M1(4) = 4) + do test "fewopvrej2" (((new C1()) :> InterfaceA2).M2(4) = 8) + + do test "fewopvrej3" (((new C2()) :> InterfaceA1).M1(4) = 4) + do test "fewopvrej4" (((new C2()) :> InterfaceA2).M2(4) = 8) + do test "fewopvrej5" (((new C2()) :> InterfaceA3).M3(4) = 12) + do test "fewopvrej6" (((new C2()) :> InterfaceA3).M1(4) = 4) + do test "fewopvrej7" (((new C2()) :> InterfaceA3).M2(4) = 8) + + do test "fewopvrej8" (((new C3()) :> InterfaceA1).M1(4) = 4) + do test "fewopvrej9" (((new C3()) :> InterfaceA2).M2(4) = 8) + do test "fewopvrej10" (((new C3()) :> InterfaceA3).M3(4) = 12) + do test "fewopvrej11" (((new C3()) :> InterfaceA3).M1(4) = 4) + do test "fewopvrej12" (((new C3()) :> InterfaceA3).M2(4) = 8) + +end + +module DeepGenericInterfaceInheritance = begin + type InterfaceA1<'a> = interface abstract M1 : 'a -> 'a end + type InterfaceA2<'b> = interface inherit InterfaceA1<'b list> abstract M2 : 'b * 'b list -> 'b list end + type InterfaceA3 = interface inherit InterfaceA2 abstract M3 : string list -> string list end + + type C1 = + class + interface InterfaceA2 with + member this.M1(y) = 1::y + member this.M2(x,y) = x::y + end + new() = { inherit Object(); } + end + type C2 = + class + interface InterfaceA3 with + member this.M1(y) = "a" :: y + member this.M2(x,y) = x :: y + member this.M3(y) = "a" :: "b" :: "c" :: y + end + new() = { inherit Object(); } + end + type C3 = + class + interface InterfaceA2 with + member this.M1(y) = "a" :: y + member this.M2(x,y) = x :: y + end + interface InterfaceA3 with + member x.M3(y) = "a" :: "b" :: "c" :: y + end + new() = { inherit Object(); } + end + + test "fewopvrej1" (((new C1()) :> InterfaceA1).M1([1]) = [1;1]) + test "fewopvrej2" (((new C1()) :> InterfaceA2).M2(3,[1]) = [3;1]) + + test "fewopvrej3" (((new C2()) :> InterfaceA1).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej4" (((new C2()) :> InterfaceA2).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej4" (((new C2()) :> InterfaceA2).M2("a",["hi"]) = ["a";"hi"]) + test "fewopvrej5" (((new C2()) :> InterfaceA3).M3(["hi"]) = ["a";"b";"c";"hi"]) + test "fewopvrej6" (((new C2()) :> InterfaceA3).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej7" (((new C2()) :> InterfaceA3).M2("a",["hi"]) = ["a";"hi"]) + + test "fewopvrej8" (((new C3()) :> InterfaceA1).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej8" (((new C3()) :> InterfaceA2).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej9" (((new C3()) :> InterfaceA2).M2("a",["hi"]) = ["a";"hi"]) + test "fewopvrej10" (((new C3()) :> InterfaceA3).M3(["hi"]) = ["a";"b";"c";"hi"]) + test "fewopvrej11" (((new C3()) :> InterfaceA3).M1(["hi"]) = ["a";"hi"]) + test "fewopvrej12" (((new C3()) :> InterfaceA3).M2("a",["hi"]) = ["a";"hi"]) + +end + + +module PointTest = begin + + + type Point = + class + new(x_init) = { inherit System.Object(); x_init = x_init; x = x_init } + val x_init : int + val mutable x : int + member p.X = p.x + member p.Offset = p.x - p.x_init + member p.Move d1 d2 = p.x <- p.x + d1 + d2 + static member TwoArgs d1 d2 = d1 + d2 + static member TwoPatternArgs [d1] [d2] = d1 + d2 + static member ThreeArgs d1 d2 d3 = d1 + d2 + d3 + static member ThreePatternArgs [d1] [d2] [d3] = d1 + d2 + d3 + member p.InstanceTwoArgs d1 d2 = p.x + d1 + d2 + member p.InstanceTwoPatternArgs [d1] [d2] = p.x + d1 + d2 + member p.InstanceThreeArgs d1 d2 d3 = p.x + d1 + d2 + d3 + member p.InstanceThreePatternArgs [d1] [d2] [d3] = p.x + d1 + d2 + d3 + end + + type Point_with_no_inherits_clause = + class + new x_init = { x_init = x_init; x = x_init } + val x_init : int + val mutable x : int + member p.X = p.x + member p.Offset = p.x - p.x_init + member p.Move d1 d2 = p.x <- p.x + d1 + d2 + end + + + let p = (new Point_with_no_inherits_clause(3)) + let f = p.Move 4 + do test "wdfjcdwkj1" (p.X = 3) + do f 4 + do test "wdfjcdwkj2" (p.X = 11) + do f 1 + do test "wdfjcdwkj3" (p.X = 16) + do test "wdfjcdwkj4" (Point.TwoArgs 1 2 = 3) + do test "wdfjcdwkj5" (Point.TwoPatternArgs [1] [2] = 3) + do test "wdfjcdwkj6" (Point.ThreeArgs 1 2 3 = 6) + do test "wdfjcdwkj7" (Point.ThreePatternArgs [1] [2] [3] = 6) + let p2 = (new Point(16)) + do test "wdfjcdwkj4" (p2.InstanceTwoArgs 1 2 = 16 + 3) + do test "wdfjcdwkj5" (p2.InstanceTwoPatternArgs [1] [2] = 16 + 3) + do test "wdfjcdwkj6" (p2.InstanceThreeArgs 1 2 3 = 16 + 6) + do test "wdfjcdwkj7" (p2.InstanceThreePatternArgs [1] [2] [3] = 16 + 6) + +end + + +//--------------------------------------------------------------------- +// Test we can implement a debug view + + + + +type + [) >] + MyIntList = MyNil | MyCons of int * MyIntList + +and MyIntListDebugView = + class + val v: MyIntList + new(x) = { v = x } + [] + member x.Items = + let rec length x acc = match x with MyNil -> acc | MyCons(a,b) -> length b (acc+1) + let len = length x.v 0 + let items = Array.zeroCreate len + let rec go n l = match l with MyNil -> () | MyCons(a,b) -> items.[n] <- a; go (n+1) b + go 0 x.v; + items + end + + +//--------------------------------------------------------------------- +// Pattern matching on objects + +module PatternMatchTests = begin + type P = + class + val x1: int; + val x2: string; + new(a,b) = {x1=a; x2=b } + end + let p = new P(3,"34") +end + + +//--------------------------------------------------------------------- +// 'then' on construction + +module ThenDoTest = begin + let res = ref 2 + type P = + class + val x1: int; val x2: string; + new(a,b) = {x1=a; x2=(test "ewqonce1" (!res = 2); b) } then res := !res + 1 + end + + do ignore(new P(3,"5")) + do test "ewqonce2" (!res = 3) + +end + +//--------------------------------------------------------------------- +// 'then' on construction recursive reference + +module ThenDoTest2 = begin + let res = ref 2 + type P = + class + val x1: int; val x2: string; + new(a,b) as x = + { x1= !res; + x2=(test "ewqonce3" (!res = 2); b) } + then + test "ewqonce4" (!res = 2); + res := !res + 1; + test "ewqonce5" (!res = 3); + test "ewqonce6" (x.x1 = 2) + end + + do ignore(new P(3,"5")) + do test "ewqonce7" (!res = 3) + +end + +module GenericInterfaceTest = begin + + type Foo<'a> = + interface + abstract fun1 : 'a -> 'a + abstract fun2 : int -> int + end + + + type Bar<'b> = + class + val store : 'b + interface Foo<'b> with + member self.fun1(x) = x + member self.fun2(x) = 1 + end + new(x) = { store = x } + end + + + type Bar2<'b> = + class + val store : 'b + interface Foo<'b> with + member self.fun1(x:'b) = x + member self.fun2(x) = 1 + end + new(x) = { store = x } + end + + type Bar3<'b> = + class + val store : int + interface Foo<'b> with + member self.fun1(x) = x + member self.fun2(x) = 1 + end + new(x) = { store = x } + end + +end + + +//--------------------------------------------------------------------- +// + + + +module Inventory = begin + + type item = A | B + type image = A | B + + type ItemDetails = + { ItemIndex: item; + InventoryImage: image; + Name : string } + + type IInventory = interface + abstract Contains : item -> bool + abstract Remove : item -> unit + abstract GetDetails : item -> ItemDetails + abstract Add : ItemDetails -> unit + abstract GetTuple : unit -> (item * image * string) list + end + + module List = + let indexNotFound() = raise (new System.Collections.Generic.KeyNotFoundException("An index satisfying the predicate was not found in the collection")) + + let rec assoc x l = + match l with + | [] -> indexNotFound() + | ((h,r)::t) -> if x = h then r else assoc x t + let rec remove_assoc x l = + match l with + | [] -> [] + | (((h,_) as p) ::t) -> if x = h then t else p:: remove_assoc x t + + + + type Inventory = class + val inv : ItemDetails list ref + new() = { inv = ref [] } + interface IInventory with + member this.Contains i = try (List.assoc i (List.map (fun itd -> (itd.ItemIndex, true)) !this.inv)) with :? System.Collections.Generic.KeyNotFoundException -> false + member this.Remove i = this.inv := List.map snd (List.remove_assoc i (List.map (fun itd -> (itd.ItemIndex, itd)) !this.inv)) + member this.GetDetails i = List.assoc i (List.map (fun itd -> (itd.ItemIndex, itd)) !this.inv) + member this.Add itd = if ((this :> IInventory).Contains (itd.ItemIndex) = false) then this.inv := itd :: !this.inv + member this.GetTuple() = + List.map (fun itd -> (itd.ItemIndex,itd.InventoryImage,itd.Name)) !this.inv + end + end + +end + +//--------------------------------------------------------------------- +// Another interface test + +module SamplerTest = begin + + type Sampler<'a,'b> = + interface + abstract Sample : 'a -> unit + abstract GetStatistic : unit -> 'b + end + +(* + let NewAverage(toFloat) = + let count = ref 0 + let total = ref 0.0 + { new Sampler<_,float> + member self.Sample(x) = incr count; total := !total + toFloat x + member self.GetStatistic() = !total / float(!count) } + +*) + let NewAverage(toFloat) = + let count = ref 0 + let total = ref 0.0 + { new Sampler<_,float> with + member __.Sample(x) = incr count; total := !total + toFloat x + member __.GetStatistic() = !total / float(!count) } + + type Average<'a> = + class + val mutable total : float + val mutable count : int + val toFloat : 'a -> float + new(toFloat) = {total = 0.0; count =0; toFloat = toFloat } + interface Sampler< 'a,float > with + member this.Sample(x) = this.count <- this.count + 1; this.total <- this.total + this.toFloat x + member this.GetStatistic() = this.total / float(this.count) + end + end + +end + + +//--------------------------------------------------------------------- +// This simple case of forward-reference revealed a bug + +type callconv = AA + with + member x.IsInstance = x.ThisConv + member x.ThisConv = 1 + end + +// Likewise + +module OverloadZeroOneTestSoohyoung = begin + + type Point = + class + val mutable mx: int + + new () = { mx = 0 } + new (ix) = { mx = ix } + end + +end + +//--------------------------------------------------------------------- +// Bad error message case + + +module Ralf = begin + + type Matrix = M | N + + [] + type Distribution = + class + new () = { } + + abstract member NumberOfDimensions : unit -> int + abstract member Sample: int -> System.Random -> Matrix + abstract member Density: Matrix -> float + abstract member CloneConstant: unit -> Distribution + abstract member Clone: unit -> Distribution + abstract member AbsoluteDifference: Distribution -> float + + end + + type Gaussian1D = + class + inherit Distribution + val PrecisionMean : float + val Precision : float + new (precisionMean, precision) = { PrecisionMean = 0.0; Precision = 0.0 } + override x.NumberOfDimensions() = 1 + override x.Density point = 1.0 + override x.AbsoluteDifference distribution = 0.0 + override x.Clone() = new Gaussian1D (0.0,0.0) :> Distribution + override x.CloneConstant() = new Gaussian1D (x.PrecisionMean,x.Precision) :> Distribution + override x.Sample numberOfSamples random = failwith "" // new Matrix (numberOfSamples,x.NumberOfDimensions) + end + +end + +//--------------------------------------------------------------------- +// A random bunch of overloaded operator tests + +module MultipleOverloadedOperatorTests = begin + + let f1 (x:DateTime) (y:TimeSpan) : DateTime = x - y + let g1 (x:DateTime) (y:DateTime) : TimeSpan = x - y + // Return type is also sufficient: + let f2 (x:DateTime) y : DateTime = x - y + let g2 (x:DateTime) y : TimeSpan = x - y + // Just argument types are also sufficient: + let f3 (x:DateTime) (y:TimeSpan) = x - y + let g3 (x:DateTime) (y:DateTime) = x - y +end + + +//--------------------------------------------------------------------- +// A random bunch of overloaded operator tests + +module OverloadedOperatorTests = begin + + + let x = [] + do printf "len = %d\n" x.Length + let c = ("abc").[2] + + let arr = [| 1 |] + do printf "len = %d\n" x.Length + let elem = arr.[0] + let _ = arr.[0] <- 3 + + let SCAL = new System.Collections.ArrayList() + let _ = SCAL.Add(3) + let _ = SCAL.[0] + let _ = SCAL.[0] <- box 4 + + let SCGL = new System.Collections.Generic.List() + let _ = SCGL.Add(3) + let _ = SCGL.[0] + let _ = SCGL.[0] <- 3 + + let f (x: 'a) = + let SCGL = new System.Collections.Generic.List<'a>() + let _ = SCGL.Add(x) + let _ = SCGL.[0] + let _ = SCGL.[0] <- x + () + + // check we have generalized + do f 1 + do f "3" + + let SCGD = new System.Collections.Generic.Dictionary() + let _ = SCGD.Add("hello",3.0) + let _ = SCGD.["hello"] + + let g (k: 'a) (v:'b)= + let SCGD = new System.Collections.Generic.Dictionary<'a,'b>() + let _ = SCGD.Add(k,v) + let _ = SCGD.[k] + let _ = SCGD.[k] <- v + () + + + + // check we have generalized + do g 1 "3" + do g "3" 1 + do g "3" "1" + do g 1 1 + + let h (v:'b)= + let arr = [| v;v;v |] + let elem = arr.[0] + let _ = arr.[0] <- v + () + + + // check we have generalized + do h 1 + do h "3" + +end + +module PropertyOverrideTests = begin + + [] + type A = class + abstract S1 : float with set + abstract S2 : string-> float with set + abstract S3 : string * string -> float with set + abstract G1 : float with get + abstract G2 : string-> float with get + abstract G3 : string * string -> float with get + end + + type IA = interface + abstract S1 : float with set + abstract S2 : string-> float with set + abstract S3 : string * string -> float with set + abstract G1 : float with get + abstract G2 : string-> float with get + abstract G3 : string * string -> float with get + end + + + + type CTest = + class + inherit A + override x.S1 with set v = () + override x.S2 with set s v = () + override x.S3 with set (s1,s2) v = () + override x.G1 with get () = 1.0 + override x.G2 with get (s:string) = 2.0 + override x.G3 with get (s1,s2) = 3.0 + interface IA with + override x.S1 with set v = () + override x.S2 with set s v = () + override x.S3 with set (s1,s2) v = () + override x.G1 with get () = 1.0 + override x.G2 with get (s:string) = 2.0 + override x.G3 with get (s1,s2) = 3.0 + end + + end + +end + +module FieldsInClassesDontContributeToRecordFieldInference = begin + + type container = class + val capacity : float + new(cap) = { capacity = cap } + end + + type cargo = class + val capacity : float // (Error does not appear when the name is changed to capacity1) + new(cap) = { capacity = cap } + end + + let total_capacity cl = List.fold(fun sum (z:container) -> z.capacity + sum) 0.0 cl + + let cap = total_capacity [ new container(100.0); new container(50.0)] + +end + +module LucianRecords1 = begin + type MyRecord1 = {a:int; x:int} + type MyRecord2 = {a:int; y:string} + let f (m:MyRecord1) : MyRecord1 = {m with a=3} + let g (m:MyRecord2) : MyRecord2 = {m with a=3} + let h (m:MyRecord1) = m.a + + type Tab = {a:string; b:string} + type Tac = {a:string; c:string} + type Test = Cab of Tab | Cac of Tac + let a = Cab( {a="hello"; b="world";} ) + +end + +module DefaultConstructorConstraints = begin + + let f1 () : 'a when 'a : (new : unit -> 'a) = new 'a() + let x1 = (f1() : obj) + let x2 = (f1() : int) + let x3 = (f1() : DateTime) + let x4 = (f1() : System.Windows.Forms.Form) + let f2 () = f1() + let y1 = (f2() : obj) + let y2 = (f2() : int) + let y3 = (f2() : DateTime) + let y4 = (f2() : System.Windows.Forms.Form) + +end + +module AccessBugOnFSharpList = begin + + open System.Web + open System.Web.Hosting + open System.Data.SqlClient + + type TopicPathProvider = + class + inherit VirtualPathProvider + + new() = { inherit VirtualPathProvider(); } + + member x.TopicExists topic = + let cmd = new SqlCommand() + cmd.CommandText <- "SELECT COUNT(*) FROM Topic WHERE Topic.Name = @name"; + (cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar, 255)).Value <- topic; + unbox(cmd.ExecuteScalar()) > 0 + + override x.FileExists((virtualPath: string)) = + let relPath = VirtualPathUtility.ToAppRelative(virtualPath) + if relPath.StartsWith("~/topic") then + x.TopicExists (relPath.Substring(7)) + else + x.Previous.FileExists(virtualPath) + + override x.DirectoryExists((virtualDir: string)) = + let relPath = VirtualPathUtility.ToAppRelative(virtualDir) + relPath.StartsWith("~/topic") || x.DirectoryExists(virtualDir) + end + + let AppInitialize() = + let provider = new TopicPathProvider() + HostingEnvironment.RegisterVirtualPathProvider(provider) + +end + + + +module TestConstrainedItemProperty = begin + type Foo = + interface + abstract Item : int -> string with get + end + + let f1 (x : #Foo) = x.[1] + + let f2 (x : #Foo) = x.[1] +end + + +module ExplicitSyntacCtor = begin + + type C = + class + val xx : int + new(x,y) = + if y then + { xx = x} + else + { xx = x+x} + new(x) = + let six = 3 + 3 + { xx = x} + static member Create() = + let six = 3 + 3 + new C(3+3) + new() = + let six = 3 + 3 + new C(3+3) + new(a,b,c) = new C(a+b+c) + new(a,b,c,d) = + new C(a+b+c+d) + then + printf "hello" + end + + + + type C1(x) = + class + let xx = x + x + let f x = x + x + let mutable state = x + x + xx + + do printf "hello\n" + + static member Create() = + let six = 3 + 3 + new C(3+3) + + new(x,y) = new C1(x+y) + + member self.Increment = state <- state + 1 + member self.Once= xx + member self.Twice = xx + xx + end + + let createRemoteAppDomain<'T> (d: AppDomain) = + unbox<'T>(d.CreateInstanceAndUnwrap(typeof<'T>.Assembly.FullName,typeof<'T>.FullName)) + + + // This is the simple version + let rec maxList x = + match x with + | [] -> failwith "no elements" + | [h] -> h + | h::t -> max h (maxList t) + + // This is how you use an accumulating parameter + + let rec maxListAcc acc x = + match x with + | [] -> acc + | [h] -> max acc h + | h::t -> maxListAcc (max acc h) t + + let maxList2 x = + match x with + | [] -> failwith "no elements" + | h::t -> maxListAcc h t + + type ICool = + interface + abstract tst : unit->bool + end + + [] + type Cool() = + class + abstract tst : unit -> bool + interface ICool with + member this.tst () = true + end + end + + type beCool() = + class + inherit Cool() + override this.tst() = false + interface ICool with + member this.tst () = (this : beCool).tst() + end + end + +end + +module Ex11 = + type MutableVector2D(dx:float,dy:float) = + let mutable currDX = dx + let mutable currDY = dy + + member this.DX with get() = currDX and set(v) = currDX <- v + member this.DY with get() = currDY and set(v) = currDY <- v + + member v.Length + with get () = sqrt(currDX*currDX+currDY*currDY) + and set len = + let theta = v.Angle + currDX <- cos(theta)*len; + currDY <- sin(theta)*len + + member c.Angle + with get () = atan2 currDY currDX + and set theta = + let len = c.Length + currDX <- cos(theta)*len; + currDY <- sin(theta)*len + + let v1 = MutableVector2D(3.0,4.0) + v1.Length + v1.Angle + v1.Angle <- System.Math.PI / 6.0 // = 30 degrees + v1.Length + v1.DX, v1.DY + + v1.DY / v1.Length + + type Vector2D(dx: float, dy: float) = + let length = sqrt(dx * dx + dy * dy) + member v.DX = dx + member v.DY = dy + member v.Length = length + member v.Scale(k) = Vector2D(k*dx, k*dy) + member v.ShiftX(dx') = Vector2D(dx=dx+dx', dy=dy) + member v.ShiftY(dy') = Vector2D(dx=dx, dy=dy+dy') + static member Zero = Vector2D(dx=0.0, dy=0.0) + static member OneX = Vector2D(dx=1.0, dy=0.0) + static member OneY = Vector2D(dx=0.0, dy=1.0) + + type SparseVector (items: seq)= + let elems = new System.Collections.Generic.SortedDictionary<_,_>() + do items |> Seq.iter (fun (k,v) -> elems.Add(k,v)) + member t.Item + with get i = + if elems.ContainsKey(i) then elems.[i] + else 0.0 + + type UnitVector2D(dx,dy) = + let tolerance = 0.000001 + let len = sqrt(dx * dx + dy * dy) + do if abs(len - 1.0) >= tolerance then failwith "not a unit vector"; + member v.DX = dx + member v.DY = dy + +module Ex11b = + type Vector2D (dx:float,dy:float) = + member x.DX = dx + member x.DY = dy + static member (+) ((v1:Vector2D),(v2:Vector2D)) = + Vector2D(v1.DX + v2.DX, v1.DY + v2.DY) + static member (-) ((v1:Vector2D),(v2:Vector2D)) = + Vector2D(v1.DX - v2.DX, v1.DY - v2.DY) + + let v1 = Vector2D(3.0,4.0) + v1 + v1 + v1 + v1 - v1 + + +module Ex11c = + type Vector2D (dx:float,dy:float) = + member x.DX = dx + member x.DY = dy + static member Create(? dx: float, ?dy:float) = + let dx = match dx with None -> 0.0 | Some v -> v + let dy = match dy with None -> 0.0 | Some v -> v + Vector2D(dx,dy) + +module T1 = + type Vector2D(dx: float, dy: float) = + let len = sqrt(dx * dx + dy * dy) + member v.DX = dx + member v.DY = dy + member v.Length = len + + Vector2D(1.0,1.0) = Vector2D(1.0,1.0) + +module Ex5 = + open System.Drawing + type Label(?text,?font) = + let text = match text with None -> "" | Some v -> v + let font = match font with None -> new Font(FontFamily.GenericSansSerif,12.0f) | Some v -> v + member x.Text = text + member x.Font = font + + Label(text="Hello World") + Label(font=new Font(FontFamily.GenericMonospace,36.0f), + text="Hello World") + +module Ex6 = + type IShape = + abstract Contains : Point -> bool + abstract BoundingBox : Rectangle + + and Vector = + { DX:float; DY:float } + member v.Length = sqrt(v.DX*v.DX+v.DY*v.DY) + static member (+) (v1:Vector,v2:Vector) = { DX=v1.DX+v2.DX; DY=v1.DY+v2.DY } + static member (-) (v1:Vector,v2:Vector) = { DX=v1.DX-v2.DX; DY=v1.DY-v2.DY } + + and Point = + { X:float; Y:float } + + static member (-) (p1:Point,p2:Point) = { DX=p1.X-p2.X; DY=p1.Y-p2.Y } + + static member (-) (p:Point,v:Vector) = { X=p.X-v.DX; Y=p.Y-v.DY } + + static member (+) (p:Point,v:Vector) = { X=p.X+v.DX; Y=p.Y+v.DY } + + and Rectangle = + {X1:float; Y1:float; X2:float; Y2:float} + static member Create(p1:Point,p2:Point) = + {X1=p1.X; Y1=p1.Y; X2=p2.X; Y2=p2.Y } + + + let circle(center:Point,radius:float) = + { new IShape with + member x.Contains(p:Point) = (p - center).Length < radius + member x.BoundingBox = + let diag = {DX=radius;DY=radius} + Rectangle.Create(center-diag,center+diag) } + + + let square(center:Point,side:float) = + { new IShape with + member x.Contains(p:Point) = + let v = (p - center) + abs(v.DX) < side/2.0 && abs(v.DY) < side/2.0 + member x.BoundingBox = + let diag = {DX=side/2.0;DY=side/2.0} + Rectangle.Create(center-diag,center+diag) } + + type MovingSquare() = + let mutable center = {X=0.0;Y=0.0} + let mutable side = 1.0 + member sq.Center with get() = center and set(v) = center <- v + member sq.SideLength with get() = side and set(v) = side <- v + interface IShape with + member x.Contains(p:Point) = + let v = (p - center) + abs(v.DX) < side/2.0 && abs(v.DY) < side/2.0 + member x.BoundingBox = + let diag = {DX=side/2.0;DY=side/2.0} + Rectangle.Create(center-diag,center+diag) + +module Ex7 = + open System.Drawing + type IShape = + abstract Contains : Point -> bool + abstract BoundingBox : Rectangle + + let circle(center:Point,radius:int) = + { new IShape with + member x.Contains(p:Point) = + let dx = float32 (p.X - center.X) + let dy = float32 (p.Y - center.Y) + sqrt(dx*dx+dy*dy) < float32 radius + member x.BoundingBox = + Rectangle(center.X-radius,center.Y-radius,2*radius,2*radius) } + + + let bigCircle = circle(Point(0,0), 100) + + bigCircle.BoundingBox + bigCircle.Contains(Point(70,70)) + bigCircle.Contains(Point(71,71)) + + let square(center:Point,side:int) = + { new IShape with + member x.Contains(p:Point) = + let dx = p.X - center.X + let dy = p.Y - center.Y + abs(dx) < side/2 && abs(dy) < side/2 + member x.BoundingBox = + Rectangle(center.X-side,center.Y-side,side*2,side*2) } + + type MovingSquare() = + let mutable center = Point(x=0,y=0) + let mutable side = 10 + member sq.Center with get() = center and set(v) = center <- v + member sq.SideLength with get() = side and set(v) = side <- v + interface IShape with + member x.Contains(p:Point) = + let dx = p.X - center.X + let dy = p.Y - center.Y + abs(dx) < side/2 && abs(dy) < side/2 + member x.BoundingBox = + Rectangle(center.X-side,center.Y-side,side*2,side*2) + + +module MoreOptionalArgTests = + open System + open System.Text + open System.Collections.Generic + + + let defaultArg x y = match x with None -> y | Some v -> v + + type T() = + static member OneNormalTwoOptional (arg1, ?arg2, ?arg3) = + let arg2 = defaultArg arg2 3 + let arg3 = defaultArg arg3 10 + arg1 + arg2 + arg3 + + static member TwoOptional (?arg1, ?arg2) = + let arg1 = defaultArg arg1 3 + let arg2 = defaultArg arg2 10 + arg1 + arg2 + + + test "optional arg test" (16 = T.OneNormalTwoOptional(3)) + test "optional arg test" (15 = T.OneNormalTwoOptional(3,2)) + test "optional arg test" (16 = T.OneNormalTwoOptional(arg1=3)) + test "optional arg test" (14 = T.OneNormalTwoOptional(arg1=3,arg2=1)) + test "optional arg test" (13 = T.OneNormalTwoOptional(arg2=3,arg1=0)) + test "optional arg test" (14 = T.OneNormalTwoOptional(arg2=3,arg1=0,arg3=11)) + test "optional arg test" (14 = T.OneNormalTwoOptional(0,3,11)) + test "optional arg test" (14 = T.OneNormalTwoOptional(0,3,arg3=11)) + + test "optional arg test" (16 = T.OneNormalTwoOptional(arg1=3)) + test "optional arg test" (14 = T.OneNormalTwoOptional(arg1=3,?arg2=Some(1))) + test "optional arg test" (14 = T.OneNormalTwoOptional(arg2=3,arg1=0,arg3=11)) + test "optional arg test" (14 = T.OneNormalTwoOptional(?arg2=Some(3),arg1=0,arg3=11)) + test "optional arg test" (14 = T.OneNormalTwoOptional(0,3,?arg3=Some(11))) + + + test "optional arg test" (13 = T.TwoOptional()) + test "optional arg test" (12 = T.TwoOptional(2)) + test "optional arg test" (11 = T.TwoOptional(arg1=1)) + test "optional arg test" (13 = T.TwoOptional(arg1=3)) + test "optional arg test" (14 = T.TwoOptional(arg1=3,arg2=11)) + test "optional arg test" (14 = T.TwoOptional(3,11)) + test "optional arg test" (14 = T.TwoOptional(3,arg2=11)) + do printfn "Done MoreOptionalArgTests" + + +module MoreRandomTests = + do printfn "MoreRandomTests" + + let memoize f = + let cache = ref Map.empty + fun x -> + match (!cache).TryFind(x) with + | Some res -> res + | None -> + let res = f x + cache := (!cache).Add(x,res) + res + + + + // Save computed results by using an internal dictionary. + // Note that memoize is inferred to have type + // ('a -> 'b) -> ('a -> 'b) + let memoize2 f = + let cache = System.Collections.Generic.Dictionary<_, _>() + fun x -> + let ok,res = cache.TryGetValue(x) + if ok then res + else let res = f x + cache.[x] <- res + res + + +module MemberTakingOptionalArgumentUsedAsFirstClassFunctionValue = + type C() = + static member M(?a:int) = a + + let pf = (C.M, C.M) + + fst pf () + snd pf () + +module StillMoreRandomTests = + do printfn "StillMoreRandomTests" + + type Var = string + + type ArithExpr = + | Sum of ArithExpr * ArithExpr + | Mul of ArithExpr * ArithExpr + | Neg of ArithExpr + | Var of Var + | Let of Var * ArithExpr * ArithExpr + + + type Circuit = + | And of Circuit * Circuit + | Not of Circuit + | True + | Var of Var + | Exists of Var * Circuit + + let False = Not(True) + let Forall(v,p) = Not(Exists(v,Not(p))) + let Or (p1,p2) = Not(And(Not(p1),Not(p2))) + + // nice infix notation, also deerived equality and implication + let (&&&) p1 p2 = And(p1,p2) + let (|||) p1 p2 = Or(p1,p2) + let (===) p1 p2 = (p1 &&& p2) ||| (Not(p1) &&& Not(p2)) + let (==>) p1 p2 = (Not(p1) ||| p2) + let Cond p1 p2 p3 = (p1 ==> p2) &&& (Not(p1) ==> p3) + + + type Env = Map + + let rec eval (env:Env) p = + match p with + | And(p1,p2) -> eval env p1 && eval env p2 + | Not(p1) -> not (eval env p1) + | Var(v) -> env.[v] + | True -> true + | Exists(v,p) -> + // Evaluate p with the variable 'true' + eval (env.Add(v,true)) p || + // Evaluate p with the variable 'false' + eval (env.Add(v,false)) p + + + eval Map.empty True + + let varCount = ref 0 + let freshVariable() = incr varCount; (!varCount).ToString() + + let hide1 g = + let stateVar = freshVariable() + let state = Var(stateVar) + Exists(stateVar, g(state)) + + //let circuit inp out = hide1 (fun state -> state === (state &&& inp) &&& out === state) + //let circuit2 inp out = hide1 (fun inner -> circuit inp inner &&& circuit inner out) + + /// Helper to generate a variable and generate a circuit that + /// uses the variable. + let forall1 g = + let v1 = freshVariable() + Forall(v1,g(Var(v1))) + + /// Same for three variables + let forall3 g = forall1 (fun v1 -> forall1 (fun v2 -> forall1 (fun v3 -> g v1 v2 v3))) + + // This is the circuit: it chooses the output based on the input + // The circuit looks at input 0, and chooses the ouput to be input 1 or input 2 + let circuit (inp : Circuit[]) out = + Cond inp.[0] (out === inp.[1]) (out === inp.[2]) + + /// This is a specification of one property of the circuit. It says + /// that if input 1 is the same as input 2 then the result is + /// this input, regardless of the values of the inputs + let check1 = forall3 (fun inp0 inp1 out -> circuit [| inp0;inp1;inp1 |] out ==> (out === inp1)) + + eval Map.empty check1 // 'true' - the property holds + + eval Map.empty (Cond True False False) = false + eval Map.empty (Cond True False True) = false + eval Map.empty (Cond True True False) = true + eval Map.empty (Cond False True False) = false + eval Map.empty (Cond False False True) = true + eval Map.empty (False === True) = false + eval Map.empty (False === False) = true + eval Map.empty (True === True) = true + eval Map.empty (True === False) = false + eval Map.empty (Forall("a",Var("a") === Var("a"))) = true + eval Map.empty (Forall("a",Var("a") ==> Var("a"))) = true + eval Map.empty (Forall("a",Not(Var("a") === Var("a")))) = false + eval Map.empty (Forall("a",Forall("b",Var("a") === Var("b")))) = true + +module MemoizeSample = + do printfn "MemoizeSample" + + type Function<'a,'b> = interface + abstract Item : 'a -> 'b with get + abstract Clear : unit -> unit + end + + let memoize f = + let lookasideTable = new System.Collections.Generic.Dictionary<_,_>() + { new Function<_,_> with + member t.Item + with get(n) = + if lookasideTable.ContainsKey(n) then lookasideTable.[n] + else let res = f n + lookasideTable.Add(n,res) + res + member t.Clear() = + lookasideTable.Clear() } + + + let rec fibFast = memoize (fun n -> if n <= 2 then 1 else fibFast.[n-1] + fibFast.[n-2]) + + fibFast.[3] + fibFast.[30] + fibFast.Clear() + +(* +module NameLookupServiceExample = + do printfn "NameLookupServiceExample" + type NameLookupService = + abstract Contains : string -> bool + abstract ClosestPrefixMatch : string -> string + + let simpleNameLookup (words: string list) = + let wordTable = Set.ofSeq(words) + let score (w1:string) (w2:string) = + let lim = (min w1.Length w2.Length) + let rec loop i acc = + if i >= lim then acc + else loop (i+1) (Char.code w1.[i] - Char.code w2.[i] + acc) + loop 0 0 + + { new NameLookupService with + member t.Contains(w) = wordTable.Contains(w) + member t.ClosestPrefixMatch(w) = + if wordTable.Contains(w) then w + else + printfn "w = %s" w + let above = + match wordTable.GetNextElement(w) with + | Some w2 when w2.StartsWith(w) -> Some w2 + | _ -> None + let below = + match wordTable.GetPreviousElement(w) with + | Some w2 when w2.StartsWith(w) -> Some w2 + | _ -> None + printfn "above = %A, below = %A" above below + match above, below with + | Some w1,Some w2 -> if score w w1 > score w w2 then w2 else w1 + | Some res,None + | None,Some res -> res + | None,None -> failwith "no match!" } + + + let capitalLookup = simpleNameLookup ["London";"Paris";"Warsaw";"Tokyo"] + + capitalLookup.Contains "Paris" + capitalLookup.ClosestPrefixMatch "Wars" + +*) + + +module ConstraintsInMembers = begin + + type IDuplex = + interface + end + + type IServer = + interface + end + + let bind (a:#IServer) = "2" + + let Bind1(v:#IDuplex) : string = bind v + + type C() = + member x.Bind1(v:#IDuplex) : string = bind v + member x.Bind2(v:#IDuplex) : string = bind v +end + +module DelegateByrefCreation = begin + type D = delegate of int byref -> int + type D2 = delegate of int byref * int byref -> int + + let createImmediateDelegate = new D(fun b -> b) + let createImmediateDelegate2 = new D2(fun b1 b2 -> b1 + b2) +end + +module InterfaceCastingTests = begin + + type IBar = + interface + end + + type IFoo = + interface + end + + type C() = + class + end + + type D() = + class + interface IFoo + end + + type Struct = + struct + val x : int + end + + type R = + { c : int } + + type U = + A | B + + + let checkPatternTestInterfaceToInterface(l:IBar list) = + match l with + | [:? IFoo] -> None + | _ -> None + + let checkPatternTestInterfaceToUnsealedClassImplicit(l:IBar list) = + match l with + | [:? C] -> None + | _ -> None + + let checkPatternTestInterfaceToUnsealedClassExplicit(l:IBar list) = + match l with + | [:? D] -> None + | _ -> None + + + + let checkTypeTestInterfaceToInterface(l:IBar ) = + (l :? IFoo) + + let checkTypeTestInterfaceToUnsealedClassImplicit(l:IBar) = + (l :? C) + + let checkTypeTestInterfaceToUnsealedClassExplicit(l:IBar) = + (l :? D) + + let checkCoercionInterfaceToInterface(l:IBar ) = + (l :?> IFoo) + + let checkCoercionInterfaceToUnsealedClassImplicit(l:IBar) = + (l :?> C) + + let checkCoercionInterfaceToUnsealedClassExplicit(l:IBar) = + (l :?> D) + + let checkDowncastInterfaceToInterface(l:IBar ) = + (downcast l : IFoo) + + let checkDowncastInterfaceToUnsealedClassImplicit(l:IBar) = + (downcast l : C) + + let checkDowncastInterfaceToUnsealedClassExplicit(l:IBar) = + (downcast l : D) + +end + + +module MiscGenericOverrideTest = + do printfn "MiscGenericOverrideTest" + type 'a Class2 = + class + inherit obj + new () = { inherit obj(); } + override this.ToString() = base.ToString() + end + +module GlobalTickTock = + //let x = 1 + do printfn "GlobalTickTock" + type TickTock = Tick | Tock + type time = float + let private x = ref Tick + + // public module M = +// let x = 1 + + //let (private ticked,public TickEvent) = Event.create() + //let internal oneTick() = + // (x := match !x with Tick -> Tock | Tock -> Tick); + // ticked(!x) + + +module RecursiveInheritanceExampleFromTomas = + type ISome = + interface + abstract InterfaceMethod : int -> int + end + and Test = + class + interface ISome with + member this.InterfaceMethod (a) = + a + 5 + end + end + + + +module DefaultImplementationsOfAbstractProperties = + type A() = class + abstract Prop : int with set + abstract Prop : int with get + default x.Prop + with get() = printf "A::Prop.get"; 6 + and set(v) = printf "A::Prop.set(%d)" v + end + +module StructDefinition = + type ('h,'t) BUN = + struct + val head : 'h + val tail : 't + new(h,t) = {head = h; tail = t} + end + + let heap = Array.init 100 (fun i -> BUN(i,i)) + + let _ = heap.[3] + + +module StructKeywordAsConstraintTest = + + type Struct1<'a when 'a : struct> = + struct + val x : int + end + + type Struct2<'a when 'a : not struct> = + struct + val x : int + end + + type Class1<'a when 'a : struct> = + class + val x : int + end + + type Class2<'a when 'a : not struct> = + class + val x : int + end + + type Class1b<'a when 'a : struct>(x:int) = + member self.X = x + + type Class2b<'a when 'a : not struct>(x:int) = + member self.X = x + + +module StaticInitializerTest1 = + + type C<'a>() = + static let mutable v = 2 + 2 + static do v <- 3 + + member x.P = v + static member P2 = v+v + + test "lwnohivw0" ((new C()).P = 3) + test "lwnohivw1" ((new C()).P = 3) + test "lwnohivw2" ((new C()).P = 3) + test "lwnohivw3" ((C.P2) = 6) + test "lwnohivw4" ((C.P2) = 6) + +module StaticInitializerTest2 = + + type C() = + static let mutable v = 2 + 2 + static do v <- 3 + + member x.P = v + static member P2 = v+v + + check "lwnohivq01" (new C()).P 3 + check "lwnohivq12" (new C()).P 3 + check "lwnohivq33" C.P2 6 + check "lwnohivq44" C.P2 6 + + +module StaticInitializerTest3 = + + let x = ref 2 + do x := 3 + + type C() = + static let mutable v = x.Value + 1 + static do v <- 3 + + member x.P = v + static member P2 = v+x.Value + + check "lwnohivq05" (new C()).P 3 + check "lwnohivq16" (new C()).P 3 + check "lwnohivq37" C.P2 6 + check "lwnohivq48" C.P2 6 + + +module OkStructTest3 = begin + type OkStruct1 = + struct + val x : list + end +end + +module FSharp_1_0_bug_1748_Problem_Calling_A_Base_Member_A = begin + + type C<'a>(value) = + member x.BaseM() = printf "out %d" value + + type D<'b>(value:int) = + inherit C<'b>(value) + + member x.M() = base.BaseM() + +end + +module FSharp_1_0_bug_1748_Problem_Calling_A_Base_Member_B = begin + + type Exp<'c when 'c :> Exp<'c>> = abstract Print : unit -> unit + + type PrintLit<'c when 'c :> Exp<'c>>(value) = + member x.Value = value + member x.BasePrint() = printf "out %d" x.Value + interface Exp<'c> with + member x.Print() = x.BasePrint() + + type PrintAdd<'c when 'c :> Exp<'c>>(left:'c, right:'c) = + member x.Left = left + member x.Right = right + member x.BasePrint() = x.Left.Print(); printf "+"; x.Right.Print() + interface Exp<'c> with + member x.Print() = x.BasePrint() + + type EvalExp<'c when 'c :> EvalExp<'c>> = + inherit Exp<'c> + abstract Eval : unit -> int + + type EvalLit<'c when 'c :> EvalExp<'c>>(value:int) = + inherit PrintLit<'c>(value) + member x.BaseEval() = x.Value + interface EvalExp<'c> with + //the base is not strictly necessary here, but used for clarity + member x.Print() = base.BasePrint() + member x.Eval() = x.BaseEval() + + type EvalAdd<'c when 'c :> EvalExp<'c>>(left:'c, right:'c) = + inherit PrintAdd<'c>(left, right) + member x.BaseEval() = x.Left.Eval() + x.Right.Eval() + interface EvalExp<'c> with + member x.Print() = base.BasePrint() + member x.Eval() = x.BaseEval() + + type EvalExpFix = inherit EvalExp + + type EvalLitFix(value) = + inherit EvalLit(value) + interface EvalExpFix with + member x.Print() = base.BasePrint() + member x.Eval() = base.BaseEval() + + type EvalAddFix(left:EvalExpFix, right:EvalExpFix) = + inherit EvalAdd(left, right) + interface EvalExpFix with + member x.Print() = base.BasePrint() + member x.Eval() = base.BaseEval() + + let e1 = new EvalLitFix(2) + let e2 = new EvalLitFix(3) + let e3 = new EvalAddFix(e1, e2) :> EvalExpFix + do e3.Print() + System.Console.Write(" = " + e3.Eval().ToString()) +end + + + +module Test1 = begin + type C() = class end + + type ITest = interface + abstract member Read : #C -> unit + end + + type Impl() = + interface ITest with + override this.Read (orgList : #C) = printfn "done" + end + + let impl() = + { new ITest with + override this.Read (orgList : #C) = printfn "done" + } +end + +module Test2 = begin + + type C<'a>() = class end + + type ITest<'d> = interface + abstract member Read : #C<'a> -> unit + end + + type Impl() = + interface ITest with + override this.Read (orgList : #C<'b>) = printfn "done" + end + + let impl() = + { new ITest with + override this.Read (orgList : #C<'b>) = printfn "done" + } + +end + + +module Test3 = begin + + type C<'a>() = class end + + type ITest<'d> = interface + abstract member Read<'b when 'b :> C<'d> > : 'd -> unit + end + + type Impl() = + interface ITest with + override this.Read<'c when 'c :> C > _ = printfn "done" + end + + let impl() = + { new ITest with + override this.Read<'c when 'c :> C > _ = printfn "done" + } + +end +module Test4 = begin + + type C<'a>() = class end + + type ITest<'d> = interface + abstract member Read<'b > : 'b -> unit + end + + type Impl() = + interface ITest with + override this.Read _ = printfn "done" + end + + let impl() = + { new ITest with + override this.Read _ = printfn "done" + } + +end + +module Test5 = begin + + type ITest = interface + abstract member Read<'b > : int -> unit + end + + type Impl() = + interface ITest with + override this.Read _ = printfn "done" + end + + let impl() = + { new ITest with + override this.Read _ = printfn "done" + } + +end + +module Test6 = begin + + + type ITest<'d> = interface + abstract member Read : int -> unit + end + + type Impl<'e>() = + interface ITest <'e> with + override this.Read (orgList : int) = printfn "done" + end + + let impl<'e>() = + { new ITest <'e> with + override this.Read (orgList : int) = printfn "done" + } + +end + + +module Test7 = begin + + type ITest<'d> = interface + abstract member Read : 'd -> unit + end + + type Impl<'e>() = + interface ITest <'e> with + override this.Read (orgList : 'e) = printfn "done" + end + + let impl() = + { new ITest <'e> with + override this.Read (orgList : 'e) = printfn "done" + } + +end + + + +module Test8 = begin + + type C<'a>() = class end + + type ITest<'q> = interface + abstract member Read : #C<'q> -> unit + end + + type Impl<'f>() = + interface ITest <'f> with + override this.Read (orgList : #C<'f>) = printfn "done" + end + + let impl() = + { new ITest <'f> with + override this.Read (orgList : #C<'f>) = printfn "done" + } + +end + + +// FSB 1112, Bug in definition of generic interface + +module Test9 = begin + open System.Collections.Generic + + type ITest<'T> = interface + abstract member Read : #IList<'T> -> unit + end + + type Impl<'t>() = + interface ITest<'t> with + override this.Read (orgList : #IList<'t>) = printfn "done" + + + let impl = {new ITest<'t> with + override this.Read orgList = printfn "done"}; + +end + + +module InterfaceEndTokenTests_bugs_FSharp_1_0_1148_and_1431 = + type IFoo = interface + abstract Meth3 : unit -> unit + end + + type IBar = interface + abstract Meth3 : unit -> unit + end + + + type Foo() = class + interface IFoo with + member this.Meth3 () = () + end + + type Foo1x() = class + interface IFoo with + member this.Meth3 () = () + end + end + + type Foo1b() = + class + interface IFoo with + member this.Meth3 () = () + end + + type Foo1c() = + class + interface IFoo with + member this.Meth3 () = () + end + + type Foo1d() = + class + interface IFoo with + member this.Meth3 () = () + + // note the 'end' token doesn't have to align with 'class' + end + + type Foo1e() = + class + interface IFoo with + member this.Meth3 () = () + + // note the 'end' token doesn't have to align with 'class' + end + + type Foo2() = class + interface IFoo with + member this.Meth3 () = () + end + end + + + type Foo3() = + interface IFoo with + member this.Meth3 () = () + end + + type Foo4() = + interface IFoo with + member this.Meth3 () = () + end + + + type Foo5() = + interface IFoo with + member this.Meth3 () = () + + type Foo6() = + interface IFoo with + member this.Meth3 () = () + interface IBar with + member this.Meth3 () = () + + + type Foo7() = + interface IFoo with + member this.Meth3 () = () + interface IBar with + member this.Meth3 () = () + end + + type Foo7b() = + interface IFoo with + member this.Meth3 () = () + end + interface IBar with + member this.Meth3 () = () + end + + type Foo8() = + interface IFoo with + member this.Meth3 () = () + end + interface IBar with + member this.Meth3 () = () + + type Foo9() = + interface IFoo with + member this.Meth3 () = () + end + interface IBar with + member this.Meth3 () = () + + type Foo10() = + interface IFoo with + member this.Meth3 () = () + end + // Spec issue: interfaces and members can progressively indent if 'end' tokens included + interface IBar with + member this.Meth3 () = () + + + +type node = + interface + abstract wombat :string + end +type nodeB = + //member it.dummy = "dummy" + interface node with + member it.wombat = "B.wombat" + + +module Check_Static_Let_Bindings_In_Structs = + let r = ref 0 + + [] + type S(x:int) = + static let mutable v = 3 + static do printfn "Initialize S" + static do v <- v + 1 + //do printfn "hello" + //do incr r + member y.P = x + static member V = v + + do test "vr09jrweokm" (S.V = 3 || S.V = 4) + //do test "vr09jrweokm" (!r = 0) + let s3 = S(3) + let s4 = S(4) + do test "vr09jrweokm" (S.V = 4) + //do test "vr09jrweokm" (!r = 2) + +module UnitArgs = + let f () = + printfn "hello from f" + printfn "hello from f" + printfn "hello from f" + printfn "hello from f" + printfn "hello from f" + printfn "hello from f" + 1+2 + + let f2 (c:unit) = + printfn "hello from f2"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + 1+2 + + let f3 = fun () -> + printfn "hello from f3"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + 1+2 + + let f4 = function () -> + printfn "hello from f4"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + 1+2 + + let f5 = (fun () -> + printfn "hello from f5"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + printfn "hello"; + 1+2) + + + type C(x:int) = + static member M() = + printfn "hello from C.M" + printfn "hello from C.M" + printfn "hello from C.M" + printfn "hello from C.M" + printfn "hello from C.M" + printfn "hello from C.M" + 1+2 + + member x.M2() = + printfn "hello from C.M2" + printfn "hello from C.M2" + printfn "hello from C.M2" + printfn "hello from C.M2" + printfn "hello from C.M2" + printfn "hello from C.M2" + 1+2 + member x.M3 = fun () -> + printfn "hello from C.M3" + printfn "hello from C.M3" + printfn "hello from C.M3" + printfn "hello from C.M3" + printfn "hello from C.M3" + printfn "hello from C.M3" + 1+2 + member x.M4 () () = + printfn "hello from C.M4" + printfn "hello from C.M4" + printfn "hello from C.M4" + printfn "hello from C.M4" + printfn "hello from C.M4" + printfn "hello from C.M4" + 1+2 + f() + List.map f [();();()] + f2() + List.map f2 [();();()] + f2() + List.map f3 [();();()] + f3() + List.map f4 [();();()] + f4() + List.map f5 [();();()] + f5() + List.map C.M [();();()] + C.M() + let c = C(3) + c.M2() + List.map c.M2 [();();()] + c.M3() + List.map c.M3 [();();()] + c.M4() () + List.map (c.M4 ()) [();();()] + +//--------------------------------------------------------------------- +// Finish up + + + + +module SingleArgumentFunctions = + type C() = + let f0 () = 1 + let f1 (x:int) = x + let f2 (x:int) = f1 x + f0() + let rec f3 (x:int) = 2 + let f4 (x:int) = f3 x + f0() + let v = f4 5 + let f5 (x:int) = f4 v + 6 + let rec f6 (x:int) = if x = 0 then 6 else f6 (x-1) + let v2 = f6 5 + let v3 = List.map f0 [(); ()] + let v4 = List.map f1 [1;2] + let v5 = List.map f3 [1;2] + member x.Result = + List.sum v3 + List.sum v4 + List.sum v5 + v2 + v + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09j" (c.Result = 18) + +module MultiArgumentFunctions = + type C() = + let f1 (x1:int) x2 = x1 + x2 + let v5 = f1 2 3 + member x.Result = + f1 3 4 + v5 + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09h" (c.Result = 12) + + + +module TupledMultiArgumentFunctions = + type C() = + let f1 (x1:int,x2:int) (x3:int,x4:int) = x1 + x2 + x3 + x4 + let v5 = f1 (2,3) (4,5) + member x.Result = + f1 (6,7) (8,9) + v5 + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09g" (c.Result = 44) + +module FunctionInGenericClass = + type C<'a>() = + let f1 (x1:int) = x1 + 3 + let v5 = f1 3 + member x.Result = + f1 6 + v5 + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09f" (c.Result = 15) + +module GenericFunctions = + type C() = + let f1 x1 = x1 + let f2 (x : 'a) : 'a when 'a :> System.IComparable = x + let v5 = f1 3 + let v6 = f1 "hello" + let v7 = f2 1 + let v8 = f2 "hello" + member x.Result = + f1 6 + v5 + v6.Length + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09d" (c.Result = 14) + +module GenericFunctionInGenericClass = + type C<'a>() = + let f1 x1 = x1 + let rec f2 n x1 = if n = 0 then x1 else f2 (n-1) x1 + let rec f3 n (x1:int) = if n = 0 then x1 else f2 (n-1) x1 + let v5 = f1 3 + sizeof<'a> + let v6 = f1 "hello" + let v7 = f2 8 3 + sizeof<'a> + let v8 = f2 10 "hello" + let v9 = f3 8 3 + sizeof<'a> + member x.Result = + f1 6 + v5 + v6.Length + v7 + v8.Length + f2 8 6 + f3 8 6 + member x.Functions = + (f1 : int -> int), (f1 : string -> string), + (f2 : int -> int -> int), (f2 : int -> string -> string), + // Non generic function in generic class used as a first class value + (f3 : int -> int -> int) + + let c = C() + printfn "c.Result = %d" c.Result + let c2 = C() + printfn "c2.Result = %d" c2.Result + test "vrewiorvw09s" (c.Result = 42) + test "vrewiorvw09a" (c2.Result = 50) + +module TailCallLoop = + type C<'a>() = + let rec f x = if x = 0 then 1 else f (x - 1) + let v5 = f 10000000 + member x.Result = + f 10000000 + v5 + + let c = C() + printfn "c.Result = %d" c.Result + let c2 = C() + printfn "c2.Result = %d" c2.Result + test "vrewiorvw09o" (c.Result = 2) + test "vrewiorvw09i" (c2.Result = 2) + +module FunctionsAsLambdas = + type C() = + let f0 = fun () -> 1 + let f1 = fun (x:int) -> x + let f2 = fun (x:int) -> f1 x + f0() + let rec f3 = fun (x:int) -> 2 + let f4 = fun (x:int) -> f3 x + f0() + let v = f4 5 + let f5 = fun (x:int) -> f4 v + 6 + let rec f6 = fun (x:int) -> if x = 0 then 6 else f6 (x-1) + let v2 = f6 5 + let v3 = List.map f0 [(); ()] + let v4 = List.map f1 [1;2] + let v5 = List.map f3 [1;2] + let f6 = fun (x1:int) x2 -> x1 + x2 + let v6 = f6 2 3 + let f7 = fun (x1:int,x2:int) (x3:int,x4:int) -> x1 + x2 + x3 + x4 + let v7 = f7 (2,3) (4,5) + let f8 = fun (x1:int,x2:int) () -> x1 + x2 + let v8 = f8 (2,3) () + let f9 = fun () -> fun (x1:int,x2:int) -> x1 + x2 + let v9 = f9 () (2,3) + let f10 = fun x1 -> x1 + let v10a = f10 3 + let v10b = f10 "hello" + member x.Result = + List.sum v3 + List.sum v4 + List.sum v5 + v2 + v + v6 + v7 + v8 + v9 + v10a + v10b.Length + + let c = C() + printfn "c.Result = %d" c.Result + test "vrewiorvw09u" (c.Result = 55) + + + +module Pathological1 = + type C<'a>() = + let mutable f1 = fun x1 -> x1 + let v5 = f1 3 + sizeof<'a> + member x.Result = + f1 6 + v5 + + let c = C() + printfn "c.Result = %d" c.Result + let c2 = C() + printfn "c2.Result = %d" c2.Result + test "vrewiorvw09y" (c.Result = 13) + test "vrewiorvw09t" (c2.Result = 17) + + + +module StaticSingleArgumentFunctions = + type C() = + static let f0 () = 1 + static let f1 (x:int) = x + static let f2 (x:int) = f1 x + f0() + static let rec f3 (x:int) = 2 + static let f4 (x:int) = f3 x + f0() + static let v = f4 5 + static let f5 (x:int) = f4 v + 6 + static let rec f6 (x:int) = if x = 0 then 6 else f6 (x-1) + static let v2 = f6 5 + static let v3 = List.map f0 [(); ()] + static let v4 = List.map f1 [1;2] + static let v5 = List.map f3 [1;2] + static member Result = + List.sum v3 + List.sum v4 + List.sum v5 + v2 + v + + printfn "c.Result = %d" C.Result + test "vrewiorvw09r" (C.Result = 18) + +module StaticMultiArgumentFunctions = + type C() = + static let f1 (x1:int) x2 = x1 + x2 + static let v5 = f1 2 3 + static member Result = + f1 3 4 + v5 + + printfn "c.Result = %d" C.Result + test "vrewiorvw09e" (C.Result = 12) + +module StaticTupledMultiArgumentFunctions = + type C() = + static let f1 (x1:int,x2:int) (x3:int,x4:int) = x1 + x2 + x3 + x4 + static let v5 = f1 (2,3) (4,5) + static member Result = + f1 (6,7) (8,9) + v5 + + printfn "c.Result = %d" C.Result + test "vrewiorvw09w" (C.Result = 44) + +module StaticFunctionInGenericClass = + type C<'a>() = + static let f1 (x1:int) = x1 + 3 + sizeof<'a> + static let v5 = f1 3 + static member Result = + f1 6 + v5 + + printfn "C.Result = %d" (C.Result) + printfn "C.Result = %d" (C.Result) + test "vrewiorvw09q" (C.Result = 23) + test "vrewiorvw099" (C.Result = 31) + +module StaticGenericFunctions = + type C() = + static let f1 x1 = x1 + static let f2 (x : 'a) : 'a when 'a :> System.IComparable = x + static let v5 = f1 3 + static let v6 = f1 "hello" + static let v7 = f2 1 + static let v8 = f2 "hello" + static member Result = + f1 6 + v5 + v6.Length + + printfn "c.Result = %d" C.Result + test "vrewiorvw098" (C.Result = 14) + +module StaticGenericFunctionInGenericClass = + type C<'a>() = + static let f1 x1 = x1 + static let rec f2 n x1 = if n = 0 then x1 else f2 (n-1) x1 + static let rec f3 n (x1:int) = if n = 0 then x1 else f2 (n-1) x1 + static let v5 = f1 3 + sizeof<'a> + static let v6 = f1 "hello" + static let v7 = f2 8 3 + sizeof<'a> + static let v8 = f2 10 "hello" + static let v9 = f3 8 3 + sizeof<'a> + static member Result = + f1 6 + v5 + v6.Length + v7 + v8.Length + f2 8 6 + f3 8 6 + static member Functions = + (f1 : int -> int), (f1 : string -> string), + (f2 : int -> int -> int), (f2 : int -> string -> string), + // Non generic function in generic class used as a first class value + (f3 : int -> int -> int) + + printfn "C.Result = %d" (C.Result) + printfn "C.Result = %d" (C.Result) + test "vrewiorvw097" (C.Result = 42) + test "vrewiorvw096" (C.Result = 50) + +module StaticTailCallLoop = + type C<'a>() = + static let rec f x = if x = 0 then sizeof<'a> else f (x - 1) + static let v5 = f 10000000 + static member Result = + f 10000000 + v5 + + printfn "C.Result = %d" (C.Result) + printfn "C.Result = %d" (C.Result) + test "vrewiorvw095" (C.Result = 8) + test "vrewiorvw094" (C.Result = 16) + +module StaticFunctionsAsLambdas = + type C() = + static let f0 = fun () -> 1 + static let f1 = fun (x:int) -> x + static let f2 = fun (x:int) -> f1 x + f0() + static let rec f3 = fun (x:int) -> 2 + static let f4 = fun (x:int) -> f3 x + f0() + static let v = f4 5 + static let f5 = fun (x:int) -> f4 v + 6 + static let rec f6 = fun (x:int) -> if x = 0 then 6 else f6 (x-1) + static let v2 = f6 5 + static let v3 = List.map f0 [(); ()] + static let v4 = List.map f1 [1;2] + static let v5 = List.map f3 [1;2] + static let f6 = fun (x1:int) x2 -> x1 + x2 + static let v6 = f6 2 3 + static let f7 = fun (x1:int,x2:int) (x3:int,x4:int) -> x1 + x2 + x3 + x4 + static let v7 = f7 (2,3) (4,5) + static let f8 = fun (x1:int,x2:int) () -> x1 + x2 + static let v8 = f8 (2,3) () + static let f9 = fun () -> fun (x1:int,x2:int) -> x1 + x2 + static let v9 = f9 () (2,3) + static let f10 = fun x1 -> x1 + static let v10a = f10 3 + static let v10b = f10 "hello" + static member Result = + List.sum v3 + List.sum v4 + List.sum v5 + v2 + v + v6 + v7 + v8 + v9 + v10a + v10b.Length + + printfn "c.Result = %d" C.Result + test "vrewiorvw093" (C.Result = 55) + + + +module StaticPathological1 = + type C<'a>() = + static let mutable f1 = fun x1 -> x1 + static let v5 = f1 3 + sizeof<'a> + static member Result = + f1 6 + v5 + + printfn "C.Result = %d" (C.Result) + printfn "C.Result = %d" (C.Result) + test "vrewiorvw092" (C.Result = 13) + test "vrewiorvw091" (C.Result = 17) + +module ImplicitOperatorTests = + type Foo(x : int) = + member this.Val = x + + static member (-->) ((src : Foo), (target : Foo)) = new Foo(src.Val + target.Val) + static member (-->) ((src : Foo), (target : int)) = new Foo(src.Val + target) + + static member (!!) (src : Foo) = new Foo(-src.Val) + + static member (+) ((src : Foo), (target : Foo)) = new Foo(src.Val + target.Val) + static member (+) ((src : Foo), (target : int)) = new Foo(src.Val + target) + + let x = Foo(3) --> 4 + let y = Foo(3) --> Foo(5) + let z = (-->) (Foo(3)) (Foo(5)) + let f1 : Foo -> Foo = (-->) (Foo(3)) + let _ = f1 (Foo(5)) + let f2 : int -> Foo = (-->) (Foo(3)) + let _ = f2 3 + let x2 = Foo(3) + 4 + let y2 = Foo(3) + Foo(4) + let z2 = !!Foo(3) + +module SlicingTests = + let s1 = "abcdef" + + check "ce0cew9j1" s1.[2..] "cdef" + check "ce0cew9j2" s1.[2..2] "c" + check "ce0cew9j3" s1.[5..5] "f" + check "ce0cew9j4" s1.[0..0] "a" + check "ce0cew9j5" s1.[2..1] "" + check "ce0cew9j6" s1.[0.. -1] "" + check "ce0cew9j7" s1.[2..3] "cd" + check "ce0cew9j8" s1.[2..4] "cde" + check "ce0cew9j9" s1.[2..5] "cdef" + + + let a1 = [| for c in "abcdef" -> c |] + + check "ce0cew9jq" a1.[2..] [| for c in "cdef" -> c |] + + a1.[3..] <- [| for c in "DEF" -> c |] + + check "ce0cew9jw" a1.[2..] [| for c in "cDEF" -> c |] + + let m1 = Array2D.init 6 7 (fun i j -> i + 2*j) + + check "ce0cew9je" m1 (Array2D.init 6 7 (fun i j -> i + 2*j)) + for i = 1 to 5 do + for j = 1 to 6 do + check "ce0cew9jr" m1.[1..i,1..j] (Array2D.init i j (fun i j -> (i+1) + 2*(j+1))) + + + m1.[1..3,1..4] <- Array2D.zeroCreate 3 4 + + for i = 1 to 5 do + for j = 1 to 6 do + check "ce0cew9js" m1.[1..i,1..j] (Array2D.init i j (fun i j -> if (i+1) >= 1 && (i+1) <= 3 && (j+1) >= 1 && (j+1) <= 4 then 0 else (i+1) + 2*(j+1))) + + + + type System.Int32 with + member x.GetSlice(idx1,idx2) = + let idx1 = defaultArg idx1 0 + let idx2 = defaultArg idx2 17 + x % (17 * idx1 + idx2) + member x.GetSlice(idx1,idx2,idx3,idx4) = + let idx1 = defaultArg idx1 0 + let idx2 = defaultArg idx2 17 + let idx3 = defaultArg idx3 17 + let idx4 = defaultArg idx4 17 + x % (17 * idx1 + idx2 + idx3 + idx4) + + (3).[3..4] + (3).[3..] + (3).[..4] + + (3).[3..4,4..5] + (3).[3..,6..7] + (3).[..4,8..9] + (3).[..4,*] + (3).[*,*] + + type Foo() = + member this.GetSlice(lb1:int option, ub1:int option) = [1] + member this.SetSlice(lb1:int option, ub1:int option, v2D: int list) = () + + let f = new Foo() + + let vs = f.[1 .. 3] + f.[1..3] <- [3] + f.[..3] <- [3] + f.[1..] <- [3] + f.[*] <- [3] + +module Bug_FSharp_1_0_3246 = + type r1 = + { x : int } + static member Empty = { x = 3 } + + and r2 = + { x : int } + static member Empty = { x = 3 } + + let r1 : r1 = r1.Empty + let r2 : r2 = r2.Empty + +module First_class_use_of_non_overloaded_method_should_detuple_1 = + + let count = ref 0 + type A() = + let f (x,y) = incr count; printfn "hello"; incr count + member this.M0 () = f (1,2) + member this.M1 (x:int) = f (x,x) + member this.M2 (x:int,y:float) = f (x,y) + + static member SM0 () = incr count; printfn "hello"; incr count + static member SM1 (x:int) = incr count; printfn "hello"; incr count + static member SM2 (x:int,y:float) = incr count; printfn "hello"; incr count + + + [| (1,3.0) |] |> Array.iter (fun (x,y) -> A.SM2 (x,y)) + [| (1,3.0) |] |> Array.iter (fun d -> A.SM2 d) + [| (1,3.0) |] |> Array.iter A.SM2 + + [| 1;2;3 |] |> Array.iter (fun d -> A.SM1 d) + [| 1;2;3 |] |> Array.iter A.SM1 + + [| ();();() |] |> Array.iter (fun d -> A.SM0()) + [| ();();() |] |> Array.iter A.SM0 + + let a = A() + [| (1,3.0) |] |> Array.iter (fun (x,y) -> a.M2 (x,y)) + [| (1,3.0) |] |> Array.iter (fun d -> a.M2 d) + [| (1,3.0) |] |> Array.iter a.M2 + + [| 1;2;3 |] |> Array.iter (fun d -> a.M1 d) + [| 1;2;3 |] |> Array.iter a.M1 + + [| ();();() |] |> Array.iter (fun d -> a.M0()) + [| ();();() |] |> Array.iter a.M0 + +module First_class_use_of_non_overloaded_method_should_detuple_2 = + + let count = ref 0 + type A<'a>() = + let f (x,y) = incr count; printfn "hello"; incr count + member this.M0 () = f (1,2) + member this.M1 (x:'a) = f (x,x) + member this.M2 (x:'a,y:'a) = f (x,y) + + static member SM0 () = incr count; printfn "hello"; incr count + static member SM1 (x:'a) = incr count; printfn "hello"; incr count + static member SM2 (x:'a,y:'a) = incr count; printfn "hello"; incr count + + + [| (1,3) |] |> Array.iter (fun (x,y) -> A.SM2 (x,y)) + [| (1,3) |] |> Array.iter (fun d -> A.SM2 d) + [| (1,3) |] |> Array.iter A.SM2 + + [| 1;2;3 |] |> Array.iter (fun d -> A.SM1 d) + [| 1;2;3 |] |> Array.iter A.SM1 + + [| ();();() |] |> Array.iter (fun d -> A.SM1 d) + [| ();();() |] |> Array.iter A.SM1 + + [| ();();() |] |> Array.iter (fun d -> A.SM0()) + [| ();();() |] |> Array.iter A.SM0 + + let a = A() + [| (1,3) |] |> Array.iter (fun (x,y) -> a.M2 (x,y)) + [| (1,3) |] |> Array.iter (fun d -> a.M2 d) + [| (1,3) |] |> Array.iter a.M2 + + let au = A() + [| ();();() |] |> Array.iter (fun d -> au.M1 d) + [| ();();() |] |> Array.iter au.M1 + + [| 1;2;3 |] |> Array.iter (fun d -> a.M1 d) + [| 1;2;3 |] |> Array.iter a.M1 + + [| ();();() |] |> Array.iter (fun d -> a.M0()) + [| ();();() |] |> Array.iter a.M0 + + +module First_class_use_of_non_overloaded_method_should_detuple_3 = + + let count = ref 0 + type A() = + let f (x,y) = () + member this.M0 () = f (1,2) + member this.M1 (x:'a) = f (x,x) + member this.M2 (x:'a,y:'a) = f (x,y) + + static member SM0 () = () + static member SM1 (x:'a) = () + static member SM2 (x:'a,y:'a) = () + + + [| (1,3) |] |> Array.iter (fun (x,y) -> A.SM2 (x,y)) + [| (1,3) |] |> Array.iter (fun d -> A.SM2 d) + [| (1,3) |] |> Array.iter A.SM2 + + [| 1;2;3 |] |> Array.iter (fun d -> A.SM1 d) + [| 1;2;3 |] |> Array.iter A.SM1 + + [| ();();() |] |> Array.iter (fun d -> A.SM1 d) + [| ();();() |] |> Array.iter A.SM1 + + [| ();();() |] |> Array.iter (fun d -> A.SM0()) + [| ();();() |] |> Array.iter A.SM0 + + let a = A() + [| (1,3) |] |> Array.iter (fun (x,y) -> a.M2 (x,y)) + [| (1,3) |] |> Array.iter (fun d -> a.M2 d) + [| (1,3) |] |> Array.iter a.M2 + + [| ();();() |] |> Array.iter (fun d -> a.M1 d) + [| ();();() |] |> Array.iter a.M1 + + [| 1;2;3 |] |> Array.iter (fun d -> a.M1 d) + [| 1;2;3 |] |> Array.iter a.M1 + + [| ();();() |] |> Array.iter (fun d -> a.M0()) + [| ();();() |] |> Array.iter a.M0 + +module Bug_1438 = + + type Tuples = + static member Sel1 t = match t with | (a,_) -> a + + static member Sel2 t = match t with | (_,b) -> b + + let unzip (xs : seq<'a * 'b>) : seq<'a> * seq<'b> = + ( xs |> Seq.map (fun x -> Tuples.Sel1 x), + xs |> Seq.map (fun x -> Tuples.Sel2 x) ) + + let unzip2 (xs : seq<'a * 'b>) : seq<'a> * seq<'b> = + ( xs |> Seq.map Tuples.Sel1, + xs |> Seq.map Tuples.Sel2 ) + +module InheritingFromPartiallyImplementedTypes = + module PositiveTests = + + + + module Test2 = + type ITest = + abstract member Meth1: string -> string + + type ITestSub = + inherit ITest + abstract member Meth2: int -> int + + type OkComplete () = + interface ITest with + override this.Meth1 x = x + "1" + interface ITestSub with + override this.Meth2 x = x + 1 + + module Throwaway = + let foo = OkComplete() + + + module Test4 = + [] + type wire<'a>() = + abstract Send : 'a -> unit + + let createWire() = + {new wire<'a>() with + member obj.Send(x:'a) = () + } + + type CreateWire<'a>() = + inherit wire<'a>() + override obj.Send(x) = () + + + module Test5 = + type ITest = + abstract member Meth1: int -> int + + type ITestSub = + inherit ITest + abstract member Meth1: int -> int + + [] + type Partial() = + abstract Meth1 : int -> int + interface ITest with + override this.Meth1 x = this.Meth1 x + interface ITestSub with + override this.Meth1 x = this.Meth1 x + + type OkComplete () = + inherit Partial() + override this.Meth1 x = x + + module Throwaway = + let foo = OkComplete() + + module MorePositiveTests = + + + type IEnumerator<'T> = + abstract Current : 'T + + [] + type MapEnumerator<'T> (x:'T) = + interface IEnumerator<'T> with + member this.Current = x + + type MapE<'U>() = + inherit MapEnumerator<'U>(failwith "") + + + module MorePositiveTEsts2 = + open System.Reflection + + type IDelegateEvent<'del when 'del :> System.Delegate > = + abstract AddHandler: handler:'del -> unit + + type IEvent<'del,'args when 'del :> System.Delegate > = + inherit IDelegateEvent<'del> + + let f<'Delegate,'Args when 'Delegate :> System.Delegate >() = + { new IEvent<'Delegate,'Args> with + member x.AddHandler(d) = () } + + + module MorePositiveTEsts3 = + + type IEvent<'del,'a> = + abstract Add : ('a -> unit) -> unit + + [] + type wire<'a>() = + abstract Send : 'a -> unit + abstract Listen : ('a -> unit) -> unit + interface IEvent,'a> with + member x.Add(handler) = x.Listen(handler) + + let createWire() = + let listeners = ref [] in + {new wire<'a>() with // Expect an error here - Add2 no implemented + member obj.Send(x) = List.iter (fun f -> f x) !listeners + member obj.Listen(f) = listeners := f :: !listeners + } + +module MoreConstraintTEsts = + type C1<'T when 'T :> System.Array>() = + member x.P = 1 + + type C2<'T when 'T :> System.Delegate>() = + member x.P = 1 + + type C3<'T when 'T :> System.Enum>() = + member x.P = 1 + + + type C4<'T when 'T :> System.ValueType>() = + member x.P = 1 + + type C5<'T when 'T :> System.IComparable and 'T :> System.IComparable>() = + member x.P = 1 + + + type C6<'T when 'T :> System.Array and 'T :> System.Array>() = + member x.P = 1 + + type C7<'T when 'T :> System.Array and 'T :> System.IComparable>() = + member x.P = 1 +// Can't constraint to multiple class types anymore +// It is ok to constrain to multiple interfaces though. + type C8<'T when 'T :> System.Array and 'T :> System.IComparable and 'T :> System.ICloneable>() = + member x.P = 1 + + let f x = new C8<_>() + +module FinalizerTEst = + type S<'a>(x:'a) = class [] val mutable x : 'a override x.Finalize() = printfn "hello" end + + let x = S(3) |> box + +module CheckBoxingSemantics = + module StructTest1 = + + type IX = abstract ToStringMember : unit -> string + + + [] + type Counter = + interface IX with + member x.ToStringMember() = x.value <- x.value + 1; x.value.ToString() + + [] + val mutable value : int + + let x = ref (new Counter()) + + let f (x:'a when 'a :> IX) = + [ x.ToStringMember(); x.ToStringMember(); x.ToStringMember() ] + + check "vklnvwer0" (f x.Value) ["1"; "1"; "1"] + + module StructTest2 = + + + [] + type Counter = + [] + val mutable value : int + member x.ToStringMember() = x.value <- x.value + 1; x.value.ToString() + + let x = ref (new Counter()); + + check "vklnvwer0" [ x.contents.ToStringMember(); x.contents.ToStringMember(); x.contents.ToStringMember() ] ["1"; "2"; "3"] + + module StructTest3 = + + [] + type Counter = + [] + val mutable value : int + member x.ToStringMember() = x.value <- x.value + 1; x.value.ToString() + + let x = Array.init 3 (fun i -> new Counter()); + check "vklnvwer0" [ x.[0].ToStringMember(); x.[0].ToStringMember(); x.[0].ToStringMember() ] ["1"; "2"; "3"] + + module StructTest4 = + + [] + type Counter = + [] + static val mutable private value : int + member x.ToStringMember() = Counter.value <- Counter.value + 1; Counter.value.ToString() + + let x = Array.init 3 (fun i -> new Counter()); + check "vklnvwer0" [ x.[0].ToStringMember(); x.[0].ToStringMember(); x.[0].ToStringMember() ] ["1"; "2"; "3"] + + + + +module InterfaceExtendsSystemIComparable_Bug4919 = + open System.Collections + open System.Collections.Generic + + exception EmptyQueue + + type Queue<'a> = + inherit IEnumerable<'a> + inherit IEnumerable + inherit System.IEquatable> + inherit System.IComparable + abstract IsEmpty : bool + abstract PushBack : 'a -> Queue<'a> + abstract PopFront : unit -> 'a * Queue<'a> + + let private queueEnumerator (q: Queue<_>) = + let decap (q: Queue<_>) = if q.IsEmpty then None else Some(q.PopFront()) + (Seq.unfold decap q).GetEnumerator() + + module BatchedQueue = + let rec private mk(f, r) = + let mk = function + | [], r -> mk(List.rev r, []) + | q -> mk q + { new Queue<'a> with + override q.IsEmpty = + match f with + | [] -> true + | _ -> false + + override q.PushBack x = + mk(f, x::r) + + override q.PopFront() = + match f with + | x::f -> x, mk(f, r) + | [] -> raise EmptyQueue + + override q.GetEnumerator() = + ((q: Queue<'a>).GetEnumerator() :> IEnumerator) + + override q.GetEnumerator() : IEnumerator<'a> = + queueEnumerator q + + override q1.Equals(q2: Queue<'a>) = + List.ofSeq q1 = List.ofSeq q2 + + override q1.CompareTo(q2: obj) = + let q2 = unbox> q2 + Seq.compareWith compare q1 q2 + } + + let empty<'a when 'a : equality and 'a : comparison> = mk<'a>([], []) + + let add (q: Queue<_>) x = q.PushBack x + + let take (q: Queue<_>) = q.PopFront() + + let time f x = + let t = System.Diagnostics.Stopwatch.StartNew() + try f x finally + printf "Took %dms\n" t.ElapsedMilliseconds + + let _ = + time (Seq.length << Seq.fold BatchedQueue.add BatchedQueue.empty) (seq {1 .. 100}) + |> printf "Queue length %d\n" + +module AllowExtensionsWithinARecursiveGroup = begin + type System.Object with + member x.Name = "a" + + and System.String with + member x.Freddy = "b" + + and C with + member x.FreddyAndName = let a,b = x.NameAndFreddy in b,a + + and C(s:string) = + member x.NameAndFreddy = s.Name, s.Freddy + +end + + + +module PreferOverloadsUsingSystemFunc = begin + + type Foo() = + static member Method(x:System.Action) = 1 + static member Method(x:System.Func<'T>) = 2 + + Foo.Method(fun _ -> ()) // expect return result 2 +end + + +module AllowNullLiteralTest = begin + + [] + type I = + interface + abstract P : int + end + + let i = (null : I) + + let i2 = ((box null) :?> I) + + + [] + type C() = + member x.P = 1 + + let c = (null : C) + + let c2 = ((box null) :?> C) + + + [] + type D() = + inherit C() + interface I with + member x.P = 2 + member x.P = 1 + + let d = (null : D) + + let d2 = ((box null) :?> D) + +end + +module UnionConstructorsAsFirstClassValues = begin + type A = + | A of int * int + + let x = (1, 1) + let y = (A) x // OK + let z = A x // expect this to be ok +end + + +module ExtensionMemberTests = + module Set1 = + type System.DateTime with + static member Prop1 = (1,1) + + type System.DateTime with + static member Meth1(s:string) = (1,2) + + type System.DateTime with + static member Meth2(s:string) = (1,2) + + type System.DateTime with + member x.InstanceProp1 = (1,1) + + type System.DateTime with + member x.InstanceMeth1(s:string) = (1,2) + + type System.DateTime with + member x.InstanceMeth2(s:string) = (1,2) + + + module Set2 = + type System.DateTime with + static member Prop1 = (2,2) + + type System.DateTime with + static member Meth1(s:string) = (2,1) + + type System.DateTime with + static member Meth2(s:obj) = (2,1) + + type System.DateTime with + member x.InstanceProp1 = (2,2) + + type System.DateTime with + member x.InstanceMeth1(s:string) = (2,1) + + type System.DateTime with + member x.InstanceMeth2(s:obj) = (2,1) + + // overloaded indexed extension properties + module Set3A = + type A() = + member m.Item with get(a: string) = "Item(string)" + member m.Item with set(a: string) (value:string) = failwith "Setting Item(string) string" + member m.Item with set(a: bool) (value:string) = failwith "Setting Item(bool) string" + + member m.Prop with get(a: string, b:string) = "Prop(string, string)" + member m.Prop with set(a: string, b: string) (value:string) = failwith "Setting Prop(string, string) string" + member m.Prop with set(a: string, b: bool) (value:string) = failwith "Setting Prop(string, bool) string" + + member m.Plain with get() = "Intrinsic plain" + member m.Plain with set(a:string) = failwith "Setting intrinsic plain" + + member m.NonIndexed with get() = "Intrinsic nonindexed" + + member m.Indexed with get(a: string) = "Intrinsic indexed" + + + module Set3B = + type Set3A.A with + member m.Item with get(a: bool) = "Item(bool)" + member m.Item with set(a: bool) (value: bool) = failwith "Setting Item(bool) bool" + member m.Item with set(a: string) (value: bool) = failwith "Setting Item(string) bool" + + member m.Prop with get(a: string, b:bool) = "Prop(string, bool)" + member m.Prop with set(a: string, b:bool) (value: bool) = failwith "Setting Prop(string, bool) bool" + member m.Prop with set(a: string, b:string) (value: bool) = failwith "Setting Prop(string, string) bool" + + member m.Plain with get() = "Extension plain" + member m.Plain with set(a:string) = failwith "Setting extension plain" + + member m.NonIndexed with get(a: bool) = "Extension nonindexed" + + member m.Indexed with get() = "Extension indexed" + + member m.ExtensionOnly with get(a: bool) = "ExtensionOnly(bool)" + + type System.Net.WebHeaderCollection with + member m.Item with get(a : bool) = "ExtensionGet" + + module Tests1 = + open Set1 + open Set2 + check "fewnr-0vrwep0" System.DateTime.Prop1 (2,2) + check "fewnr-0vrwep1" (System.DateTime.Meth1("a")) (2,1) + check "fewnr-0vrwep2" (System.DateTime.Meth2("a")) (1,2) // Set1 always preferred due to more precise type + + check "fewnr-0vrwep0" System.DateTime.Now.InstanceProp1 (2,2) + check "fewnr-0vrwep1" (System.DateTime.Now.InstanceMeth1("a")) (2,1) + check "fewnr-0vrwep2" (System.DateTime.Now.InstanceMeth2("a")) (1,2) // Set1 always preferred due to more precise type + + module Tests2 = + open Set2 + open Set1 + check "fewnr-0vrwep3" System.DateTime.Now.InstanceProp1 (1,1) + check "fewnr-0vrwep4" (System.DateTime.Now.InstanceMeth1("a")) (1,2) + check "fewnr-0vrwep5" (System.DateTime.Now.InstanceMeth2("a")) (1,2) // Set1 always preferred due to more precise type + + module Tests3 = + open Set3A + open Set3B + + let checkSet testName (f : unit -> unit) expected = + let result = + let mutable res = "" + try f() with | e -> res <- e.Message + res + + check testName result expected + + let foo = A() + + // getters + check "ExtensionProps 0" (foo.[""]) "Item(string)" + check "ExtensionProps 1" (foo.[true]) "Item(bool)" + + check "ExtensionProps 2" (foo.Prop("", "")) "Prop(string, string)" + check "ExtensionProps 3" (foo.Prop("", true)) "Prop(string, bool)" + + // in case of exact duplicate, per spec intrinsic should be preferred + check "ExtensionProps 4" (foo.Plain) "Intrinsic plain" + + check "ExtensionProps 5" (foo.NonIndexed) "Intrinsic nonindexed" + // not expected to work: check "ExtensionProps 6" (foo.NonIndexed(true)) "Extension nonindexed" + + check "ExtensionProps 7" (foo.Indexed("")) "Intrinsic indexed" + // not expected to work: check "ExtensionProps 8" (foo.Indexed) "Extension indexed" + + check "ExtensionProps 9" (System.Net.WebHeaderCollection().[true]) "ExtensionGet" + + // setters + checkSet "ExtensionProps 10" (fun () -> foo.[""] <- "") "Setting Item(string) string" + checkSet "ExtensionProps 11" (fun () -> foo.[true] <- "") "Setting Item(bool) string" + checkSet "ExtensionProps 13" (fun () -> foo.[true] <- true) "Setting Item(bool) bool" + checkSet "ExtensionProps 14" (fun () -> foo.[""] <- true) "Setting Item(string) bool" + + checkSet "ExtensionProps 16" (fun () -> foo.Prop("", "") <- "") "Setting Prop(string, string) string" + checkSet "ExtensionProps 17" (fun () -> foo.Prop("", true) <- "") "Setting Prop(string, bool) string" + checkSet "ExtensionProps 19" (fun () -> foo.Prop("", true) <- true) "Setting Prop(string, bool) bool" + checkSet "ExtensionProps 20" (fun () -> foo.Prop("", "") <- true) "Setting Prop(string, string) bool" + + checkSet "ExtensionProps 22" (fun () -> foo.Plain <- "") "Setting intrinsic plain" + +module AccessThisAsPartOfSUperClassConstruction1 = + open System + type Z(x : obj) = class end + + type X() as Y = + class + inherit Z(Y.x) + do + () + [] + val mutable x : int + end + + +module AccessThisAsPartOfSUperClassConstruction2 = + + module Test1 = + open System + type Z(x : obj) = class end + + type X() as Y = + class + inherit Z(Y.x) + do + () + [] + val mutable x : int + end + + + + module Test2 = + open System + type Z(x : obj) = class end + + type X() as Y = + class + inherit Z(Y.x) + do + () + [] + val mutable x : int + + member self.ThisPtr = Y + end + + module Test3 = + open System + type Z(x : obj) = class end + + type X() as Y = + class + inherit Z(Y.x) + let getThis () = Y + do + () + [] + val mutable x : int + + member self.ThisPtr = getThis() + end + + module Test4 = + open System + type Z(x : obj) = class end + + type X() as Y = + class + inherit Z(Y.x) + let ths = Y + do + () + [] + val mutable x : int + + member self.ThisPtr = ths + end + + + + + module GenericTest1 = + open System + type Z(x : obj) = class end + + type X<'T>() as Y = + class + inherit Z(Y.x) + do + () + [] + val mutable x : int + end + + + + module GenericTest2 = + open System + type Z(x : obj) = class end + + type X<'T>() as Y = + class + inherit Z(Y.x) + do + () + [] + val mutable x : int + + member self.ThisPtr = Y + end + + module GenericTest3 = + open System + type Z(x : obj) = class end + + type X<'T>() as Y = + class + inherit Z(Y.x) + let getThis () = Y + do + () + [] + val mutable x : int + + member self.ThisPtr = getThis() + end + + module GenericTest4 = + open System + type Z(x : obj) = class end + + type X<'T>() as Y = + class + inherit Z(Y.x) + let ths = Y + do + () + [] + val mutable x : int + + member self.ThisPtr = ths + end + + +module AccessThisAsPartOfSUperClassConstruction3 = + + type B(obj:obj) = + member x.P = 1 + + type C1() as a = + inherit B((fun () -> a)) // captures 'this' as part of call to super class constructor + member x.P = 1 + + type C2() as a = + inherit B((fun () -> a)) // captures 'this' as part of call to super class constructor + member x.P = a // and captures it in a method + + +module EqualityComparisonPositiveTests = + + + module StructDefaultConstructorCantBeUsed = + + [] + type U1(v:int) = + member x.P = v + + let v1 = U1() // can be used - expect no error + + + module BasicExample1 = + let f1 (x : list) = (x = x) // expect ok + let f2 (x : option) = (x = x) // expect ok + let f3 (x : Choice) = (x = x) // expect ok + let f4 (x : Choice) = (x = x) // expect ok + let f5 (x : Choice) = (x = x) // expect ok + let f6 (x : Choice) = (x = x) // expect ok + let f7 (x : Choice) = (x = x) // expect ok + let f8 (x : Choice) = (x = x) // expect ok + let f9 (x : ref) = (x = x) // expect ok + let fq (x : Set) = (x = x) // expect ok + let fw (x : Map) = (x = x) // expect ok + + let fe (x : list) = (x = x) // expect ok + let fr (x : option) = (x = x) // expect ok + let ft (x : Choice) = (x = x) // expect ok + let fy (x : Choice) = (x = x) // expect ok + let fu (x : Choice) = (x = x) // expect ok + let fi (x : Choice) = (x = x) // expect ok + let fo (x : Choice) = (x = x) // expect ok + let fp (x : Choice) = (x = x) // expect ok + let fa (x : ref) = (x = x) // expect ok + + + let fn (x : Set>) = () // expect ok + let fm (x : Set>) = () // expect ok + let fQ (x : Set>) = () // expect ok + let fW (x : Set>) = () // expect ok + let fE (x : Set>) = () // expect ok + let fO (x : Set) = () // expect ok + let fP (x : Set) = () // expect ok + let fA (x : Set) = () // expect ok + let fS (x : Set) = () // expect ok + let fD (x : Set) = () // expect ok + let fF (x : Set) = () // expect ok + let fG (x : Set) = () // expect ok + let fH (x : Set) = () // expect ok + let fJ (x : Set) = () // expect ok + let fK (x : Set) = () // expect ok + + type R<'T> = R of 'T * R<'T> + let r1 (x : Set>) = () // expect ok + let r3 (x : R) = (x = x) // expect ok + let r4 (x : R) = (x = x) // expect ok + + //type R2<'T> = | R2 : 'T * R2<'T> -> R2<'T> + //let q1 (x : Set>) = () // expect ok + //let q3 (x : R2) = (x = x) // expect ok + //let q4 (x : R2) = (x = x) // expect ok + + module Example1 = + type X<'T> = X of 'T + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f3 (x : X>) = (x = x) // expect ok + let f5 (x : X>) = (x = x) // expect ok + + module Example1_Record = + type X<'T> = { r : 'T } + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f3 (x : X>) = (x = x) // expect ok + let f5 (x : X>) = (x = x) // expect ok + + module Example1_Struct = + type X<'T> = struct val r : 'T end + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f3 (x : X>) = (x = x) // expect ok + let f5 (x : X>) = (x = x) // expect ok + + module Example1_StructImplicit = + [] + type X<[] 'T>(r:'T) = struct member x.R = r end + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f3 (x : X>) = (x = x) // expect ok + let f5 (x : X>) = (x = x) // expect ok + + module Example1_StructImplicit2 = + [] + type X<[] 'T>(r:'T) = struct member x.R = r end + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f3 (x : X>) = (x = x) // expect ok + let f5 (x : X>) = (x = x) // expect ok + + module Example2 = + type X<'T> = X of list<'T> + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + + let f4 (x : X>) = (x = x) // expect ok + let f6 (x : X>) = (x = x) // expect ok + + + module Example3 = + type X<'T> = X of Y<'T> + and Y<'T> = Y of 'T + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + + let f4 (x : X>) = (x = x) // expect ok + let f6 (x : X>) = (x = x) // expect ok + + module Example4 = + type X<'T> = X of Y<'T> + and Y<'T> = Y of 'T * X<'T> + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + + let f4 (x : X>) = (x = x) // expect ok + let f6 (x : X>) = (x = x) // expect ok + + let g0 (x : Set>) = () // expect ok + let g1 (x : Set>) = () // expect ok + + let g4 (x : Y>) = (x = x) // expect ok + let g6 (x : Y>) = (x = x) // expect ok + + module Example5 = + type X<'T> = X of Y<'T> + and Y<'T> = Y of int + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f2 (x : Set>) = () // expect ok + let f3 (x : Set>>) = () // expect ok + + let f4 (x : X>) = (x = x) // expect ok + let f5 (x : X int>) = (x = x) // expect ok + let f6 (x : X>) = (x = x) // expect ok + let f7 (x : X int>>) = (x = x) // expect ok + + let g0 (x : Set>) = () // expect ok + let g1 (x : Set>) = () // expect ok + let g2 (x : Set>) = () // expect ok + let g3 (x : Set>>) = () // expect ok + + let g4 (x : Y>) = (x = x) // expect ok + let g5 (x : Y int>) = (x = x) // expect ok + let g6 (x : Y>) = (x = x) // expect ok + let g7 (x : Y int>>) = (x = x) // expect ok + + module Example6 = + type X<'T> = X of Y + and Y<'T,'U> = Y of 'T * X<'T> + + let f0 (x : Set>) = () // expect ok + let f1 (x : Set>) = () // expect ok + let f2 (x : Set>) = () // expect ok + let f3 (x : Set>>) = () // expect ok + + let f4 (x : X>) = (x = x) // expect ok + let f5 (x : X int>) = (x = x) // expect ok + let f6 (x : X>) = (x = x) // expect ok + let f7 (x : X int>>) = (x = x) // expect ok + + let g0 (x : Set>) = () // expect ok + let g1 (x : Set>) = () // expect ok + + let g4 (x : Y,int>) = (x = x) // expect ok + let g6 (x : Y, int>) = (x = x) // expect ok + + + let g8 (x : Y>) = (x = x) // expect ok + let g9 (x : Y int)>) = (x = x) // expect ok + let g10 (x : Y>) = (x = x) // expect ok + let g11 (x : Y int)>>) = (x = x) // expect ok + + module Example7 = + // a type inferred to be without equality or comparison + type X = X of (int -> int) + // a type transitively inferred to be without equality or comparison + type Y = Y of X + + + module Example8 = + // a type inferred to be without comparison + type X = X of System.Type + // a type transitively inferred to be without comparison + type Y = Y of X + + let f2 (x : X) = (x = x) // expect ok + let f3 (x : Y) = (x = x) // expect ok + + +module RuntimeCheckForSelfCallThroughProperty1 = begin + [] + type Base(callIt:bool) as self = + do if callIt then printfn "P = %d" self.P // expect an exception here + abstract P: int + + type C(callIt:bool) = + inherit Base(callIt) + let x = 1 + override __.P = x + + check "cewlkcnc332a" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "cewlkcnc332b" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + +module RuntimeCheckForSelfCallThroughSetterProperty1 = begin + [] + type Base(callIt:bool) as self = + do if callIt then self.P <- 1 // expect an exception here + abstract P: int with set + + type C(callIt:bool) = + inherit Base(callIt) + let x = 1 + override __.P with set v = () + + check "cewlkcnc332c" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "cewlkcnc332d" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + +module RuntimeCheckForSelfCallThroughInterfaceSetterProperty1 = begin + + type I = + abstract P: int with set + + type Base(callIt:bool) as self = + do if callIt then (box self :?> I).P <- 1 // expect an exception here + + type C(callIt:bool) = + inherit Base(callIt) + let x = 1 + interface I with + member __.P with set v = () + + check "cewlkcnc332y" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "cewlkcnc332t" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + + +module RuntimeCheckForSelfCallThroughProperty1ExplicitClass = begin + [] + type Base = + new (callIt: bool) as self = + { } + then + if callIt then printfn "P = %d" self.P // expect an exception here + + abstract P: int + + type C = + inherit Base + val x : int + new (callIt: bool) as self = { inherit Base(callIt); x = 1 } + override __.P = x + + check "explicit-cewlkcnc332a" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "explicit-cewlkcnc332b" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + +module RuntimeCheckForSelfCallThroughSetterProperty1ExplicitClass = begin + [] + type Base = + new (callIt: bool) as self = + { } + then + if callIt then self.P <- 1 // expect an exception here + abstract P: int with set + + type C = + inherit Base + val x : int + new (callIt: bool) as self = { inherit Base(callIt); x = 1 } + override __.P with set v = () + + check "explicit-cewlkcnc332c" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "explicit-cewlkcnc332d" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + +module RuntimeCheckForSelfCallThroughInterfaceSetterProperty1ExplicitClass = begin + + type I = + abstract P: int with set + + type Base = + new (callIt: bool) as self = + { } + then + if callIt then (box self :?> I).P <- 1 // expect an exception here + + + type C = + inherit Base + val x : int + new (callIt: bool) as self = { inherit Base(callIt); x = 1 } + interface I with + member __.P with set v = () + + check "explicit-cewlkcnc332y" (try C(true) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "fail" + check "explicit-cewlkcnc332t" (try C(false) |> ignore; "ok" with :? System.InvalidOperationException -> "fail") "ok" +end + +module PartiallyReimplementInheritedInterfaces = begin + //--------------------------------------------------- + // Basic test 1 + + module BasicTest1 = + type public I1 = + abstract V1 : string + + type public I2 = + inherit I1 + abstract V2 : string + + type public C1() = + interface I1 with + member this.V1 = "C1" + + type public C2() = + inherit C1() + interface I2 with + member this.V2 = "C2" + + type public C3() = + inherit C1() + interface I2 with + member this.V1 = "C1b" + member this.V2 = "C2b" + + check "8kvnvwe0-we1" (C2() :> I2).V2 "C2" + check "8kvnvwe0-we2" (C2() :> I1).V1 "C1" + check "8kvnvwe0-we3" (C3() :> I1).V1 "C1b" + + //--------------------------------------------------- + // Basic test 3 - IEnumerable --> IEnumerable + + + module InheritIEnumerableTest1 = + open System.Collections + open System.Collections.Generic + type BaseCollection() = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box 1 + member __.MoveNext() = true + + type DerivedCollection() = + inherit BaseCollection() + interface System.Collections.Generic.IEnumerator with + member __.Reset() = () + member __.Current = 2 + member __.Current = box 2 + member __.Dispose() = () + member __.MoveNext() = false + + + type ReDerivedCollection1() = + inherit DerivedCollection() + interface System.Collections.Generic.IEnumerator + + type ReDerivedCollection2() = + inherit DerivedCollection() + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection() + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4() = + inherit DerivedCollection() + interface System.IDisposable + + + check "8kvnvwe0-we4" (new DerivedCollection() :> IEnumerator).Current 2 + check "8kvnvwe0-we5" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-we6" (new DerivedCollection() :> IEnumerator).Current (box 2) + check "8kvnvwe0-we7" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-we8" (new ReDerivedCollection1() :> IEnumerator).Current 2 + check "8kvnvwe0-we9" ((new ReDerivedCollection1() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-weq" (new ReDerivedCollection2() :> IEnumerator).Current 2 + check "8kvnvwe0-wew" ((new ReDerivedCollection2() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wee" (new ReDerivedCollection3() :> IEnumerator).Current 2 + check "8kvnvwe0-wer" ((new ReDerivedCollection3() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wet" (new BaseCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-wey" ((new BaseCollection() :> IEnumerator).MoveNext()) true + + module InheritIEnumerableTest2 = + open System.Collections + open System.Collections.Generic + type BaseCollection() = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box 1 + member __.MoveNext() = true + + type DerivedCollection() = + inherit BaseCollection() + interface System.Collections.Generic.IEnumerator with + // Emit one or more members to inherit implementations of some of the interfaces + //member __.Reset() = () + member __.Current = 2 + member __.Current = box 2 + member __.Dispose() = () + member __.MoveNext() = false + + type ReDerivedCollection1() = + inherit DerivedCollection() + interface System.Collections.Generic.IEnumerator + + type ReDerivedCollection2() = + inherit DerivedCollection() + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection() + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4() = + inherit DerivedCollection() + interface System.IDisposable + + check "8kvnvwe0-weu" (new DerivedCollection() :> IEnumerator).Current 2 + check "8kvnvwe0-wei" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-weo" (new DerivedCollection() :> IEnumerator).Current (box 2) + check "8kvnvwe0-wep" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wea" (new ReDerivedCollection1() :> IEnumerator).Current 2 + check "8kvnvwe0-wes" ((new ReDerivedCollection1() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wed" (new ReDerivedCollection2() :> IEnumerator).Current 2 + check "8kvnvwe0-wef" ((new ReDerivedCollection2() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-weg" (new ReDerivedCollection3() :> IEnumerator).Current 2 + check "8kvnvwe0-weh" ((new ReDerivedCollection3() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wej" (new BaseCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-wek" ((new BaseCollection() :> IEnumerator).MoveNext()) true + + module InheritIEnumerableTest3 = + open System.Collections + open System.Collections.Generic + type BaseCollection() = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box 1 + member __.MoveNext() = true + + type DerivedCollection() = + inherit BaseCollection() + interface System.Collections.Generic.IEnumerator with + // Emit one or more members to inherit implementations of some of the interfaces + //member __.Reset() = () + member __.Current = 2 + //member __.Current = box 1 + member __.Dispose() = () + member __.MoveNext() = false + + type ReDerivedCollection1() = + inherit DerivedCollection() + interface System.Collections.Generic.IEnumerator + + type ReDerivedCollection2() = + inherit DerivedCollection() + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection() + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4() = + inherit DerivedCollection() + interface System.IDisposable + + check "8kvnvwe0-wel" (new DerivedCollection() :> IEnumerator).Current 2 + check "8kvnvwe0-wez" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wex" (new DerivedCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-wec" ((new DerivedCollection() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wev" (new ReDerivedCollection1() :> IEnumerator).Current 2 + check "8kvnvwe0-web" ((new ReDerivedCollection1() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-wen" (new ReDerivedCollection2() :> IEnumerator).Current 2 + check "8kvnvwe0-wem" ((new ReDerivedCollection2() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-weQ" (new ReDerivedCollection3() :> IEnumerator).Current 2 + check "8kvnvwe0-weW" ((new ReDerivedCollection3() :> IEnumerator).MoveNext()) false + check "8kvnvwe0-weE" (new BaseCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-weR" ((new BaseCollection() :> IEnumerator).MoveNext()) true + + module InheritIEnumerableTest4 = + open System.Collections + open System.Collections.Generic + type BaseCollection() = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box 1 + member __.MoveNext() = true + + type DerivedCollection() = + inherit BaseCollection() + interface System.Collections.Generic.IEnumerator with + // Emit one or more members to inherit implementations of some of the interfaces + //member __.Reset() = () + member __.Current = 2 + //member __.Current = box 1 + member __.Dispose() = () + //member __.MoveNext() = true + + type ReDerivedCollection1() = + inherit DerivedCollection() + interface System.Collections.Generic.IEnumerator + + type ReDerivedCollection2() = + inherit DerivedCollection() + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection() + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4() = + inherit DerivedCollection() + interface System.IDisposable + + + check "8kvnvwe0-weT" (new DerivedCollection() :> IEnumerator).Current 2 + check "8kvnvwe0-weY" ((new DerivedCollection() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weU" (new DerivedCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-weI" ((new DerivedCollection() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weO" (new ReDerivedCollection1() :> IEnumerator).Current 2 + check "8kvnvwe0-weP" ((new ReDerivedCollection1() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weA" (new ReDerivedCollection2() :> IEnumerator).Current 2 + check "8kvnvwe0-weS" ((new ReDerivedCollection2() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weD" (new ReDerivedCollection3() :> IEnumerator).Current 2 + check "8kvnvwe0-weF" ((new ReDerivedCollection3() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weG" (new BaseCollection() :> IEnumerator).Current (box 1) + check "8kvnvwe0-weH" ((new BaseCollection() :> IEnumerator).MoveNext()) true + + // Add some generics + module InheritIEnumerableTest5 = + open System.Collections + open System.Collections.Generic + type BaseCollection<'T>(x:'T) = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box x + member __.MoveNext() = true + + type DerivedCollection<'U>(x:'U) = + inherit BaseCollection<'U>(x) + interface System.Collections.Generic.IEnumerator<'U> with + // Emit one or more members to inherit implementations of some of the interfaces + //member __.Reset() = () + member __.Current = x + //member __.Current = box 1 + member __.Dispose() = () + //member __.MoveNext() = true + + type ReDerivedCollection1() = + inherit DerivedCollection(3) + interface System.Collections.Generic.IEnumerator + + type ReDerivedCollection2() = + inherit DerivedCollection("4") + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection(3u) + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4<'T>(x:'T) = + inherit DerivedCollection<'T>(x) + interface System.IDisposable + + + check "8kvnvwe0-weJ" (new DerivedCollection(2) :> IEnumerator).Current 2 + check "8kvnvwe0-weK" ((new DerivedCollection(2) :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weL" (new DerivedCollection(1) :> IEnumerator).Current (box 1) + check "8kvnvwe0-weZ" ((new DerivedCollection(1) :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weX" (new ReDerivedCollection1() :> IEnumerator).Current 3 + check "8kvnvwe0-weC" ((new ReDerivedCollection1() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weV" (new ReDerivedCollection2() :> IEnumerator).Current "4" + check "8kvnvwe0-weB" ((new ReDerivedCollection2() :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weN" (new ReDerivedCollection3() :> IEnumerator).Current 3u + check "8kvnvwe0-weM" ((new ReDerivedCollection3() :> IEnumerator).MoveNext()) true + check "8kvnvwe1-weq" (new BaseCollection(1) :> IEnumerator).Current (box 1) + check "8kvnvwe1-wWw" ((new BaseCollection(1) :> IEnumerator).MoveNext()) true + + // Add some units of measure + module InheritIEnumerableTest6 = + [] type kg + + type BaseCollection<'T>(x:'T) = + override __.GetHashCode() = 0 + override __.Equals(yobj) = true + interface System.Collections.IEnumerator with + member __.Reset() = () + member __.Current = box x + member __.MoveNext() = true + + type DerivedCollection<'U>(x:'U) = + inherit BaseCollection<'U>(x) + interface System.Collections.Generic.IEnumerator<'U> with + // Emit one or more members to inherit implementations of some of the interfaces + //member __.Reset() = () + member __.Current = x + //member __.Current = box 1 + member __.Dispose() = () + //member __.MoveNext() = true + + type ReDerivedCollection1() = + inherit DerivedCollection>(3) + interface System.Collections.Generic.IEnumerator> + + type ReDerivedCollection2() = + inherit DerivedCollection>(4.0) + interface System.Collections.IEnumerator + + type ReDerivedCollection3() = + inherit DerivedCollection>(3L) + interface System.IDisposable + interface System.Collections.IEnumerator + + type ReDerivedCollection4<'T>(x:'T) = + inherit DerivedCollection<'T>(x) + interface System.IDisposable + + type ReDerivedCollection5<'T>(x:'T) = + inherit ReDerivedCollection3() + interface System.IDisposable + interface System.Collections.Generic.IEnumerator> + + + check "8kvnvwe0-weJ" (new DerivedCollection(2) :> IEnumerator).Current 2 + check "8kvnvwe0-weK" ((new DerivedCollection(2) :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weL" (new DerivedCollection(1) :> IEnumerator).Current (box 1) + check "8kvnvwe0-weZ" ((new DerivedCollection(1) :> IEnumerator).MoveNext()) true + check "8kvnvwe0-weX" (new ReDerivedCollection1() :> IEnumerator>).Current 3 + check "8kvnvwe0-weC" ((new ReDerivedCollection1() :> IEnumerator>).MoveNext()) true + check "8kvnvwe0-weV" (new ReDerivedCollection2() :> IEnumerator>).Current 4.0 + check "8kvnvwe0-weB" ((new ReDerivedCollection2() :> IEnumerator>).MoveNext()) true + check "8kvnvwe0-weN" (new ReDerivedCollection3() :> IEnumerator>).Current 3L + check "8kvnvwe0-weM" ((new ReDerivedCollection3() :> IEnumerator>).MoveNext()) true + check "8kvnvwe1-weq" (new BaseCollection(1) :> IEnumerator).Current (box 1) + check "8kvnvwe1-wWw" ((new BaseCollection(1) :> IEnumerator).MoveNext()) true + +end + +module ClassWithInheritAndImmediateReferenceToThisInLet = + type B() = + member __.P = 1 + + let id x = x + + type C() as x = + inherit B() + let y = id x // it is ok to access the this pointer and pass it to external code as long as it doesn't call any members + member __.ThisPointer1 = x + member __.ThisPointer2 = y + + + let checkA() = + let c = C() + check "cwknecw021" c.ThisPointer1 c.ThisPointer2 + +module ClassWithNoInheritAndImmediateReferenceToThisInLet = + type C() as x = + let y = id x // it is ok to access the this pointer and pass it to external code as long as it doesn't call any members + member __.ThisPointer1 = x + member __.ThisPointer2 = y + + + let checkB() = + let c = C() + check "cwknecw021b" c.ThisPointer1 c.ThisPointer2 + + +module CheckResolutionOrderForMembers1 = + type System.String with + static member M1 () = 1 + static member M1 (?s : string) = 2 + let a = System.String.M1() + check "vew98vrknj1" a 1 + +module CheckResolutionOrderForMembers2 = + type System.String with + static member M1 (?s : string) = 2 + static member M1 () = 1 + + let b = System.String.M1() + + check "vew98vrknj2" b 1 + +module CheckResolutionOrderForMembers3 = + type C = + static member M1 () = 1 + static member M1 (?s : string) = 2 + + let a1 = C.M1() + let a2 = C.M1("2") + check "vew98vrknj3" a1 1 + check "vew98vrknj3" a2 2 + + +module CheckUsesOfNonOverloadMembersAssertReturnTypeBeforeCheckingArgs = + + type C() = + static member M(x:int) = 0 + static member M(x:string) = 1 + + member __.N(x:int) = 0 + member __.N(x:string) = 1 + + let test (x:int) = 1 + type D() = + static member Test (x:int) = 1 + + + // In this case, the overload C.M resolves, because the return type of + // loopX is known, from the return type of test. + + let rec loopX() = test (C.M(loopX())) + + // In this case, the overload C.M resolves, because the return type of + // loopY is known, from the return type of test. + + let rec loopY() = D.Test (C.M(loopY())) + + // Instance member versions of the same + let c = C() + let rec loopX1() = test (c.N(loopX1())) + let rec loopY1() = D.Test (c.N(loopY1())) + + +// Believe it or not, this caused the type checker to loop (bug 5803) +module BasicTypeCHeckingLoop = + + + type Vector() = + static member (+)(v1:Vector,v2) = 0 + + let foo (v1:Vector) v2 : int = v1 + v2 + +module CheckGeneralizationOfMembersInRecursiveGroupsWhichIncludeImplicitConstructors = + + open System.Collections + open System.Collections.Generic + + type IA<'T> = interface abstract M2 : int -> int end + + type X<'T>() = + let mutable redirectTo : X<'T> = Unchecked.defaultof<_> + + member x.M1() = if true then redirectTo else x + member x.M2() = if true then redirectTo else x + interface IA with + member x.M2 y = y + + + [] + type S<'T>(redirectTo : list>) = + + member x.M() = if true then redirectTo.[0] else x + + + module Issue3Minimal = + type MyDiscrUnion<'t> = + | MyCase of MyConstructedClass<'t> + + member this.M() = + match this with + | MyCase r -> r.Record + and MyConstructedClass<'t>( record : MyDiscrUnion<'t> ) = + member x.Record = record + + module Issue4 = + type MyDiscrUnion<'t> = + | MyCase of MyConstructedClass<'t> + member x.Value (t : 't) = + match x with + | MyCase r -> r.Apply t + and MyConstructedClass<'t>( foo : 't ) = + member x.Apply ( t: 't ) = t + + type ClassA<'t>(b: ClassB<'t>, c:'t) = + member x.A() = b.A() + and ClassB<'t>( a : ClassA<'t> ) = + member x.A() = a + +module CheckGeneralizationOfMembersInRecursiveGroupsWhichIncludeImplicitConstructorsPart2 = + + // This test raised a code generation assert + module DontGeneralizeTypeVariablesBoundByInnerPositions_1 = + type C() = + let someFuncValue = C.Meth2() // someFuncValue initially has variable type. This type is not generalized. + static member Meth2() = C.Meth2() + and C2() = + static member Meth1() = C.Meth2() + + // This test raised a code generation assert + module DontGeneralizeTypeVariablesBoundByInnerPositions_2 = + type C<'T>() = + let someFuncValue = C<'T>.Meth2() // someFuncValue initially has variable type. This type is not generalized. + static member Meth2() = C<'T>.Meth2() + and C2<'T>() = + static member Meth1() = C<'T>.Meth2() + + // This test is a trimmed down version of a regression triggered by this fix + module M0 = + type C<'T>(orig : 'T) = + [] + val mutable parent : C<'T> + let MyFind(x : C<'T>) = x.parent + member this.Find() = MyFind(this) + + // This test is a trimmed down version of a regression triggered by this fix + module M1 = + type C<'T>(orig : 'T) as this = + [] + val mutable parent : C<'T> + let MyFind(x : C<'T>) = x.parent + member this.Find() = MyFind(this) + + // This test is an adapted version of the above trim-down + module M2 = + type C<'T>(orig : 'T) as this = + [] + val mutable parent : C2<'T> + let MyFind(x : C<'T>) = (x.parent , x.parent.parent) + member this.Find() = MyFind(this) + and C2<'T>(orig : 'T) as this = + [] + val mutable parent : C<'T> + let MyFind(x : C2<'T>) = (x.parent , x.parent.parent) + member this.Find() = MyFind(this) + + // This test is an adapted version of the above trim-down + module M3 = + type C<'T>(orig : 'T) = + [] + val mutable parent : C2<'T> + let MyFind(x : C<'T>) = (x.parent , x.parent.parent) + member this.Find() = MyFind(this) + and C2<'T>(orig : 'T) = + [] + val mutable parent : C<'T> + let MyFind(x : C2<'T>) = (x.parent , x.parent.parent) + member this.Find() = MyFind(this) + + // These are variations on tests where a cycle of methods and "let" bindings across one or more test is an adapted version of the above trim-down + module RoundInCircles = + type C<'T>() as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + + // Mutual recursion between two generic classes + module RoundInCircles2 = + type C<'T>() as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + and C2<'T>(x:C<'T>) as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(x)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(x) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(x)) + + + // Mutual recursion between generic class and generic record type + module RoundInCircles3 = + type C<'T>() as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + and C2<'T> = + { x:C<'T> } + member this.Meth1() = + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this.x) + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this.x)) + + // Mutual recursion between generic class and generic union type + module RoundInCircles4 = + type C<'T>() as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + and C2<'T> = + | Parition2 of C<'T> + member this.Value = match this with Parition2 x -> x + member this.Meth1() = + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this.Value) + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this.Value)) + + // Mutual recursion between generic class and generic union type, slight variation passing 'this' explicitly + module RoundInCircles5 = + type C<'T>() = + let someFuncValue = (); (fun (this:C<'T>) -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1 this = + someFuncValue this |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2 this = + someFunc2 this |> ignore; + someFunc1 this + member this.Meth1() = someFunc2 this + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + and C2<'T> = + | Parition2 of C<'T> + member this.Value = match this with Parition2 x -> x + member this.Meth1() = + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this.Value) + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this.Value)) + + // Mutual recursion between generic class and generic struct + module RoundInCircles6 = + type C<'T>() as this = + let someFuncValue = (); (fun () -> + this.Prop1() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this)) + let someFunc1() = + someFuncValue() |> ignore + this.Meth1() |> ignore + C<'T>.Meth2(this) + let rec someFunc2() = + someFunc2() |> ignore; + someFunc1() + member this.Meth1() = someFunc2() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = (); (fun () -> + this.Meth1() |> ignore + C<'T>.Meth2(this)) + and C2<'T>(x:C<'T>) = + struct + member this.Value = x + member this.Meth1() = x.Meth1() + static member Meth2(this:C<'T>) = this.Meth1() + member this.Prop1 = let v = this in (); (fun () -> + v.Meth1() |> ignore + C<'T>.Meth2(v.Value)) + end + +module CheckGeneralizationOfMembersInRecursiveGroupsWhichIncludeImplicitConstructorsAndStaticMembers = + + open System.Collections + open System.Collections.Generic + + type IA<'T> = interface abstract M2 : int -> int end + + type X<'T>() = + let mutable redirectTo : X<'T> = Unchecked.defaultof<_> + static let instance = X<'T>() + static member Instance = instance + member x.M1() = if true then redirectTo else x + member x.M2() = if true then redirectTo else x + interface IA with + member x.M2 y = y + + + [] + type S<'T>(redirectTo : list>) = + static let instance = S<'T>(List.empty>) + static member Instance = instance + member x.M() = if true then redirectTo.[0] else x + + + // This test raised a code generation assert + module DontGeneralizeTypeVariablesBoundByInnerPositions_2 = + type C<'T>() = + static let someStaticFuncValue = C<'T>.Meth2() + let someFuncValue = C<'T>.Meth2() // someFuncValue initially has variable type. This type is not generalized. + static member SomeStaticFuncValue = someStaticFuncValue + static member Meth2() = C<'T>.Meth2() + and C2<'T>() = + static member Meth1() = C<'T>.Meth2() + + module Misc = + + type Foo<'a>() = + static let theInstance = new Foo<'a>() + static member Instance = theInstance + + type Bar<'a,'b>() = + static let theInstance = new Bar<'a,'b>() + static member Instance = theInstance + + // Equi-recursive type defs + type Rec1<'a>() = + static let rec2Instance = new Rec2<'a>() + static let rec1Instance = new Rec1<'a>() + static member Rec2Instance = rec2Instance + static member Rec1Instance = rec1Instance + + and Rec2<'a>() = + static let rec1Instance = new Rec1<'a>() + static let rec2Instance = new Rec2<'a>() + static member Rec1Instance = rec1Instance + static member Rec2Instance = rec2Instance + + // recursive type defs - multi tyargs + type Rec1AB<'a,'b>() = + static let rec2Instance = new Rec2B<'a>() + static let rec1Instance = new Rec1AB<'a,'b>() + static member Rec2Instance = rec2Instance + static member Rec1Instance = rec1Instance + + and Rec2B<'a>() = + static let rec2Instance = new Rec2B<'a>() + static member Rec2Instance = rec2Instance + + // functions + type FooFunc<'a>() = + static let fact() = new FooFunc<'a>() + static member factory() = fact() + + // test methods + type FooFunc2<'a>() = + static let fact = new FooFunc2<'a>() + static member factory() = fact + + type BerFunc<'a,'b>() = + static let fact() = new BerFunc<'a,'b>() + static member factory() = fact() + + // Equi-recursive type defs + type Rec1Func<'a>() = + static let rec2Instance() = new Rec2Func<'a>() + static let rec1Instance() = new Rec1Func<'a>() + static member Rec2Instance() = rec2Instance() + static member Rec1Instance() = rec1Instance() + and Rec2Func<'a>() = + static let rec1Instance() = new Rec1Func<'a>() + static let rec2Instance() = new Rec2Func<'a>() + static member Rec1Instance() = rec1Instance() + static member Rec2Instance() = rec2Instance() + + // recursive type defs - multi tyargs + type Rec1ABFunc<'a,'b>() = + static let rec2Instance() = new Rec2BFunc<'a>() + static let rec1Instance() = new Rec1ABFunc<'a,'b>() + static member Rec2Instance() = rec2Instance() + static member Rec1Instance() = rec1Instance() + and Rec2BFunc<'a>() = + static let rec2Instance() = new Rec2BFunc<'a>() + static member Rec2Instance() = rec2Instance() + +module Devdiv2_Bug_41009 = + type Rope<'T> = + { x : int } + member x.Empty : Rope<_> = failwith "" // the type variable for "_" is ungeneralized because this is a property + member x.Create(lhs:Rope<'T>) : Rope<'T> = + x.Empty // here the type variable for "_" gets instantiated to 'T, but this gets generalized. This must not be considered an escaping variable + + +module Devdiv2_Bug_10649 = + + // This should compile, because it compiles with F# 2.0. A has been generalized too early, + // but all recursive uses of the member end up consistent with the final inferred type + module InstanceMembersEarlyGeneralizationPotentiallyInvalidButUltimatelyConsistent = + type C<'T>() = + let mutable x = Unchecked.defaultof<_> // this inference variable ultimately becomes 'obj' + member this.A() = x + member this.B1(c:C) = c.A() + member this.B2(c:C) = c.A() + + // This should compile, because it compiles with F# 2.0. A has been generalized too early, + // but all recursive uses of the member end up consistent with the final inferred type + module StaticMembersEarlyGeneralizationPotentiallyInvalidButUltimatelyConsistent = + type C<'T>() = + static let mutable x = Unchecked.defaultof<_> // this inference variable ultimately becomes 'obj' + static member A() = x + static member B1() = C.A() + static member B2() = C.A() + + // This should compile, because it early generalization is valid for A + module InstanceMembersEarlyGeneralizationValid = + type C<'T>() = + member this.A() = 1 + member this.B1(c:C) = c.A() + member this.B2(c:C) = c.A() + + // This should compile, because it early generalization is valid for A + module StaticMembersEarlyGeneralizationValid = + type C<'T>() = + static member A() = 1 + static member B1() = C.A() + static member B2() = C.A() + + +module Devdiv2_Bug_5385 = + let memoize (f: 'a -> 'b) = + let t = new System.Collections.Generic.Dictionary<'a, 'b>() + fun n -> + if t.ContainsKey(n) then + t.[n] + else + let res = f n + t.[n] <- res + res + + // In this variation, + // -- 'f' is generic even though it is in the same mutually recursive group as the computed function 'g', because although 'f' calls 'g', its type doesn't involve any type from 'g' + // -- 'g' is not generic since 'g' is computed + let test3e () = + let count = ref 0 + let rec f (x: 'T) = + incr count; + if !count > 4 then + 1 + else + g "1" |> ignore; // note, use of non-generic 'g' within a generic, generalized memoized function + 2 + + and g : string -> int = memoize f // note, computed function value using generic “f” at an instance + g "1" + + let res = test3e() + + check "fe09ekn" res 2 + + printfn "test passed ok without NullReferenceException" + +module Devdiv2_5385_repro2 = + + open System + type Dispatch<'t, 'a> = 't -> ('t -> Lazy<'a>) -> 'a + + let internal driver (mkString : 't -> string) (dispatch : Dispatch<'t, 'a>) (t : 't) : 'a = + let rec driver2 (seen : Map>) (t : 't) : Lazy<'a> = + let tKey = mkString t + let find = seen.TryFind tKey + match find with + | Some x -> x + | None -> + let rec seen2 = seen.Add(tKey,res) + and res = lazy dispatch t (driver2 seen2) + res + (driver2 (Map.empty) t).Value + + + + let res : int = driver (fun t -> t.ToString()) (fun t f -> if t > 50 then (f (t/2)).Value else t) 100 + + check "kjnecwwe9" res 50 + + printfn "test passed ok without NullReferenceException" + + +let _ = + if not failures.Value.IsEmpty then (eprintfn "Test Failed, failures = %A" failures.Value; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) + diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 2075ef8f716..4d182d0bc4b 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -1327,6 +1327,15 @@ module Members = do! SingleTestRun.singleTestRun cfg dir p }) + [] + let BasicsHwMutrec p = check (attempt { + let { Directory = dir; Config = cfg } = testContext () + + do! SingleTestBuild.singleTestBuild cfg dir p + + do! SingleTestRun.singleTestRun cfg dir p + }) + module Ctree = [] diff --git a/tests/fsharp/typecheck/tests_typecheck.fs b/tests/fsharp/typecheck/tests_typecheck.fs index aa732f5c3b7..cfc1bdd3f88 100644 --- a/tests/fsharp/typecheck/tests_typecheck.fs +++ b/tests/fsharp/typecheck/tests_typecheck.fs @@ -139,7 +139,8 @@ module Sigs = // "%PEVERIFY%" pos09.dll do! peverify "pos09.dll" - do! attempt.For (["neg90"; "neg89"; "neg88"; + do! attempt.For (["neg95"; + "neg90"; "neg89"; "neg88"; "neg87"; "neg86"; "neg85"; "neg84"; "neg83"; "neg82"; "neg81"; "neg80"; "neg79"; "neg78"; "neg77"; "neg76"; "neg75"; "neg74"; "neg73"; "neg72"; "neg71"; "neg70"; "neg69"; "neg68"; "neg67"; "neg66"; "neg65"; "neg64"; "neg61"; "neg63"; "neg62"; "neg20"; "neg24"; "neg32"; "neg37"; "neg37_a"; "neg60"; "neg59"; "neg58"; "neg57"; "neg56"; "neg56_a"; "neg56_b"; diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/StaticLetDoDeclarations/E_RecMutable01.fs b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/StaticLetDoDeclarations/E_RecMutable01.fs index a8263031aed..7adf9a2e1dc 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/StaticLetDoDeclarations/E_RecMutable01.fs +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/StaticLetDoDeclarations/E_RecMutable01.fs @@ -2,7 +2,7 @@ // rec (mutable) // See FSHARP1.0:2329 -//Only record fields and simple 'let' bindings may be marked mutable +//Only record fields and simple, non-recursive 'let' bindings may be marked mutable type C() = class static let rec mutable m = 0 // only record fields and simple 'let' bindings may be marked mutable. end From e919a9832d23e917f27f091857932b990db3fb1a Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 12 May 2016 19:47:49 +0300 Subject: [PATCH 151/334] add negative tests --- .../Imported/CallerInfo/E_CallerMemberName.fs | 16 ++++++++++++++++ .../Imported/CallerInfo/env.lst | 1 + 2 files changed, 17 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs new file mode 100644 index 00000000000..30ef0c16e55 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs @@ -0,0 +1,16 @@ +//'CallerMemberName' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerMemberName' can only be applied to optional arguments +//'CallerMemberName' can only be applied to optional arguments +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerMemberNamehNotString([] ?name : int) = + name + + static member GetCallerMemberNameNotOptional([] name : string) = + name + + static member GetCallerMemberNameNotOptional([] name : string option) = + name \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 72380e030b9..1dac02145a5 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -3,6 +3,7 @@ SOURCE=CallerMemberName.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerMemberName.fs SOURCE=E_CallerLineNumber.fs SCFLAGS="--test:ErrorRanges" # E_CallerLineNumber.fs SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs + SOURCE=E_CallerMemberName.fs SCFLAGS="--test:ErrorRanges" # E_CallerMemberName.fs SOURCE=E_MultipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MultipleAttrs.fs SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe From 1ed22a816e37fcc2ed3b69f8143ad0ad1e81b4d8 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 12 May 2016 20:01:09 +0300 Subject: [PATCH 152/334] update chkCurriedMethodsCantHaveOutParams error --- src/fsharp/FSComp.txt | 2 +- tests/fsharp/typecheck/sigs/neg23.bsl | 4 ++-- .../MemberDeclarations/E_byref_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_optional_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_out_two_arguments_curried.fsx | 2 +- .../MemberDeclarations/E_paramarray_two_arguments_curried.fsx | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index c0fa84e4877..e9372cd7a37 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -256,7 +256,7 @@ chkUnionCaseDefaultAugmentation,"default augmentation of the union case" 438,chkDuplicateMethod,"Duplicate method. The method '%s' has the same name and signature as another method in this type." 438,chkDuplicateMethodWithSuffix,"Duplicate method. The method '%s' has the same name and signature as another method in this type once tuples, functions, units of measure and/or provided types are erased." 439,chkDuplicateMethodCurried,"The method '%s' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments." -440,chkCurriedMethodsCantHaveOutParams,"Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments" +440,chkCurriedMethodsCantHaveOutParams,"Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments" 441,chkDuplicateProperty,"Duplicate property. The property '%s' has the same name and signature as another property in this type." 441,chkDuplicatePropertyWithSuffix,"Duplicate property. The property '%s' has the same name and signature as another property in this type once tuples, functions, units of measure and/or provided types are erased." 442,chkDuplicateMethodInheritedType,"Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type." diff --git a/tests/fsharp/typecheck/sigs/neg23.bsl b/tests/fsharp/typecheck/sigs/neg23.bsl index f817caa2ef0..43ccae55657 100644 --- a/tests/fsharp/typecheck/sigs/neg23.bsl +++ b/tests/fsharp/typecheck/sigs/neg23.bsl @@ -27,9 +27,9 @@ neg23.fs(82,18,82,20): typecheck error FS0439: The method 'X0' has curried argum neg23.fs(85,18,85,21): typecheck error FS0439: The method 'X01' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. -neg23.fs(88,18,88,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +neg23.fs(88,18,88,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments -neg23.fs(90,18,90,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +neg23.fs(90,18,90,21): typecheck error FS0440: Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments neg23.fs(93,18,93,21): typecheck error FS0439: The method 'X04' has curried arguments but has the same name as another method in this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx index 68bd6ad5b0b..e5ffef324c3 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_byref_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // Out arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments type Misc2() = static member M (foo : int byref) (bar : int byref) = foo <- 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx index f788556262b..3aa8c622948 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_optional_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // optional arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments type Misc0() = static member M (?foo : int) (?bar : int) = 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx index b7754e95dde..2f6cec8efca 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_out_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // Out arguments - curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments type Misc2() = static member M ([] foo : int byref) ([] bar : int byref) = foo <- 10 diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx index 5840eee3a07..fb611d7bb1d 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/MemberDeclarations/E_paramarray_two_arguments_curried.fsx @@ -2,6 +2,6 @@ // Regression test for FSHARP1.0:5580 // disallow curried byref parameters // ParamArray arguments - non curried -//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', or 'CallerFilePath' arguments +//Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments type Misc0() = static member M ([] args : string[]) ([] argc : int) = args.Length + argc From 80975acae663fce2ecc7af0b2078306249d205d5 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 12 May 2016 20:57:07 +0300 Subject: [PATCH 153/334] implement the CS7080 warning and add test --- src/fsharp/FSComp.txt | 3 ++- src/fsharp/infos.fs | 4 ++++ .../Imported/CallerInfo/E_CallerMemberName.fs | 4 ++-- .../Imported/CallerInfo/W_CallerMemberName.fs | 8 ++++++++ .../SpecialAttributesAndTypes/Imported/CallerInfo/env.lst | 1 + 5 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index e9372cd7a37..27e79073c3b 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1293,4 +1293,5 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3194,optsResponseFileNotFound,"Response file '%s' not found in '%s'" 3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long" 3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory" -3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" \ No newline at end of file +3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" +3198,CallerMemberNameIsOverriden,"The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." \ No newline at end of file diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index c34c19ee382..28fc006705b 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1326,6 +1326,10 @@ type MethInfo = | true, false, false -> CallerLineNumber | false, true, false -> CallerFilePath | false, false, true -> CallerMemberName + | false, true, true -> match TryFindFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs with + | Some(Attrib(_,_,_,_,_,_,callerMemberNameAttributeRange)) -> warning(Error(FSComp.SR.CallerMemberNameIsOverriden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) + CallerFilePath + | _ -> failwith "Impossible" | _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs index 30ef0c16e55..9749e1e1508 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/E_CallerMemberName.fs @@ -1,4 +1,4 @@ -//'CallerMemberName' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' +//'CallerMemberName' must be applied to an argument of type 'string', but has been applied to an argument of type 'int' //'CallerMemberName' can only be applied to optional arguments //'CallerMemberName' can only be applied to optional arguments namespace Test @@ -6,7 +6,7 @@ namespace Test open System.Runtime.CompilerServices type MyTy() = - static member GetCallerMemberNamehNotString([] ?name : int) = + static member GetCallerMemberNameNotString([] ?name : int) = name static member GetCallerMemberNameNotOptional([] name : string) = diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs new file mode 100644 index 00000000000..49b9362c3e8 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs @@ -0,0 +1,8 @@ +//The CallerMemberNameAttribute applied to parameter 'name' will have no effect. It is overridden by the CallerFilePathAttribute. +namespace Test + +open System.Runtime.CompilerServices + +type MyTy() = + static member GetCallerMemberName([] ?name : string) = + name \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst index 1dac02145a5..46d8cb48635 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/env.lst @@ -5,6 +5,7 @@ SOURCE=E_CallerFilePath.fs SCFLAGS="--test:ErrorRanges" # E_CallerFilePath.fs SOURCE=E_CallerMemberName.fs SCFLAGS="--test:ErrorRanges" # E_CallerMemberName.fs SOURCE=E_MultipleAttrs.fs SCFLAGS="--test:ErrorRanges" # E_MultipleAttrs.fs + SOURCE=W_CallerMemberName.fs SCFLAGS="--test:ErrorRanges" # W_CallerMemberName.fs SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=EXEC COMPILE_ONLY=1 # ViaInteractive.fsx - exec SOURCE=ViaInteractive.fsx SCFLAGS="--test:ErrorRanges -r CSharpLib.dll" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" FSIMODE=PIPE COMPILE_ONLY=1 # ViaInteractive.fsx - pipe SOURCE=CallerInfoAndQuotiation.fs SCFLAGS="-r CSharpLib.dll --test:ErrorRanges" PRECMD="\$CSC_PIPE /t:library CSharpLib.cs" # CallerInfoAndQuotiation.fs From 0ba47d6c011d265402f9b85be80addbeec007cee Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 12 May 2016 12:36:06 -0700 Subject: [PATCH 154/334] Align spaces --- setup/FSharp.Setup.props | 12 +- .../FSharp.Wix.Extensions.csproj | 4 +- setup/fsharp-setup-build.proj | 68 +++++----- src/Microbuild.Settings.targets | 126 +++++++++--------- .../FSharp.Compiler.Server.Shared.fsproj | 8 +- .../FSharp.LanguageService.Compiler.fsproj | 10 +- .../ItemTemplates/AppConfig/AppConfig.csproj | 2 +- .../ItemTemplates/CodeFile/CodeFile.csproj | 16 +-- .../ScriptFile/ScriptFile.csproj | 16 +-- .../SignatureFile/SignatureFile.csproj | 16 +-- .../ItemTemplates/TextFile/TextFile.csproj | 16 +-- .../ItemTemplates/XMLFile/XMLFile.csproj | 16 +-- .../ConsoleProject/ConsoleProject.csproj | 20 +-- .../LibraryProject/LibraryProject.csproj | 20 +-- .../NetCore259Project.csproj | 20 +-- .../NetCoreProject/NetCoreProject.csproj | 20 +-- .../PortableLibraryProject.csproj | 20 +-- .../SilverlightProject.csproj | 20 +-- .../TutorialProject/TutorialProject.csproj | 18 +-- .../src/FSharp.Editor/FSharp.Editor.fsproj | 8 +- .../FSharp.LanguageService.Base.csproj | 14 +- .../FSharp.LanguageService.fsproj | 10 +- .../Project/ProjectSystem.Base.csproj | 10 +- .../ProjectSystem.fsproj | 22 +-- .../FSharp.PropertiesPages.vbproj | 14 +- .../src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj | 10 +- 26 files changed, 268 insertions(+), 268 deletions(-) diff --git a/setup/FSharp.Setup.props b/setup/FSharp.Setup.props index b3030a02d99..ea36f75549e 100644 --- a/setup/FSharp.Setup.props +++ b/setup/FSharp.Setup.props @@ -5,9 +5,9 @@ 2.0 3.10 3.10.0.1503 - $(SetupRootFolder)\..\packages\WiX.Toolset.2015.$(WiXToolset2015Version)\tools\wix - $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Core.Redist.1.0.0 - $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Type.Providers.Redist.1.0.0 + $(SetupRootFolder)\..\packages\WiX.Toolset.2015.$(WiXToolset2015Version)\tools\wix + $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Core.Redist.1.0.0 + $(SetupRootFolder)\..\packages\Microsoft.VisualFSharp.Type.Providers.Redist.1.0.0 net40 @@ -15,9 +15,9 @@ AnyCPU - $(SetupRootFolder)\..\$(Configuration) + $(SetupRootFolder)\..\$(Configuration) obj\$(Configuration)\ - $(BinariesDir)\setup - $(BinariesDir)\setup\$(Lang) + $(BinariesDir)\setup + $(BinariesDir)\setup\$(Lang) diff --git a/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj b/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj index cc0710faa1b..4b1fcf35c14 100644 --- a/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj +++ b/setup/FSharp.Wix.Extensions/FSharp.Wix.Extensions.csproj @@ -11,8 +11,8 @@ CSharp 15.0 - 4.4.1.0 - cs + 4.4.1.0 + cs diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj index 916be4b1637..60a7b5d5b09 100644 --- a/setup/fsharp-setup-build.proj +++ b/setup/fsharp-setup-build.proj @@ -1,43 +1,43 @@ - + - - . - net40 - ENU - - - - - + + . + net40 + ENU + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + diff --git a/src/Microbuild.Settings.targets b/src/Microbuild.Settings.targets index 7383b4f35ae..e19a37597c9 100644 --- a/src/Microbuild.Settings.targets +++ b/src/Microbuild.Settings.targets @@ -9,21 +9,21 @@ - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - - + + + + + + + - + - - ENU - - + + ENU + + + OutDir="$(OutDir)" + TemplateCategory="$(TemplateCategory)" + AssemblyName="$(AssemblyName)" + TemplateFiles="@(TemplateFiles)" + LocalizedFiles="@(FilesToLocalize)" + LocLanguages="$(Languages)" /> - + - $([System.DateTime]::Now.ToString(yyyyMMdd.0)) - + $([System.DateTime]::Now.ToString(yyyyMMdd.0)) + - + Language="$(MicroBuildAssemblyFileLanguage)" + ProductVersion="$(MicroBuildAssemblyVersion)" + BuildNumber="$(BUILD_BUILDNUMBER)" + Condition="'$(MicroBuildAssemblyFileLanguage)' != '' and '$(MicroBuildAssemblyVersion)' != ''"> + - - - + + + - - - - - + + + + + - + diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj index c5b6dda79a9..a883a72b4a3 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj +++ b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj @@ -11,13 +11,13 @@ {d5870cf0-ed51-4cbc-b3d7-6f56da84ac06} Library FSharp.Compiler.Server.Shared - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true v4.6 diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index 7272e01b5a3..5e32492587b 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -21,13 +21,13 @@ {a437a6ec-5323-47c2-8f86-e2cac54ff152} true 0x06800000 - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true v4.6 @@ -35,7 +35,7 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false diff --git a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj index 9ade25df3b8..820c9a00ed5 100644 --- a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj +++ b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj @@ -9,7 +9,7 @@ true false None - true + true Template diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index bc4e540f926..1c2ceab8ad9 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {12ac2813-e895-4aaa-ae6c-94e21da09f64} - ItemTemplates + ItemTemplates CodeFile - true + true @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index 8bd735560f2..54fa89f00f6 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {a333b85a-dc23-49b6-9797-b89a7951e92d} - ItemTemplates + ItemTemplates ScriptFile - true + true @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index e75833e9f1d..4486589cba2 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {e3fdd4ac-46b6-4b9f-b672-317d1202cc50} - ItemTemplates + ItemTemplates SignatureFile - true + true @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index 91062a06f48..006ebe93ec3 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {d11fc318-8f5d-4c8c-9287-ab40a016d13c} - ItemTemplates + ItemTemplates TextFile - true + true @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index 8fb39ad587b..642af10fbe0 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {1fb1dd07-06aa-45b4-b5ac-20ff5bee98b6} - ItemTemplates + ItemTemplates XMLFile - true + true @@ -29,6 +29,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index 092482646cf..edef19a8a3a 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {604F0DAA-2D33-48DD-B162-EDF0B672803D} - ProjectTemplates + ProjectTemplates ConsoleProject - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Program.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Program.fs.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index 9b136206b58..c06756ce060 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - ProjectTemplates + ProjectTemplates LibraryProject - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 076afb433dc..692af55abce 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {D9D95330-3626-4199-B7AF-17B8E4AF6D87} - ProjectTemplates + ProjectTemplates NetCore259Project - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 66be6d87bc5..2dbff8e2432 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} - ProjectTemplates + ProjectTemplates NetCoreProject - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 56f2483f513..5b5bbf85d88 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {DB374A0C-7560-479F-9B21-D37C81F7624F} - ProjectTemplates + ProjectTemplates PortableLibraryProject - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index 44c1d54c3e4..d67c8720911 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} - ProjectTemplates + ProjectTemplates SilverlightProject - true + true @@ -25,13 +25,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Script.fsx.lci false - false + false @@ -46,6 +46,6 @@ - + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 2aff9d65835..8b03993b29b 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -6,18 +6,18 @@ $(NoWarn);2008 false false - true - false - None - true + true + false + None + true Template - ..\..\..\src + ..\..\..\src {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - ProjectTemplates + ProjectTemplates TutorialProject - true + true @@ -25,7 +25,7 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Tutorial.fsx.lcl $(FSharpSourcesRoot)\..\loc\lci\$(TemplateCategory)\$(AssemblyName)\Tutorial.fsx.lci false - false + false @@ -38,6 +38,6 @@ - + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 4bdc4a0a106..e3918584174 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -20,13 +20,13 @@ $(NoWarn);75 false $(OtherFlags) --warnon:1182 --subsystemversion:6.00 - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true diff --git a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj index 6071de5261b..1a565b9de41 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj +++ b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj @@ -5,8 +5,8 @@ ..\..\..\src CSharp true - 15.4.1.0 - cs + 15.4.1.0 + cs Debug @@ -31,20 +31,20 @@ $(DefineConstants);FX_ATLEAST_LINQ - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index 9c38f06bf16..32d2da7fa46 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -6,20 +6,20 @@ FSharp true v4.6 - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index b28df61cbb8..e85929aef27 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -30,20 +30,20 @@ $(DefineConstants);FX_ATLEAST_LINQ $(DefineConstants);FX_PREFERRED_UI_LANG - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 773cf2e781f..b85b500e75d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -28,8 +28,8 @@ false false true - true - true + true + true @@ -37,13 +37,13 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\MenusAndCommands.vsct.lcl $(FSharpSourcesRoot)\..\loc\lci\MenusAndCommands.vsct.lci false - false + false FSharp.ProjectSystem.FSharp.dll 210 @@ -90,11 +90,11 @@ - $(VS150COMNTOOLS)\..\IDE\Microsoft.VisualStudio.Shell.UI.Internal.dll - + $(VS150COMNTOOLS)\..\IDE\Microsoft.VisualStudio.Shell.UI.Internal.dll + - $(VS150COMNTOOLS)\..\IDE\PublicAssemblies\Microsoft.VisualStudio.Shell.Immutable.$(VisualStudioVersion).dll - + $(VS150COMNTOOLS)\..\IDE\PublicAssemblies\Microsoft.VisualStudio.Shell.Immutable.$(VisualStudioVersion).dll + @@ -170,8 +170,8 @@ - - - + + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 3d41669383f..3d9e9db1d89 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -5,8 +5,8 @@ ..\..\..\src VisualBasic true - 15.4.1.0 - vb + 15.4.1.0 + vb Debug @@ -41,20 +41,20 @@ $(DefineConstants),FX_ATLEAST_LINQ=True - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false diff --git a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj index 05322987f4e..9faa0d0e968 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj @@ -20,20 +20,20 @@ LIBRARY $(NoWarn);47;75 $(OtherFlags) --subsystemversion:6.00 - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK - true + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK + true false false true - true - true + true + true $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false From c713aac794498cc5dc80bb703b65f7d6de03feed Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 12 May 2016 13:25:54 -0700 Subject: [PATCH 155/334] Publishing separate VSIX per VS SKU --- .../Desktop/Source.extension.vsixmanifest | 39 +++ .../Source.extension.vsixmanifest | 44 ++++ .../Source.extension.vsixmanifest | 39 +++ .../VisualFSharpVsix/VisualFSharpVsix.csproj | 229 +++++++++++------- .../fsharp-vsintegration-vsix-build.proj | 24 +- 5 files changed, 278 insertions(+), 97 deletions(-) create mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest create mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest create mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest new file mode 100644 index 00000000000..4445242d246 --- /dev/null +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest @@ -0,0 +1,39 @@ + + + + + + Visual F# Tools + Deploy Visual F# Tools templates to Visual Studio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest new file mode 100644 index 00000000000..c2ced20884b --- /dev/null +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest @@ -0,0 +1,44 @@ + + + + + + Visual F# Tools + Deploy Visual F# Tools templates to Visual Studio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest new file mode 100644 index 00000000000..58b5919c245 --- /dev/null +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest @@ -0,0 +1,39 @@ + + + + + + Visual F# Tools + Deploy Visual F# Tools templates to Visual Studio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 3b07d138c7f..64d137092e2 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -6,10 +6,7 @@ ..\src net40 11 - ..\..\..\src - 14.0 11.0 - ..\..\..\src $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -48,12 +45,23 @@ Properties FSharp true - 14.0 False True {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} true + VisualFSharpVsix + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin + + + + VisualFSharpVsix + $(RootBinPath) + + VisualFSharpVsix.$(ShippingSku) + $(RootBinPath)\ShippingSkus\$(ShippingSku) + + Program $(DevEnvDir)devenv.exe @@ -67,97 +75,137 @@ true /rootsuffix $(VSRootSuffix) /log $(VSRootSuffix) - VisualFSharpVsix - VisualFSharpVsix - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin 15.4.1.0 cs - 14.0 + - + + Designer + + + Designer + Source.extension.vsixmanifest + + + Always + true + RegisterFsharpPackage.pkgdef + + + + + Always true ProjectTemplates\SilverlightProject.zip - + Always true ProjectTemplates\NetCoreProject.zip - + Always true ProjectTemplates\NetCore78Project.zip - + Always true ProjectTemplates\NetCore259Project.zip - + Always true ProjectTemplates\PortableLibraryProject.zip - + + Always + true + ProjectTemplates\TutorialProject.zip + + + Always + true + ProjectTemplates\ConsoleProject.zip + + + Always + true + ProjectTemplates\LibraryProject.zip + + + + + Always true ProjectTemplates\TutorialProject.zip - + Always true ProjectTemplates\ConsoleProject.zip - + + Always + true + ProjectTemplates\LibraryProject.zip + + + + + + Always + true + ProjectTemplates\TutorialProject.zip + + + Always + true + ProjectTemplates\SilverlightProject.zip + + Always true ProjectTemplates\LibraryProject.zip + - + Always true ItemTemplates\AppConfig.zip - + Always true ItemTemplates\CodeFile.zip - + Always true ItemTemplates\ScriptFile.zip - + Always true ItemTemplates\SignatureFile.zip - + Always true ItemTemplates\TextFile.zip - + Always true ItemTemplates\XMLFile.zip - - - Designer - - - Always - true - RegisterFsharpPackage.pkgdef - - + False @@ -175,6 +223,7 @@ false + {649FA588-F02E-457C-9FCF-87E46407481E} @@ -224,6 +273,58 @@ DebugSymbolsProjectOutputGroup%3b false + + {65e0e82a-eace-4787-8994-888674c2fe87} + FSharp.Editor + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF} + FSharp.LanguageService.Base + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F} + FSharp.LanguageService + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7} + ProjectSystem.Base + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44} + ProjectSystem + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {FCFB214C-462E-42B3-91CA-FC557EFEE74F} + FSharp.PropertiesPages + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} + FSharp.VS.FSI + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b + DebugSymbolsProjectOutputGroup%3b + false + + + + {6BA13AA4-C25F-480F-856B-8E8000299A72} AppConfig @@ -254,6 +355,9 @@ XMLFile false + + + {604F0DAA-2D33-48DD-B162-EDF0B672803D} ConsoleProject @@ -294,56 +398,8 @@ TutorialProject false - - {65e0e82a-eace-4787-8994-888674c2fe87} - FSharp.Editor - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF} - FSharp.LanguageService.Base - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F} - FSharp.LanguageService - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7} - ProjectSystem.Base - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44} - ProjectSystem - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {FCFB214C-462E-42B3-91CA-FC557EFEE74F} - FSharp.PropertiesPages - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - - - {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} - FSharp.VS.FSI - BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - false - + @@ -356,11 +412,10 @@ - - - - - - + + + + + \ No newline at end of file diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index 3bcead14a6b..423aa971dad 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -5,21 +5,25 @@ - - - - - - - - - - + + + + + + + + + + + + + + From 64fe6400008cbea47405f051c6be5ecb9890130d Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 12 May 2016 16:02:09 -0700 Subject: [PATCH 156/334] Addressing PR comments --- setup/FSharp.SDK/FSharp.SDK.wixproj | 30 +++++++++---------- .../ItemTemplates/AppConfig/AppConfig.csproj | 2 +- .../ItemTemplates/CodeFile/CodeFile.csproj | 2 +- .../ScriptFile/ScriptFile.csproj | 2 +- .../SignatureFile/SignatureFile.csproj | 2 +- .../ItemTemplates/TextFile/TextFile.csproj | 2 +- .../ItemTemplates/XMLFile/XMLFile.csproj | 2 +- .../ConsoleProject/ConsoleProject.csproj | 2 +- .../LibraryProject/LibraryProject.csproj | 2 +- .../NetCore259Project.csproj | 2 +- .../NetCore78Project/NetCore78Project.csproj | 2 +- .../NetCoreProject/NetCoreProject.csproj | 2 +- .../PortableLibraryProject.csproj | 2 +- .../SilverlightProject.csproj | 2 +- .../TutorialProject/TutorialProject.csproj | 2 +- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 6 +++- 16 files changed, 34 insertions(+), 30 deletions(-) diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj index 9620548e26e..1483ed4ae4f 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wixproj +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -2,7 +2,7 @@ - $(MSBuildProjectDirectory)\..\.. + $(MSBuildProjectDirectory)\..\.. $(FSharpTreeRoot)\setup @@ -14,10 +14,10 @@ da0da41f-0e00-4598-8eee-b29d31b0ca04 Package net - true + true false true - false + false @@ -29,20 +29,20 @@ - - WixNetFxExtension - + + WixNetFxExtension + FSharp.Wix.Extensions - $(BinariesDir)\setup\FSharp.Wix.Extensions.dll + $(BinariesDir)\setup\FSharp.Wix.Extensions.dll - + - + @@ -52,7 +52,7 @@ - MicrosoftSHA1 + Microsoft400 @@ -60,14 +60,14 @@ - + - - - + + + - + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj index 820c9a00ed5..55edb651b16 100644 --- a/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj +++ b/vsintegration/ItemTemplates/AppConfig/AppConfig.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates AppConfig true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index 1c2ceab8ad9..736f1c1c691 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates CodeFile true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index 54fa89f00f6..f80fdfa6492 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates ScriptFile true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index 4486589cba2..b1a5252e141 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates SignatureFile true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index 006ebe93ec3..89b1b4bfa70 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates TextFile true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index 642af10fbe0..7300caa4be0 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ItemTemplates XMLFile true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index edef19a8a3a..e7dad6d8ff1 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates ConsoleProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index c06756ce060..5a12fed524c 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates LibraryProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 692af55abce..92b7c758a0c 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates NetCore259Project true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index f9ba4f24e86..f896ce0783e 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates NetCore78Project true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 2dbff8e2432..2e791a3c156 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates NetCoreProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 5b5bbf85d88..5a7f1a44b3b 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates PortableLibraryProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index d67c8720911..270615929b1 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates SilverlightProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 8b03993b29b..0783fecdbfd 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -10,7 +10,6 @@ false None true - Template ..\..\..\src @@ -18,6 +17,7 @@ ProjectTemplates TutorialProject true + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index 64d137092e2..f6830f5b876 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -5,7 +5,7 @@ ..\..\src ..\src net40 - 11 + 14.0 11.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -92,6 +92,10 @@ true RegisterFsharpPackage.pkgdef + + PreserveNewest + true + From 41f540540d245882ec3241b1c6fa3555a4da329c Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 12 May 2016 17:50:04 -0700 Subject: [PATCH 157/334] Fix template projects to produce zip files without localization --- src/Microbuild.Settings.targets | 16 +++- .../ItemTemplates/AppConfig/AppConfig.csproj | 28 ++++--- .../ItemTemplates/CodeFile/CodeFile.csproj | 28 ++++--- .../ScriptFile/ScriptFile.csproj | 28 ++++--- .../SignatureFile/SignatureFile.csproj | 28 ++++--- .../ItemTemplates/TextFile/TextFile.csproj | 28 ++++--- .../ItemTemplates/XMLFile/XMLFile.csproj | 28 ++++--- .../ConsoleProject/ConsoleProject.csproj | 28 ++++--- .../LibraryProject/LibraryProject.csproj | 28 ++++--- .../NetCore259Project.csproj | 29 ++++--- .../NetCore78Project/NetCore78Project.csproj | 32 ++++---- .../NetCoreProject/NetCoreProject.csproj | 28 ++++--- .../PortableLibraryProject.csproj | 28 ++++--- .../SilverlightProject.csproj | 28 ++++--- .../TutorialProject/TutorialProject.csproj | 28 ++++--- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 76 ------------------- .../fsharp-vsintegration-vsix-build.proj | 6 +- 17 files changed, 204 insertions(+), 291 deletions(-) diff --git a/src/Microbuild.Settings.targets b/src/Microbuild.Settings.targets index e19a37597c9..da413419000 100644 --- a/src/Microbuild.Settings.targets +++ b/src/Microbuild.Settings.targets @@ -163,13 +163,25 @@ - + + + + + + + ENU - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {6BA13AA4-C25F-480F-856B-8E8000299A72} - ItemTemplates AppConfig + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj index 736f1c1c691..af65940e8fc 100644 --- a/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj +++ b/vsintegration/ItemTemplates/CodeFile/CodeFile.csproj @@ -1,34 +1,32 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {12ac2813-e895-4aaa-ae6c-94e21da09f64} - ItemTemplates CodeFile + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj index f80fdfa6492..53e45efd0c2 100644 --- a/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj +++ b/vsintegration/ItemTemplates/ScriptFile/ScriptFile.csproj @@ -1,34 +1,32 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {a333b85a-dc23-49b6-9797-b89a7951e92d} - ItemTemplates ScriptFile + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj index b1a5252e141..556a222f1da 100644 --- a/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj +++ b/vsintegration/ItemTemplates/SignatureFile/SignatureFile.csproj @@ -1,34 +1,32 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {e3fdd4ac-46b6-4b9f-b672-317d1202cc50} - ItemTemplates SignatureFile + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/TextFile/TextFile.csproj b/vsintegration/ItemTemplates/TextFile/TextFile.csproj index 89b1b4bfa70..858f48a45b7 100644 --- a/vsintegration/ItemTemplates/TextFile/TextFile.csproj +++ b/vsintegration/ItemTemplates/TextFile/TextFile.csproj @@ -1,34 +1,32 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {d11fc318-8f5d-4c8c-9287-ab40a016d13c} - ItemTemplates TextFile + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj index 7300caa4be0..dee1bb2c2e0 100644 --- a/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj +++ b/vsintegration/ItemTemplates/XMLFile/XMLFile.csproj @@ -1,34 +1,32 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {1fb1dd07-06aa-45b4-b5ac-20ff5bee98b6} - ItemTemplates XMLFile + ItemTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index e7dad6d8ff1..2b13fd8e53b 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {604F0DAA-2D33-48DD-B162-EDF0B672803D} - ProjectTemplates ConsoleProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index 5a12fed524c..e1afe08cefa 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - ProjectTemplates LibraryProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 92b7c758a0c..6110d368738 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {D9D95330-3626-4199-B7AF-17B8E4AF6D87} - ProjectTemplates NetCore259Project + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -34,6 +30,7 @@ false + @@ -42,10 +39,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index f896ce0783e..303e9f18612 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -2,24 +2,20 @@ - Library - $(NoWarn);2008 - false - false - true - false - None - true + ..\..\..\src + NetCore78Project + ProjectTemplates + true + true - ..\..\..\src - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} - ProjectTemplates - NetCore78Project - true + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - - + + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 2e791a3c156..24c9d8bcf3a 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} - ProjectTemplates NetCoreProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 5a7f1a44b3b..125c0fbf8bd 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {DB374A0C-7560-479F-9B21-D37C81F7624F} - ProjectTemplates PortableLibraryProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj index 270615929b1..abfc6423b5f 100644 --- a/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj +++ b/vsintegration/ProjectTemplates/SilverlightProject/SilverlightProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} - ProjectTemplates SilverlightProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -42,10 +38,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 0783fecdbfd..fc41a78cf21 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -1,25 +1,21 @@  - - Library - $(NoWarn);2008 - false - false - true - false - None - true - ..\..\..\src - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - ProjectTemplates TutorialProject + ProjectTemplates + true true + + + Debug + net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + + + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Tutorial.fsx.lcl @@ -34,10 +30,12 @@ - + - + + + \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index f6830f5b876..dc8d290d9f5 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -328,82 +328,6 @@ - - - {6BA13AA4-C25F-480F-856B-8E8000299A72} - AppConfig - false - - - {12AC2813-E895-4AAA-AE6C-94E21DA09F64} - CodeFile - false - - - {A333B85A-DC23-49B6-9797-B89A7951E92D} - ScriptFile - false - - - {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} - SignatureFile - false - - - {D11FC318-8F5D-4C8C-9287-AB40A016D13C} - TextFile - false - - - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} - XMLFile - false - - - - - - {604F0DAA-2D33-48DD-B162-EDF0B672803D} - ConsoleProject - false - - - {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} - LibraryProject - false - - - {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} - NetCoreProject - false - - - {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} - NetCore78Project - false - - - {D9D95330-3626-4199-B7AF-17B8E4AF6D87} - NetCore259Project - false - - - {DB374A0C-7560-479F-9B21-D37C81F7624F} - PortableLibraryProject - false - - - {15A57828-F9F5-4FB4-8E1E-AE7622A10F70} - SilverlightProject - false - - - {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} - TutorialProject - false - - - diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index 423aa971dad..4ccae9f868b 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -5,6 +5,9 @@ + + + @@ -19,7 +22,8 @@ - + + From 467ccc972b428f122cb471f5604d3b882e8cc76f Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Fri, 13 May 2016 15:43:50 +0300 Subject: [PATCH 158/334] fix Async.AwaitTask behaviour on cancelled tasks; add unit test that verifies the correct behaviour. --- .../Microsoft.FSharp.Control/AsyncType.fs | 13 +++++++++++++ src/fsharp/FSharp.Core/control.fs | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs index e657b9c9bfe..815c16e2b9d 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs @@ -247,6 +247,19 @@ type AsyncType() = return s = s1 } Async.RunSynchronously(a, 1000) |> Assert.IsTrue + + [] + member this.TaskCancellation () = + let test() = async { + let tcs = new System.Threading.Tasks.TaskCompletionSource() + tcs.SetCanceled() + try + do! Async.AwaitTask tcs.Task + return false + with :? System.OperationCanceledException -> return true + } + + Async.RunSynchronously(test()) |> Assert.IsTrue [] member this.TaskAsyncValueException () = diff --git a/src/fsharp/FSharp.Core/control.fs b/src/fsharp/FSharp.Core/control.fs index e94e54dbbf1..b8cdaeffbce 100644 --- a/src/fsharp/FSharp.Core/control.fs +++ b/src/fsharp/FSharp.Core/control.fs @@ -1553,7 +1553,7 @@ namespace Microsoft.FSharp.Control let continuation (completedTask : Task<_>) : unit = args.aux.trampolineHolder.Protect((fun () -> if completedTask.IsCanceled then - args.aux.ccont (new OperationCanceledException()) + args.aux.econt (ExceptionDispatchInfo.Capture(new OperationCanceledException())) elif completedTask.IsFaulted then args.aux.econt (MayLoseStackTrace(completedTask.Exception)) else From facfec90c4e1690ca74dc6f38c0822991b5ad133 Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Fri, 13 May 2016 15:46:44 +0300 Subject: [PATCH 159/334] improve test name --- .../FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs index 815c16e2b9d..b1e725aaee4 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs @@ -249,7 +249,7 @@ type AsyncType() = Async.RunSynchronously(a, 1000) |> Assert.IsTrue [] - member this.TaskCancellation () = + member this.AwaitTaskCancellation () = let test() = async { let tcs = new System.Threading.Tasks.TaskCompletionSource() tcs.SetCanceled() From 83f87a720fbe3598885ca1f31d95a3672371be35 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sun, 24 Apr 2016 09:54:39 +0200 Subject: [PATCH 160/334] Propose compatible record labels in compiler error --- src/fsharp/CompileOps.fs | 6 +- src/fsharp/ErrorResolutionHints.fs | 29 ++ src/fsharp/FSComp.txt | 5 +- .../FSharp.Compiler-proto.fsproj | 6 + .../FSharp.Compiler/FSharp.Compiler.fsproj | 8 +- .../FSharp.LanguageService.Compiler.fsproj | 6 + src/fsharp/NameResolution.fs | 126 ++++-- src/fsharp/NameResolution.fsi | 2 +- src/fsharp/TypeChecker.fs | 7 +- src/fsharp/tast.fs | 6 +- src/utils/EditDistance.fs | 47 ++ ...VIL_PROVIDER_ResolveTypeName_Exception.bsl | 12 +- .../EVIL_PROVIDER_ResolveTypeName_Null.bsl | 12 +- tests/fsharp/typeProviders/negTests/neg1.bsl | 404 ++++++++++++++++-- tests/fsharp/typecheck/sigs/neg07.bsl | 4 +- tests/fsharp/typecheck/sigs/neg17.bsl | 28 +- .../RequireQualifiedAccess/E_OnRecord.fs | 4 +- .../Record/E_RecTypesNotMatch01.fs | 2 +- .../General/E_matrix_LetBinding01.fs | 2 +- .../Diagnostics/General/E_matrix_class01.fs | 2 +- .../General/E_matrix_interface01.fs | 4 +- .../Diagnostics/General/E_matrix_struct01.fs | 2 +- .../NameResolution/E_FieldNotInRecord.fs | 13 + .../NameResolution/E_RecordFieldProposal.fs | 13 + .../ErrorMessages/NameResolution/env.lst | 2 + tests/fsharpqa/Source/test.lst | 1 + 26 files changed, 673 insertions(+), 80 deletions(-) create mode 100644 src/fsharp/ErrorResolutionHints.fs create mode 100644 src/utils/EditDistance.fs create mode 100644 tests/fsharpqa/Source/ErrorMessages/NameResolution/E_FieldNotInRecord.fs create mode 100644 tests/fsharpqa/Source/ErrorMessages/NameResolution/E_RecordFieldProposal.fs create mode 100644 tests/fsharpqa/Source/ErrorMessages/NameResolution/env.lst diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0d8ea5a3fa5..d79dd8eeda1 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -742,8 +742,12 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = os.Append(Duplicate1E().Format (DecompileOpName s)) |> ignore else os.Append(Duplicate2E().Format k (DecompileOpName s)) |> ignore - | UndefinedName(_,k,id,_) -> + | UndefinedName(_,k,id,predictions) -> os.Append(k (DecompileOpName id.idText)) |> ignore + if Set.isEmpty predictions |> not then + let filtered = ErrorResolutionHints.FilterPredictions id.idText predictions + os.Append(ErrorResolutionHints.FormatPredictions filtered) |> ignore + | InternalUndefinedItemRef(f,smr,ccuName,s) -> let _, errs = f(smr, ccuName, s) os.Append(errs) |> ignore diff --git a/src/fsharp/ErrorResolutionHints.fs b/src/fsharp/ErrorResolutionHints.fs new file mode 100644 index 00000000000..28bb2ff2d6c --- /dev/null +++ b/src/fsharp/ErrorResolutionHints.fs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Functions to format error message details +module internal Microsoft.FSharp.Compiler.ErrorResolutionHints + +/// Filters predictions based on edit distance to an unknown identifier. +let FilterPredictions unknownIdent allPredictions = + let rec take n predictions = + predictions + |> Seq.mapi (fun i x -> i,x) + |> Seq.takeWhile (fun (i,_) -> i < n) + |> Seq.map snd + |> Seq.toList + + allPredictions + |> Seq.toList + |> List.distinct + |> List.sortBy (fun s -> Internal.Utilities.EditDistance.CalcEditDistance(unknownIdent,s)) + |> take 5 + +let FormatPredictions predictions = + match predictions with + | [] -> System.String.Empty + | _ -> + let predictionText = + predictions + |> Seq.map (sprintf "%s %s" System.Environment.NewLine) + |> String.concat "" + System.Environment.NewLine + FSComp.SR.undefinedNameRecordLabelDetails() + predictionText diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index b05aaca7ae0..5575d29959f 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -9,8 +9,10 @@ undefinedNameValueOfConstructor,"The value or constructor '%s' is not defined" undefinedNameValueNamespaceTypeOrModule,"The value, namespace, type or module '%s' is not defined" undefinedNameConstructorModuleOrNamespace,"The constructor, module or namespace '%s' is not defined" undefinedNameType,"The type '%s' is not defined" +undefinedNameTypeIn,"The type '%s' is not defined in '%s'." undefinedNameRecordLabelOrNamespace,"The record label or namespace '%s' is not defined" -undefinedNameRecordLabel,"The record label '%s' is not defined" +undefinedNameRecordLabel,"The record label '%s' is not defined." +undefinedNameRecordLabelDetails,"Maybe you want one of the following:" undefinedNameTypeParameter,"The type parameter '%s' is not defined" undefinedNamePatternDiscriminator,"The pattern discriminator '%s' is not defined" missingElseBranch,"The 'if' expression is missing an 'else' branch. The 'then' branch has type '%s'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type." @@ -951,6 +953,7 @@ lexfltSeparatorTokensOfPatternMatchMisaligned,"The '|' tokens separating rules o 1127,nrIsNotConstructorOrLiteral,"This is not a constructor or literal, or a constructor is being used incorrectly" 1128,nrUnexpectedEmptyLongId,"Unexpected empty long identifier" 1129,nrTypeDoesNotContainSuchField,"The type '%s' does not contain a field '%s'" +1129,nrRecordDoesNotContainSuchLabel,"The record type '%s' does not contain a label '%s'." 1130,nrInvalidFieldLabel,"Invalid field label" 1132,nrInvalidExpression,"Invalid expression '%s'" 1133,nrNoConstructorsAvailableForType,"No constructors are available for the type '%s'" diff --git a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj index 9731adc082c..7eb20114970 100644 --- a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj +++ b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj @@ -98,6 +98,9 @@ HashMultiMap.fs + + Utilities\EditDistance.fs + TaggedCollections.fsi @@ -211,6 +214,9 @@ ErrorLogger.fs + + ErrorResolutionHints.fs + InternalCollections.fsi diff --git a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj index 9ff448d299e..9ba9ef50d9f 100644 --- a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj +++ b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj @@ -1,4 +1,4 @@ - + @@ -84,6 +84,9 @@ Utilities\HashMultiMap.fs + + Utilities\EditDistance.fs + Utilities\TaggedCollections.fsi @@ -159,6 +162,9 @@ ErrorLogging\ErrorLogger.fs + + ErrorLogging\ErrorResolutionHints.fs + ReferenceResolution\ReferenceResolution.fsi diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index 2ab989865f6..eae4ab21a55 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -80,6 +80,9 @@ Utilities\HashMultiMap.fs + + Utilities\EditDistance.fs + Utilities\TaggedCollections.fsi @@ -152,6 +155,9 @@ ErrorLogging\ErrorLogger.fs + + ErrorLogging\ErrorResolutionHints.fs + ReferenceResolution\ReferenceResolution.fsi diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 8c5b65ebd89..2dc05d9dc23 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -801,8 +801,11 @@ let AddResults res1 res2 = | Result x,Result l -> Result (x @ l) | Exception _,Result l -> Result l | Result x,Exception _ -> Result x + // This prefers error messages with more predictions + | Exception (UndefinedName(n1,_,_,predictions1) as e1),Exception (UndefinedName(n2,_,_,predictions2) as e2) when n1 = n2 -> + if Set.count predictions1 < Set.count predictions2 then Exception e2 else Exception e1 // This prefers error messages coming from deeper failing long identifier paths - | Exception (UndefinedName(n1,_,_,_) as e1),Exception (UndefinedName(n2,_,_,_) as e2) -> + | Exception (UndefinedName(n1,_,_,_) as e1),Exception (UndefinedName(n2,_,_,_) as e2) -> if n1 < n2 then Exception e2 else Exception e1 // Prefer more concrete errors about things being undefined | Exception (UndefinedName _ as e1),Exception (Error _) -> Exception e1 @@ -1610,15 +1613,15 @@ let rec ResolveLongIndentAsModuleOrNamespace amap m fullyQualified (nenv:NameRes | Some mspec when IsEntityAccessible amap m ad (modref.NestedTyconRef mspec) -> let subref = modref.NestedTyconRef mspec look (depth+1) subref mspec.ModuleOrNamespaceType rest - | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespace,id,[])) + | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespace,id,NoPredictions)) modrefs |> CollectResults (fun modref -> if IsEntityAccessible amap m ad modref then look 1 modref modref.ModuleOrNamespaceType rest else - raze (UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,[]))) + raze (UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,NoPredictions))) | None -> - raze (UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,[])) + raze (UndefinedName(0,FSComp.SR.undefinedNameNamespaceOrModule,id,NoPredictions)) let ResolveLongIndentAsModuleOrNamespaceThen amap m fullyQualified (nenv:NameResolutionEnv) ad lid f = @@ -1858,7 +1861,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo // since later on this logic is used when giving preference to intrinsic definitions match DecodeFSharpEvent (pinfos@extensionPropInfos) ad g ncenv m with | Some x -> success (resInfo, x, rest) - | None-> raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,[])) + | None -> raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,NoPredictions)) | Some(MethodItem msets) when (match lookupKind with LookupKind.Expr -> true | _ -> false) -> let minfos = msets |> ExcludeHiddenOfMethInfos g ncenv.amap m @@ -1883,7 +1886,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo success (resInfo,Item.MakeMethGroup (nm,minfos),rest) elif isTyparTy g typ then raze (IndeterminateType(unionRanges m id.idRange)) - else raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,[])) + else raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,NoPredictions)) let nestedSearchAccessible = let nestedTypes = GetNestedTypesOfType (ad, ncenv, Some nm, (if isNil rest then typeNameResInfo.StaticArgsInfo else TypeNameResolutionStaticArgsInfo.Indefinite), true, m) typ @@ -1995,7 +1998,7 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN else NoResultsOrUsefulErrors - AtMostOneResult id.idRange ( tyconSearch +++ moduleSearch +++ raze (UndefinedName(depth,FSComp.SR.undefinedNameValueConstructorNamespaceOrType,id,[]))) + AtMostOneResult id.idRange ( tyconSearch +++ moduleSearch +++ raze (UndefinedName(depth,FSComp.SR.undefinedNameValueConstructorNamespaceOrType,id,NoPredictions))) /// An identifier has resolved to a type name in an expression (corresponding to one or more TyconRefs). @@ -2076,7 +2079,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n success [(resInfo,Item.ImplicitOp(id, ref None),[])] else NoResultsOrUsefulErrors - let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueOfConstructor,id,[])) + let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueOfConstructor,id,NoPredictions)) let search = ctorSearch +++ implicitOpSearch +++ failingCase let resInfo,item,rest = ForceRaise (AtMostOneResult m search) ResolutionInfo.SendToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)); @@ -2133,7 +2136,7 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n | Result _ as res -> ForceRaise res | _ -> - let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueNamespaceTypeOrModule,id,[])) + let failingCase = raze (UndefinedName(0,FSComp.SR.undefinedNameValueNamespaceTypeOrModule,id,NoPredictions)) ForceRaise (AtMostOneResult m (search +++ moduleSearch AccessibleFromSomeFSharpCode +++ tyconSearch AccessibleFromSomeFSharpCode +++ failingCase)) ResolutionInfo.SendToSink(sink,ncenv,nenv,ItemOccurence.Use,ad,resInfo,ResultTyparChecker(fun () -> CheckAllTyparsInferrable ncenv.amap m item)); item,rest @@ -2200,7 +2203,7 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num | _ -> NoResultsOrUsefulErrors else NoResultsOrUsefulErrors - let res = AtMostOneResult id.idRange ( tyconSearch +++ ctorSearch +++ moduleSearch +++ raze (UndefinedName(depth,FSComp.SR.undefinedNameConstructorModuleOrNamespace,id,[]))) + let res = AtMostOneResult id.idRange ( tyconSearch +++ ctorSearch +++ moduleSearch +++ raze (UndefinedName(depth,FSComp.SR.undefinedNameConstructorModuleOrNamespace,id,NoPredictions))) res /// Used to report a warning condition for the use of upper-case identifiers in patterns @@ -2296,7 +2299,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo, genOk, m) match tcrefs with | tcref :: _ -> success tcref - | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,[])) + | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,NoPredictions)) | id::rest -> #if EXTENSIONTYPING // No dotting through type generators to get to a nested type! @@ -2310,7 +2313,7 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities (tcrefs, typeNameResInfo.DropStaticArgsInfo, genOk, m) match tcrefs with | _ :: _ -> tcrefs |> CollectResults (fun (resInfo,tcref) -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk (depth+1) m tcref rest) - | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,[])) + | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,NoPredictions)) AtMostOneResult m tyconSearch @@ -2322,6 +2325,15 @@ let ResolveTypeLongIdentInTyconRef sink (ncenv:NameResolver) nenv typeNameResInf CallNameResolutionSink sink (rangeOfLid lid,nenv,item,item,ItemOccurence.UseInType,nenv.eDisplayEnv,ad) tcref +/// Create an UndefinedName error with details +let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef) (id:Ident) = + let predictedPossibleTypes = + modref.ModuleOrNamespaceType.AllEntities + |> Seq.map (fun e -> e.DisplayName) + |> Set.ofSeq + + let errorTextF s = FSComp.SR.undefinedNameTypeIn(s,fullDisplayTextOfModRef modref) + UndefinedName(depth,errorTextF,id,predictedPossibleTypes) /// Resolve a long identifier representing a type in a module or namespace let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (typeNameResInfo: TypeNameResolutionInfo) ad genOk (resInfo:ResolutionInfo) depth m modref _mty (lid: Ident list) = @@ -2332,7 +2344,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, id.idText, typeNameResInfo.StaticArgsInfo, modref) match tcrefs with | _ :: _ -> tcrefs |> CollectResults (fun tcref -> success(resInfo,tcref)) - | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,[])) + | [] -> raze (SuggestTypeLongIdentInModuleOrNamespace depth modref id) | id::rest -> let m = unionRanges m id.idRange let modulSearch = @@ -2341,12 +2353,12 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty let resInfo = resInfo.AddEntity(id.idRange,submodref) ResolveTypeLongIdentInModuleOrNamespace ncenv typeNameResInfo ad genOk resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType rest | _ -> - raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespaceOrModule,id,[])) + raze (UndefinedName(depth,FSComp.SR.undefinedNameNamespaceOrModule,id,NoPredictions)) let tyconSearch = let tcrefs = LookupTypeNameInEntityMaybeHaveArity (ncenv.amap, id.idRange, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, modref) match tcrefs with | _ :: _ -> tcrefs |> CollectResults (fun tcref -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk (depth+1) m tcref rest) - | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,[])) + | [] -> raze (UndefinedName(depth,FSComp.SR.undefinedNameType,id,NoPredictions)) tyconSearch +++ modulSearch /// Resolve a long identifier representing a type @@ -2376,7 +2388,7 @@ let rec ResolveTypeLongIdentPrim (ncenv:NameResolver) fullyQualified m nenv ad ( //CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities tcref rest typeNameResInfo m; success(ResolutionInfo.Empty,tcref) | [] -> - raze (UndefinedName(0,FSComp.SR.undefinedNameType,id,[])) + raze (UndefinedName(0,FSComp.SR.undefinedNameType,id,NoPredictions)) | id::rest -> let m = unionRanges m id.idRange @@ -2440,14 +2452,13 @@ let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:Re match lid with | id::rest -> let m = unionRanges m id.idRange - let error = raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,[])) // search for module-qualified names, e.g. { Microsoft.FSharp.Core.contents = 1 } let modulScopedFieldNames = match TryFindTypeWithRecdField modref id with | Some tycon when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef tycon) -> let showDeprecated = HasFSharpAttribute ncenv.g ncenv.g.attrib_RequireQualifiedAccessAttribute tycon.Attribs success(resInfo, FieldResolution(modref.RecdFieldRefInNestedTycon tycon id,showDeprecated), rest) - | _ -> error + | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoPredictions)) // search for type-qualified names, e.g. { Microsoft.FSharp.Core.Ref.contents = 1 } let tyconSearch = match lid with @@ -2467,15 +2478,69 @@ let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:Re | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> let resInfo = resInfo.AddEntity(id.idRange,submodref) ResolveFieldInModuleOrNamespace ncenv nenv ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType rest - | _ -> - error - else error + | _ -> raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoPredictions)) + else raze (UndefinedName(depth,FSComp.SR.undefinedNameRecordLabelOrNamespace,id,NoPredictions)) AtMostOneResult m (OneResult modulScopedFieldNames +++ tyconSearch +++ OneResult modulSearch) | [] -> error(InternalError("ResolveFieldInModuleOrNamespace",m)) +/// Suggest other labels of the same record +let SuggestOtherLabelsOfSameRecordType (nenv:NameResolutionEnv) typeName (id:Ident) (allFields:Ident list) = + let labelsOfPossibleRecord = + nenv.eFieldLabels + |> Seq.filter (fun kv -> + kv.Value + |> List.map (fun r -> r.TyconRef.DisplayName) + |> List.exists ((=) typeName)) + |> Seq.map (fun kv -> kv.Key) + |> Set.ofSeq + + let givenFields = + allFields + |> List.map (fun fld -> fld.idText) + |> List.filter ((<>) id.idText) + |> Set.ofList + + let predictedLabels = Set.difference labelsOfPossibleRecord givenFields + let predictions = ErrorResolutionHints.FilterPredictions id.idText predictedLabels + + let errorCode,text = FSComp.SR.nrRecordDoesNotContainSuchLabel(typeName, id.idText) + errorCode,text + ErrorResolutionHints.FormatPredictions predictions + + +let SuggestLabelsOfRelatedRecords (nenv:NameResolutionEnv) (id:Ident) (allFields:Ident list) = + let predictedLabels = + let givenFields = allFields |> List.map (fun fld -> fld.idText) |> List.filter ((<>) id.idText) |> Set.ofList + if Set.isEmpty givenFields then + // return labels from all records + NameMap.domainL nenv.eFieldLabels |> Set.ofList |> Set.remove "contents" + else + let possibleRecords = + [for fld in givenFields do + match Map.tryFind fld nenv.eFieldLabels with + | None -> () + | Some recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) ] + |> List.groupBy fst + |> List.map (fun (r,fields) -> r, fields |> List.map snd |> Set.ofList) + |> List.filter (fun (_,fields) -> Set.isSubset givenFields fields) + |> List.map fst + |> Set.ofList + + let labelsOfPossibleRecords = + nenv.eFieldLabels + |> Seq.filter (fun kv -> + kv.Value + |> List.map (fun r -> r.TyconRef.DisplayName) + |> List.exists possibleRecords.Contains) + |> Seq.map (fun kv -> kv.Key) + |> Set.ofSeq + + Set.difference labelsOfPossibleRecords givenFields + + UndefinedName(0,FSComp.SR.undefinedNameRecordLabel, id, predictedLabels) + /// Resolve a long identifier representing a record field -let ResolveFieldPrim (ncenv:NameResolver) nenv ad typ (mp,id:Ident) = +let ResolveFieldPrim (ncenv:NameResolver) nenv ad typ (mp,id:Ident) allFields = let typeNameResInfo = TypeNameResolutionInfo.Default let g = ncenv.g let m = id.idRange @@ -2484,11 +2549,20 @@ let ResolveFieldPrim (ncenv:NameResolver) nenv ad typ (mp,id:Ident) = if isAppTy g typ then match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText,m,typ) with | Some (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] - | None -> error(Error(FSComp.SR.nrTypeDoesNotContainSuchField((NicePrint.minimalStringOfType nenv.eDisplayEnv typ), id.idText),m)) + | None -> + let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv typ + if isRecdTy g typ then + // record label doesn't belong to record type -> predict other labels of same record + error(Error(SuggestOtherLabelsOfSameRecordType nenv typeName id allFields,m)) + else + error(Error(FSComp.SR.nrTypeDoesNotContainSuchField(typeName, id.idText),m)) else let frefs = try Map.find id.idText nenv.eFieldLabels - with :? KeyNotFoundException -> error (UndefinedName(0,FSComp.SR.undefinedNameRecordLabel,id,NameMap.domainL nenv.eFieldLabels)) + with :? KeyNotFoundException -> + // record label is unknown -> predict related labels and give a hint to the user + error(SuggestLabelsOfRelatedRecords nenv id allFields) + // Eliminate duplicates arising from multiple 'open' frefs |> ListSet.setify (fun fref1 fref2 -> tyconRefEq g fref1.TyconRef fref2.TyconRef) @@ -2514,8 +2588,8 @@ let ResolveFieldPrim (ncenv:NameResolver) nenv ad typ (mp,id:Ident) = if nonNil rest then errorR(Error(FSComp.SR.nrInvalidFieldLabel(),(List.head rest).idRange)); [(resInfo,item)] -let ResolveField sink ncenv nenv ad typ (mp,id) = - let res = ResolveFieldPrim ncenv nenv ad typ (mp,id) +let ResolveField sink ncenv nenv ad typ (mp,id) allFields = + let res = ResolveFieldPrim ncenv nenv ad typ (mp,id) allFields // Register the results of any field paths "Module.Type" in "Module.Type.field" as a name resolution. (Note, the path resolution // info is only non-empty if there was a unique resolution of the field) for (resInfo,_rfref) in res do diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index ccad006c207..590f8a07016 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -366,7 +366,7 @@ val internal ResolveTypeLongIdentInTyconRef : TcResultsSink -> NameResol val internal ResolveTypeLongIdent : TcResultsSink -> NameResolver -> ItemOccurence -> FullyQualifiedFlag -> NameResolutionEnv -> AccessorDomain -> Ident list -> TypeNameResolutionStaticArgsInfo -> PermitDirectReferenceToGeneratedType -> ResultOrException /// Resolve a long identifier to a field -val internal ResolveField : TcResultsSink -> NameResolver -> NameResolutionEnv -> AccessorDomain -> TType -> Ident list * Ident -> FieldResolution list +val internal ResolveField : TcResultsSink -> NameResolver -> NameResolutionEnv -> AccessorDomain -> TType -> Ident list * Ident -> Ident list -> FieldResolution list /// Resolve a long identifier occurring in an expression position val internal ResolveExprLongIdent : TcResultsSink -> NameResolver -> range -> AccessorDomain -> NameResolutionEnv -> TypeNameResolutionInfo -> Ident list -> Item * Ident list diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ddcffab75a4..1229f890ee5 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1855,8 +1855,9 @@ let BuildFieldMap cenv env isPartial ty flds m = if isNil flds then invalidArg "flds" "BuildFieldMap" let frefSets = + let allFields = flds |> List.map (fun ((_,ident),_) -> ident) flds |> List.map (fun (fld,fldExpr) -> - let frefSet = ResolveField cenv.tcSink cenv.nameResolver env.eNameResEnv ad ty fld + let frefSet = ResolveField cenv.tcSink cenv.nameResolver env.eNameResEnv ad ty fld allFields fld,frefSet, fldExpr) let relevantTypeSets = frefSets |> List.map (fun (_,frefSet,_) -> frefSet |> List.choose (fun (FieldResolution(rfref,_)) -> Some rfref.TyconRef)) @@ -4146,7 +4147,7 @@ and TcTyparOrMeasurePar optKind cenv (env:TcEnv) newOk tpenv (Typar(id,_,_) as t match TryFindUnscopedTypar key tpenv with | Some res -> checkRes res | None -> - if newOk = NoNewTypars then error (UndefinedName(0,FSComp.SR.undefinedNameTypeParameter,id,[""])) + if newOk = NoNewTypars then error (UndefinedName(0,FSComp.SR.undefinedNameTypeParameter,id,NoPredictions)) // OK, this is an implicit declaration of a type parameter // The kind defaults to Type let tp' = NewTypar ((match optKind with None -> TyparKind.Type | Some kind -> kind), TyparRigidity.WarnIfNotRigid,tp,false,TyparDynamicReq.Yes,[],false,false) @@ -4858,7 +4859,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv,names,takenNames) ty pat match args with | SynConstructorArgs.Pats [] | SynConstructorArgs.NamePatPairs ([], _)-> TcPat warnOnUpperForId cenv env topValInfo vFlags (tpenv,names,takenNames) ty (mkSynPatVar vis id) - | _ -> error (UndefinedName(0,FSComp.SR.undefinedNamePatternDiscriminator,id,[])) + | _ -> error (UndefinedName(0,FSComp.SR.undefinedNamePatternDiscriminator,id,NoPredictions)) | Item.ActivePatternCase(APElemRef(apinfo,vref,idx)) as item -> let args = match args with SynConstructorArgs.Pats args -> args | _ -> failwith "impossible" diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index ad1f15cb268..e11004ab29b 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -384,7 +384,11 @@ assert (sizeof = 4) let unassignedTyparName = "?" -exception UndefinedName of int * (* error func that expects identifier name *)(string -> string) * Ident * string list +type Predictions = Set + +let NoPredictions = Set.empty + +exception UndefinedName of int * (* error func that expects identifier name *)(string -> string) * Ident * Predictions exception InternalUndefinedItemRef of (string * string * string -> int * string) * string * string * string let KeyTyconByDemangledNameAndArity nm (typars: _ list) x = diff --git a/src/utils/EditDistance.fs b/src/utils/EditDistance.fs new file mode 100644 index 00000000000..b1271f1b76e --- /dev/null +++ b/src/utils/EditDistance.fs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +/// Functions to compute the edit distance between two strings +module internal Internal.Utilities.EditDistance + +/// Computes the DamerauLevenstein distance +/// - read more at https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance +/// - Implementation taken from http://www.navision-blog.de/2008/11/01/damerau-levenshtein-distance-in-fsharp-part-ii/ +let private calcDamerauLevenshtein (a:string, b:string) = + let m = b.Length + 1 + let mutable lastLine = Array.init m (fun i -> i) + let mutable lastLastLine = Array.create m 0 + let mutable actLine = Array.create m 0 + + for i in [1..a.Length] do + actLine.[0] <- i + for j in [1..b.Length] do + let cost = if a.[i-1] = b.[j-1] then 0 else 1 + let deletion = lastLine.[j] + 1 + let insertion = actLine.[j-1] + 1 + let substitution = lastLine.[j-1] + cost + actLine.[j] <- + deletion + |> min insertion + |> min substitution + + if i > 1 && j > 1 then + if a.[i-1] = b.[j-2] && a.[i-2] = b.[j-1] then + let transposition = lastLastLine.[j-2] + cost + actLine.[j] <- min actLine.[j] transposition + + // swap lines + let temp = lastLastLine + lastLastLine <- lastLine + lastLine <- actLine + actLine <- temp + + lastLine.[b.Length] + +/// Calculates the edit distance between two strings. +/// The edit distance is a metric that allows to measure the amount of difference between two strings +/// and shows how many edit operations (insert, delete, substitution) are needed to transform one string into the other. +let CalcEditDistance(a:string, b:string) = + if a.Length > b.Length then + calcDamerauLevenshtein(a, b) + else + calcDamerauLevenshtein(b, a) \ No newline at end of file diff --git a/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Exception.bsl b/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Exception.bsl index d5c920e5f4b..4d1aed83136 100644 --- a/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Exception.bsl +++ b/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Exception.bsl @@ -7,7 +7,11 @@ EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS3033: EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS3033: The type provider 'Provider.EvilProviderWhereResolveTypeNameRaisesException' reported an error: deliberate error for testing purposes -EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined +EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined in 'FSharp.EvilProviderWhereResolveTypeNameRaisesException'. + +Maybe you want one of the following: + + TheType EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS3033: The type provider 'Provider.EvilProviderWhereResolveTypeNameRaisesException' reported an error: deliberate error for testing purposes @@ -17,4 +21,8 @@ EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS3033: EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS3033: The type provider 'Provider.EvilProviderWhereResolveTypeNameRaisesException' reported an error: deliberate error for testing purposes -EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined +EVIL_PROVIDER_ResolveTypeName_Exception.fsx(7,73,7,96): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined in 'FSharp.EvilProviderWhereResolveTypeNameRaisesException'. + +Maybe you want one of the following: + + TheType diff --git a/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Null.bsl b/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Null.bsl index 03beeb13246..b299ed7e461 100644 --- a/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Null.bsl +++ b/tests/fsharp/typeProviders/negTests/EVIL_PROVIDER_ResolveTypeName_Null.bsl @@ -1,4 +1,12 @@ -EVIL_PROVIDER_ResolveTypeName_Null.fsx(7,69,7,92): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined +EVIL_PROVIDER_ResolveTypeName_Null.fsx(7,69,7,92): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined in 'FSharp.EvilProviderWhereResolveTypeNameReturnsNull'. -EVIL_PROVIDER_ResolveTypeName_Null.fsx(7,69,7,92): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined +Maybe you want one of the following: + + TheType + +EVIL_PROVIDER_ResolveTypeName_Null.fsx(7,69,7,92): typecheck error FS0039: The type 'SomeNameThatDoesntExist' is not defined in 'FSharp.EvilProviderWhereResolveTypeNameReturnsNull'. + +Maybe you want one of the following: + + TheType diff --git a/tests/fsharp/typeProviders/negTests/neg1.bsl b/tests/fsharp/typeProviders/negTests/neg1.bsl index 07d2d8a4da1..64fd3e58aef 100644 --- a/tests/fsharp/typeProviders/negTests/neg1.bsl +++ b/tests/fsharp/typeProviders/negTests/neg1.bsl @@ -28,7 +28,15 @@ neg1.fsx(11,38,11,66): typecheck error FS3072: The type provider 'Provider.EvilP neg1.fsx(11,38,11,66): typecheck error FS3072: The type provider 'Provider.EvilProvider' reported an error: An exception occurred when accessing the 'Name' of a provided type: deliberate error for testing purposes -neg1.fsx(11,38,11,66): typecheck error FS0039: The type 'TypeWhereNameRaisesException' is not defined +neg1.fsx(11,38,11,66): typecheck error FS0039: The type 'TypeWhereNameRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsArrayTypeRaisesException + + TheType + + IsArrayTypeReturnsTrue neg1.fsx(11,38,11,66): typecheck error FS3072: The type provider 'Provider.EvilProvider' reported an error: An exception occurred when accessing the 'Name' of a provided type: deliberate error for testing purposes @@ -38,7 +46,15 @@ neg1.fsx(11,38,11,66): typecheck error FS3072: The type provider 'Provider.EvilP neg1.fsx(11,38,11,66): typecheck error FS3072: The type provider 'Provider.EvilProvider' reported an error: An exception occurred when accessing the 'Name' of a provided type: deliberate error for testing purposes -neg1.fsx(11,38,11,66): typecheck error FS0039: The type 'TypeWhereNameRaisesException' is not defined +neg1.fsx(11,38,11,66): typecheck error FS0039: The type 'TypeWhereNameRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsArrayTypeRaisesException + + TheType + + IsArrayTypeReturnsTrue neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'Name' of a provided type was null or empty. @@ -48,7 +64,15 @@ neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilP neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'Name' of a provided type was null or empty. -neg1.fsx(12,38,12,62): typecheck error FS0039: The type 'TypeWhereNameReturnsNull' is not defined +neg1.fsx(12,38,12,62): typecheck error FS0039: The type 'TypeWhereNameReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsArrayTypeReturnsTrue + + TheType + + IsArrayTypeRaisesException neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'Name' of a provided type was null or empty. @@ -58,7 +82,15 @@ neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilP neg1.fsx(12,38,12,62): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'Name' of a provided type was null or empty. -neg1.fsx(12,38,12,62): typecheck error FS0039: The type 'TypeWhereNameReturnsNull' is not defined +neg1.fsx(12,38,12,62): typecheck error FS0039: The type 'TypeWhereNameReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsArrayTypeReturnsTrue + + TheType + + IsArrayTypeRaisesException neg1.fsx(13,38,13,66): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.IsGenericTypeRaisesException' member 'IsGenericType': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -92,7 +124,19 @@ neg1.fsx(15,38,15,70): typecheck error FS3021: Unexpected exception from provide neg1.fsx(15,38,15,70): typecheck error FS3072: The type provider 'Provider.EvilProvider' reported an error: An exception occurred when accessing the 'FullName' of a provided type: deliberate error for testing purposes -neg1.fsx(15,38,15,70): typecheck error FS0039: The type 'TypeWhereFullNameRaisesException' is not defined +neg1.fsx(15,38,15,70): typecheck error FS0039: The type 'TypeWhereFullNameRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(15,38,15,70): typecheck error FS3021: Unexpected exception from provided type 'TypeWhereFullNameRaisesException' member 'FullName': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -110,7 +154,19 @@ neg1.fsx(15,38,15,70): typecheck error FS3021: Unexpected exception from provide neg1.fsx(15,38,15,70): typecheck error FS3072: The type provider 'Provider.EvilProvider' reported an error: An exception occurred when accessing the 'FullName' of a provided type: deliberate error for testing purposes -neg1.fsx(15,38,15,70): typecheck error FS0039: The type 'TypeWhereFullNameRaisesException' is not defined +neg1.fsx(15,38,15,70): typecheck error FS0039: The type 'TypeWhereFullNameRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(16,38,16,66): typecheck error FS3042: Unexpected 'null' return value from provided type 'TypeWhereFullNameReturnsNull' member 'FullName' @@ -128,7 +184,19 @@ neg1.fsx(16,38,16,66): typecheck error FS3042: Unexpected 'null' return value fr neg1.fsx(16,38,16,66): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'FullName' of a provided type was null or empty. -neg1.fsx(16,38,16,66): typecheck error FS0039: The type 'TypeWhereFullNameReturnsNull' is not defined +neg1.fsx(16,38,16,66): typecheck error FS0039: The type 'TypeWhereFullNameReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException neg1.fsx(16,38,16,66): typecheck error FS3042: Unexpected 'null' return value from provided type 'TypeWhereFullNameReturnsNull' member 'FullName' @@ -146,7 +214,19 @@ neg1.fsx(16,38,16,66): typecheck error FS3042: Unexpected 'null' return value fr neg1.fsx(16,38,16,66): typecheck error FS3073: The type provider 'Provider.EvilProvider' reported an error: The 'FullName' of a provided type was null or empty. -neg1.fsx(16,38,16,66): typecheck error FS0039: The type 'TypeWhereFullNameReturnsNull' is not defined +neg1.fsx(16,38,16,66): typecheck error FS0039: The type 'TypeWhereFullNameReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException neg1.fsx(17,38,17,71): typecheck error FS3021: Unexpected exception from provided type 'TypeWhereNamespaceRaisesException' member 'Namespace': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -184,9 +264,33 @@ neg1.fsx(17,38,17,71): typecheck error FS3004: The provided type 'FSharp.EvilPro neg1.fsx(17,38,17,71): typecheck error FS3033: The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(18,39,18,68): typecheck error FS0039: The type 'TypeWhereNamespaceReturnsNull' is not defined +neg1.fsx(18,39,18,68): typecheck error FS0039: The type 'TypeWhereNamespaceReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue -neg1.fsx(18,39,18,68): typecheck error FS0039: The type 'TypeWhereNamespaceReturnsNull' is not defined + IsArrayTypeRaisesException + + IsGenericTypeRaisesException + + TheType + +neg1.fsx(18,39,18,68): typecheck error FS0039: The type 'TypeWhereNamespaceReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + IsArrayTypeRaisesException + + IsGenericTypeRaisesException + + TheType neg1.fsx(19,39,19,67): typecheck error FS3021: Unexpected exception from provided type 'DeclaringTypeRaisesException' member 'DeclaringType': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -216,7 +320,19 @@ neg1.fsx(20,39,20,73): typecheck error FS3021: Unexpected exception from provide neg1.fsx(20,39,20,73): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsRaisesException' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(20,39,20,73): typecheck error FS0039: The type 'TypeWhereGetMethodsRaisesException' is not defined +neg1.fsx(20,39,20,73): typecheck error FS0039: The type 'TypeWhereGetMethodsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(20,39,20,73): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsRaisesException' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -226,7 +342,19 @@ neg1.fsx(20,39,20,73): typecheck error FS3021: Unexpected exception from provide neg1.fsx(20,39,20,73): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsRaisesException' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(20,39,20,73): typecheck error FS0039: The type 'TypeWhereGetMethodsRaisesException' is not defined +neg1.fsx(20,39,20,73): typecheck error FS0039: The type 'TypeWhereGetMethodsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsRaisesException' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -236,7 +364,19 @@ neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsRaisesException' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(21,39,21,72): typecheck error FS0039: The type 'TypeWhereGetEventsRaisesException' is not defined +neg1.fsx(21,39,21,72): typecheck error FS0039: The type 'TypeWhereGetEventsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsRaisesException' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -246,7 +386,19 @@ neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(21,39,21,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsRaisesException' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(21,39,21,72): typecheck error FS0039: The type 'TypeWhereGetEventsRaisesException' is not defined +neg1.fsx(21,39,21,72): typecheck error FS0039: The type 'TypeWhereGetEventsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsRaisesException' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -256,7 +408,19 @@ neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsRaisesException' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(22,39,22,72): typecheck error FS0039: The type 'TypeWhereGetFieldsRaisesException' is not defined +neg1.fsx(22,39,22,72): typecheck error FS0039: The type 'TypeWhereGetFieldsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsRaisesException' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -266,7 +430,19 @@ neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(22,39,22,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsRaisesException' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(22,39,22,72): typecheck error FS0039: The type 'TypeWhereGetFieldsRaisesException' is not defined +neg1.fsx(22,39,22,72): typecheck error FS0039: The type 'TypeWhereGetFieldsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesRaisesException' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -276,7 +452,19 @@ neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provide neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesRaisesException' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(23,39,23,76): typecheck error FS0039: The type 'TypeWhereGetPropertiesRaisesException' is not defined +neg1.fsx(23,39,23,76): typecheck error FS0039: The type 'TypeWhereGetPropertiesRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesRaisesException' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -286,7 +474,19 @@ neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provide neg1.fsx(23,39,23,76): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesRaisesException' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(23,39,23,76): typecheck error FS0039: The type 'TypeWhereGetPropertiesRaisesException' is not defined +neg1.fsx(23,39,23,76): typecheck error FS0039: The type 'TypeWhereGetPropertiesRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TheType neg1.fsx(24,39,24,77): typecheck error FS3004: The provided type 'FSharp.EvilProvider.TypeWhereGetNestedTypesRaisesException' has member 'Boo' which has declaring type 'FSharp.EvilProvider.TheType'. Expected declaring type to be the same as provided type. @@ -300,7 +500,19 @@ neg1.fsx(25,39,25,78): typecheck error FS3021: Unexpected exception from provide neg1.fsx(25,39,25,78): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsRaisesException' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(25,39,25,78): typecheck error FS0039: The type 'TypeWhereGetConstructorsRaisesException' is not defined +neg1.fsx(25,39,25,78): typecheck error FS0039: The type 'TypeWhereGetConstructorsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue neg1.fsx(25,39,25,78): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsRaisesException' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes @@ -310,7 +522,19 @@ neg1.fsx(25,39,25,78): typecheck error FS3021: Unexpected exception from provide neg1.fsx(25,39,25,78): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsRaisesException' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: deliberate error for testing purposes -neg1.fsx(25,39,25,78): typecheck error FS0039: The type 'TypeWhereGetConstructorsRaisesException' is not defined +neg1.fsx(25,39,25,78): typecheck error FS0039: The type 'TypeWhereGetConstructorsRaisesException' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsReturnsNull' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetMethods' @@ -320,7 +544,19 @@ neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provide neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsReturnsNull' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetMethods' -neg1.fsx(27,39,27,69): typecheck error FS0039: The type 'TypeWhereGetMethodsReturnsNull' is not defined +neg1.fsx(27,39,27,69): typecheck error FS0039: The type 'TypeWhereGetMethodsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + TheType neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsReturnsNull' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetMethods' @@ -330,7 +566,19 @@ neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provide neg1.fsx(27,39,27,69): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetMethodsReturnsNull' member 'GetMethods': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetMethods' -neg1.fsx(27,39,27,69): typecheck error FS0039: The type 'TypeWhereGetMethodsReturnsNull' is not defined +neg1.fsx(27,39,27,69): typecheck error FS0039: The type 'TypeWhereGetMethodsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + TheType neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsReturnsNull' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetEvents' @@ -340,7 +588,19 @@ neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provide neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsReturnsNull' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetEvents' -neg1.fsx(28,39,28,68): typecheck error FS0039: The type 'TypeWhereGetEventsReturnsNull' is not defined +neg1.fsx(28,39,28,68): typecheck error FS0039: The type 'TypeWhereGetEventsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + TheType neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsReturnsNull' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetEvents' @@ -350,7 +610,19 @@ neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provide neg1.fsx(28,39,28,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetEventsReturnsNull' member 'GetEvents': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetEvents' -neg1.fsx(28,39,28,68): typecheck error FS0039: The type 'TypeWhereGetEventsReturnsNull' is not defined +neg1.fsx(28,39,28,68): typecheck error FS0039: The type 'TypeWhereGetEventsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeRaisesException + + TheType neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsReturnsNull' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetFields' @@ -360,7 +632,19 @@ neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provide neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsReturnsNull' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetFields' -neg1.fsx(29,39,29,68): typecheck error FS0039: The type 'TypeWhereGetFieldsReturnsNull' is not defined +neg1.fsx(29,39,29,68): typecheck error FS0039: The type 'TypeWhereGetFieldsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeRaisesException neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsReturnsNull' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetFields' @@ -370,7 +654,19 @@ neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provide neg1.fsx(29,39,29,68): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetFieldsReturnsNull' member 'GetFields': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetFields' -neg1.fsx(29,39,29,68): typecheck error FS0039: The type 'TypeWhereGetFieldsReturnsNull' is not defined +neg1.fsx(29,39,29,68): typecheck error FS0039: The type 'TypeWhereGetFieldsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsArrayTypeRaisesException + + IsGenericTypeRaisesException neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesReturnsNull' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetProperties' @@ -380,7 +676,19 @@ neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesReturnsNull' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetProperties' -neg1.fsx(30,39,30,72): typecheck error FS0039: The type 'TypeWhereGetPropertiesReturnsNull' is not defined +neg1.fsx(30,39,30,72): typecheck error FS0039: The type 'TypeWhereGetPropertiesReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsArrayTypeReturnsTrue + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesReturnsNull' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetProperties' @@ -390,7 +698,19 @@ neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provide neg1.fsx(30,39,30,72): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetPropertiesReturnsNull' member 'GetProperties': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetProperties' -neg1.fsx(30,39,30,72): typecheck error FS0039: The type 'TypeWhereGetPropertiesReturnsNull' is not defined +neg1.fsx(30,39,30,72): typecheck error FS0039: The type 'TypeWhereGetPropertiesReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + IsGenericTypeReturnsTrue + + TypeWhereGetNestedTypesRaisesException + + IsArrayTypeReturnsTrue + + IsGenericTypeRaisesException + + IsArrayTypeRaisesException neg1.fsx(31,39,31,73): typecheck error FS3004: The provided type 'FSharp.EvilProvider.TypeWhereGetNestedTypesReturnsNull' has member 'Boo' which has declaring type 'FSharp.EvilProvider.TheType'. Expected declaring type to be the same as provided type. @@ -404,7 +724,19 @@ neg1.fsx(32,39,32,74): typecheck error FS3021: Unexpected exception from provide neg1.fsx(32,39,32,74): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsReturnsNull' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetConstructors' -neg1.fsx(32,39,32,74): typecheck error FS0039: The type 'TypeWhereGetConstructorsReturnsNull' is not defined +neg1.fsx(32,39,32,74): typecheck error FS0039: The type 'TypeWhereGetConstructorsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + TypeWhereGetNestedTypesReturnsNull + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + IsGenericTypeRaisesException neg1.fsx(32,39,32,74): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsReturnsNull' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetConstructors' @@ -414,7 +746,19 @@ neg1.fsx(32,39,32,74): typecheck error FS3021: Unexpected exception from provide neg1.fsx(32,39,32,74): typecheck error FS3021: Unexpected exception from provided type 'FSharp.EvilProvider.TypeWhereGetConstructorsReturnsNull' member 'GetConstructors': The type provider 'Provider.EvilProvider' reported an error: The type provider returned 'null', which is not a valid return value from 'GetConstructors' -neg1.fsx(32,39,32,74): typecheck error FS0039: The type 'TypeWhereGetConstructorsReturnsNull' is not defined +neg1.fsx(32,39,32,74): typecheck error FS0039: The type 'TypeWhereGetConstructorsReturnsNull' is not defined in 'FSharp.EvilProvider'. + +Maybe you want one of the following: + + TypeWhereGetNestedTypesReturnsNull + + TypeWhereGetNestedTypesRaisesException + + IsGenericTypeReturnsTrue + + IsArrayTypeReturnsTrue + + IsGenericTypeRaisesException neg1.fsx(33,39,33,72): typecheck error FS3042: Unexpected 'null' return value from provided type 'FSharp.EvilProvider.TypeWhereGetInterfacesReturnsNull' member 'GetInterfaces' diff --git a/tests/fsharp/typecheck/sigs/neg07.bsl b/tests/fsharp/typecheck/sigs/neg07.bsl index 4551e7a9487..a040fd5bc56 100644 --- a/tests/fsharp/typecheck/sigs/neg07.bsl +++ b/tests/fsharp/typecheck/sigs/neg07.bsl @@ -19,9 +19,9 @@ neg07.fs(36,11,36,21): typecheck error FS0049: Uppercase variable identifiers sh neg07.fs(36,11,36,21): typecheck error FS0026: This rule will never be matched -neg07.fs(46,15,46,27): typecheck error FS0039: The record label 'RecordLabel1' is not defined +neg07.fs(46,15,46,27): typecheck error FS0039: The record label 'RecordLabel1' is not defined. -neg07.fs(47,19,47,31): typecheck error FS0039: The record label 'RecordLabel1' is not defined +neg07.fs(47,19,47,31): typecheck error FS0039: The record label 'RecordLabel1' is not defined. neg07.fs(57,10,57,17): typecheck error FS1196: The 'UseNullAsTrueValue' attribute flag may only be used with union types that have one nullary case and at least one non-nullary case diff --git a/tests/fsharp/typecheck/sigs/neg17.bsl b/tests/fsharp/typecheck/sigs/neg17.bsl index 66590123741..a74ee616628 100644 --- a/tests/fsharp/typecheck/sigs/neg17.bsl +++ b/tests/fsharp/typecheck/sigs/neg17.bsl @@ -27,10 +27,34 @@ neg17b.fs(29,31,29,61): typecheck error FS0072: Lookup on object of indeterminat neg17b.fs(30,31,30,84): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. -neg17b.fs(32,24,32,50): typecheck error FS0039: The type 'RecordTypeWithPrivateField' is not defined +neg17b.fs(32,24,32,50): typecheck error FS0039: The type 'RecordTypeWithPrivateField' is not defined in 'Neg17.M'. + +Maybe you want one of the following: + + RecordTypeWithPrivateRepresentation + + UnionTypeWithPrivateRepresentation + + InternalRecordType + + PrivateRecordType + + PrivateUnionType neg17b.fs(43,30,43,60): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. -neg17b.fs(45,23,45,49): typecheck error FS0039: The type 'RecordTypeWithPrivateField' is not defined +neg17b.fs(45,23,45,49): typecheck error FS0039: The type 'RecordTypeWithPrivateField' is not defined in 'Neg17.M'. + +Maybe you want one of the following: + + RecordTypeWithPrivateRepresentation + + UnionTypeWithPrivateRepresentation + + InternalRecordType + + PrivateRecordType + + PrivateUnionType neg17b.fs(54,20,54,50): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. diff --git a/tests/fsharpqa/Source/Conformance/InferenceProcedures/NameResolution/RequireQualifiedAccess/E_OnRecord.fs b/tests/fsharpqa/Source/Conformance/InferenceProcedures/NameResolution/RequireQualifiedAccess/E_OnRecord.fs index 85282204720..fa7973cdf0d 100644 --- a/tests/fsharpqa/Source/Conformance/InferenceProcedures/NameResolution/RequireQualifiedAccess/E_OnRecord.fs +++ b/tests/fsharpqa/Source/Conformance/InferenceProcedures/NameResolution/RequireQualifiedAccess/E_OnRecord.fs @@ -2,8 +2,8 @@ // Verify error when not fully qualifying a record field when it // has the RequireQualifiedAccess attribute. -//The record label 'Field1' is not defined$ -//The record label 'Field1' is not defined$ +//The record label 'Field1' is not defined\.$ +//The record label 'Field1' is not defined\.$ [] type R = { Field1 : int; Field2 : string } diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/E_RecTypesNotMatch01.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/E_RecTypesNotMatch01.fs index fb7527d54ce..9297cb34285 100644 --- a/tests/fsharpqa/Source/Conformance/PatternMatching/Record/E_RecTypesNotMatch01.fs +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Record/E_RecTypesNotMatch01.fs @@ -1,7 +1,7 @@ // #Regression #Conformance #PatternMatching #Records // Verify error if two record types in a pattern match don't match // Verify error if type of a record field is incorrect. -//The type 'R1' does not contain a field 'A' +//The record type 'R1' does not contain a label 'A'\. type R1 = { X : int; Y : int } diff --git a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_LetBinding01.fs b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_LetBinding01.fs index 63af47e7f92..86fd6bc7b85 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_LetBinding01.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_LetBinding01.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3175 -//The type 'matrix' is not defined$ +//The type 'matrix' is not defined in 'Microsoft.FSharp.Math'\.$ let f ( m : Math.matrix) = 12 diff --git a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_class01.fs b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_class01.fs index afa10b64e17..806c444041d 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_class01.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_class01.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3175 -//The type 'matrix' is not defined$ +//The type 'matrix' is not defined in 'Microsoft.FSharp.Math'\.$ type C = class diff --git a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_interface01.fs b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_interface01.fs index eb6df520402..59b2c81ed70 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_interface01.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_interface01.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3175 -//The type 'matrix' is not defined$ -//The type 'matrix' is not defined$ +//The type 'matrix' is not defined in 'Microsoft.FSharp.Math'\.$ +//The type 'matrix' is not defined in 'Microsoft.FSharp.Math'\.$ type I = interface diff --git a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_struct01.fs b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_struct01.fs index e9938175d2a..b7b48288559 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/E_matrix_struct01.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/E_matrix_struct01.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3175 -//The type 'matrix' is not defined$ +//The type 'matrix' is not defined in 'Microsoft.FSharp.Math'\.$ type S = struct val a : Math.matrix diff --git a/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_FieldNotInRecord.fs b/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_FieldNotInRecord.fs new file mode 100644 index 00000000000..4a5361f8f67 --- /dev/null +++ b/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_FieldNotInRecord.fs @@ -0,0 +1,13 @@ +// #ErrorMessages #NameResolution +//The record type 'F' does not contain a label 'Wall'\. + +type A = { Hello:string; World:string } +type B = { Size:int; Height:int } +type C = { Wheels:int } +type D = { Size:int; Height:int; Walls:int } +type E = { Unknown:string } +type F = { Wallis:int; Size:int; Height:int; } + +let r:F = { Size=3; Height=4; Wall=1 } + +exit 0 diff --git a/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_RecordFieldProposal.fs b/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_RecordFieldProposal.fs new file mode 100644 index 00000000000..ca73d5c1e54 --- /dev/null +++ b/tests/fsharpqa/Source/ErrorMessages/NameResolution/E_RecordFieldProposal.fs @@ -0,0 +1,13 @@ +// #ErrorMessages #NameResolution +//The record label 'Wall' is not defined\. + +type A = { Hello:string; World:string } +type B = { Size:int; Height:int } +type C = { Wheels:int } +type D = { Size:int; Height:int; Walls:int } +type E = { Unknown:string } +type F = { Wallis:int; Size:int; Height:int; } + +let r = { Size=3; Height=4; Wall=1 } + +exit 0 diff --git a/tests/fsharpqa/Source/ErrorMessages/NameResolution/env.lst b/tests/fsharpqa/Source/ErrorMessages/NameResolution/env.lst new file mode 100644 index 00000000000..435fb96c42b --- /dev/null +++ b/tests/fsharpqa/Source/ErrorMessages/NameResolution/env.lst @@ -0,0 +1,2 @@ + SOURCE=E_RecordFieldProposal.fs # E_RecordFieldProposal + SOURCE=E_FieldNotInRecord.fs # E_FieldNotInRecord \ No newline at end of file diff --git a/tests/fsharpqa/Source/test.lst b/tests/fsharpqa/Source/test.lst index 5072d02cac3..b9391dc0801 100644 --- a/tests/fsharpqa/Source/test.lst +++ b/tests/fsharpqa/Source/test.lst @@ -258,6 +258,7 @@ Misc01 Libraries\Core\Operators Misc01 Libraries\Core\Reflection Misc01 Libraries\Core\Unchecked Misc01 Warnings +Misc01 ErrorMessages\NameResolution Misc02 Libraries\Portable Misc02 Misc From 8d898878acde1bd0489cdb49d6a074c0125d85cd Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Thu, 12 May 2016 11:43:01 +0200 Subject: [PATCH 161/334] Improve error reporting: Recursive async functions - fixes #1170 --- src/fsharp/CompileOps.fs | 14 +++- src/fsharp/ConstraintSolver.fs | 68 ++++++++++--------- src/fsharp/ConstraintSolver.fsi | 8 ++- src/fsharp/FSComp.txt | 2 + src/fsharp/FSStrings.resx | 2 +- src/fsharp/TypeChecker.fs | 22 +++--- .../Diagnostics/async/MissingBangForLoop01.fs | 2 +- .../Diagnostics/async/MissingBangForLoop02.fs | 2 +- .../Warnings/ReturnInsteadOfReturnBang.fs | 6 ++ .../Warnings/YieldInsteadOfYieldBang.fs | 9 +++ tests/fsharpqa/Source/Warnings/env.lst | 2 + 11 files changed, 90 insertions(+), 47 deletions(-) create mode 100644 tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs create mode 100644 tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0d8ea5a3fa5..7eeff03e7a6 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -200,7 +200,7 @@ let GetRangeOfError(err:PhasedError) = | NonVirtualAugmentationOnNullValuedType(m) | NonRigidTypar(_,_,_,_,_,m) | ConstraintSolverTupleDiffLengths(_,_,_,m,_) - | ConstraintSolverInfiniteTypes(_,_,_,m,_) + | ConstraintSolverInfiniteTypes(_,_,_,_,m,_) | ConstraintSolverMissingConstraint(_,_,_,m,_) | ConstraintSolverTypesNotInEqualityRelation(_,_,_,m,_) | ConstraintSolverError(_,m,_) @@ -602,10 +602,18 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = os.Append(ConstraintSolverTupleDiffLengthsE().Format tl1.Length tl2.Length) |> ignore (if m.StartLine <> m2.StartLine then os.Append(SeeAlsoE().Format (stringOfRange m)) |> ignore) - | ConstraintSolverInfiniteTypes(denv,t1,t2,m,m2) -> - // REVIEW: consider if we need to show _cxs (the type parameter constrants) + | ConstraintSolverInfiniteTypes(contextInfo,denv,t1,t2,m,m2) -> + // REVIEW: consider if we need to show _cxs (the type parameter constraints) let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv t1 t2 os.Append(ConstraintSolverInfiniteTypesE().Format t1 t2) |> ignore + + match contextInfo with + | ContextInfo.ReturnInComputationExpression -> + os.Append(" " + FSComp.SR.returnUsedInsteadOfReturnBang()) |> ignore + | ContextInfo.YieldInComputationExpression -> + os.Append(" " + FSComp.SR.yieldUsedInsteadOfYieldBang()) |> ignore + | _ -> () + (if m.StartLine <> m2.StartLine then os.Append(SeeAlsoE().Format (stringOfRange m)) |> ignore ) | ConstraintSolverMissingConstraint(denv,tpr,tpc,m,m2) -> diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 728ed9de68e..cfe592e1c27 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -128,13 +128,17 @@ type ContextInfo = | RecordFields /// The type equation comes from the verification of a tuple in record fields. | TupleInRecordFields +/// The type equation comes from a return in a computation expression. +| ReturnInComputationExpression +/// The type equation comes from a yield in a computation expression. +| YieldInComputationExpression /// The type equation comes from a runtime type test. | RuntimeTypeTest of bool /// The type equation comes from an downcast where a upcast could be used. | DowncastUsedInsteadOfUpcast of bool exception ConstraintSolverTupleDiffLengths of DisplayEnv * TType list * TType list * range * range -exception ConstraintSolverInfiniteTypes of DisplayEnv * TType * TType * range * range +exception ConstraintSolverInfiniteTypes of ContextInfo * DisplayEnv * TType * TType * range * range exception ConstraintSolverTypesNotInEqualityRelation of DisplayEnv * TType * TType * range * range exception ConstraintSolverTypesNotInSubsumptionRelation of DisplayEnv * TType * TType * range * range exception ConstraintSolverMissingConstraint of DisplayEnv * Tast.Typar * Tast.TyparConstraint * range * range @@ -177,6 +181,7 @@ type ConstraintSolverState = type ConstraintSolverEnv = { SolverState: ConstraintSolverState; + eContextInfo: ContextInfo MatchingOnly : bool m: range; EquivEnv: TypeEquivEnv; @@ -186,9 +191,10 @@ type ConstraintSolverEnv = member csenv.g = csenv.SolverState.g member csenv.amap = csenv.SolverState.amap -let MakeConstraintSolverEnv css m denv = +let MakeConstraintSolverEnv contextInfo css m denv = { SolverState=css; m=m; + eContextInfo = contextInfo // Indicates that when unifiying ty1 = ty2, only type variables in ty1 may be solved MatchingOnly=false; EquivEnv=TypeEquivEnv.Empty; @@ -655,8 +661,8 @@ let rec SolveTyparEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 trace ty1 ty = // The types may still be equivalent due to abbreviations, which we are trying not to eliminate if typeEquiv csenv.g ty1 ty then CompleteD else - // The famous 'occursCheck' check to catch things like 'a = list<'a> - if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(denv,ty1,ty,m,m2)) else + // The famous 'occursCheck' check to catch "infinite types" like 'a = list<'a> - see also https://github.com/Microsoft/visualfsharp/issues/1170 + if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo,denv,ty1,ty,m,m2)) else // Note: warn _and_ continue! CheckWarnIfRigid csenv ty1 r ty ++ (fun () -> @@ -1926,16 +1932,16 @@ and private DefinitelyEquiv (csenv:ConstraintSolverEnv) isConstraint calledArg ( // Assert a subtype constraint, and wrap an ErrorsFromAddingSubsumptionConstraint error around any failure // to allow us to report the outer types involved in the constraint -and private SolveTypSubsumesTypWithReport contextInfo (csenv:ConstraintSolverEnv) ndeep m trace ty1 ty2 = +and private SolveTypSubsumesTypWithReport (csenv:ConstraintSolverEnv) ndeep m trace ty1 ty2 = TryD (fun () -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m trace ty1 ty2) (fun res -> - match contextInfo with + match csenv.eContextInfo with | ContextInfo.RuntimeTypeTest isOperator -> // test if we can cast other way around match CollectThenUndo (fun newTrace -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m (OptionalTrace.WithTrace newTrace) ty2 ty1) with | OkResult _ -> ErrorD (ErrorsFromAddingSubsumptionConstraint(csenv.g,csenv.DisplayEnv,ty1,ty2,res,ContextInfo.DowncastUsedInsteadOfUpcast isOperator,m)) | _ -> ErrorD (ErrorsFromAddingSubsumptionConstraint(csenv.g,csenv.DisplayEnv,ty1,ty2,res,ContextInfo.NoContext,m)) - | _ -> ErrorD (ErrorsFromAddingSubsumptionConstraint(csenv.g,csenv.DisplayEnv,ty1,ty2,res,contextInfo,m))) + | _ -> ErrorD (ErrorsFromAddingSubsumptionConstraint(csenv.g,csenv.DisplayEnv,ty1,ty2,res,csenv.eContextInfo,m))) and private SolveTypEqualsTypWithReport contextInfo (csenv:ConstraintSolverEnv) ndeep m trace ty1 ty2 = TryD (fun () -> SolveTypEqualsTypKeepAbbrevs csenv ndeep m trace ty1 ty2) @@ -1951,8 +1957,8 @@ and ArgsMustSubsumeOrConvert let g = csenv.g let m = callerArg.Range - let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg - SolveTypSubsumesTypWithReport ContextInfo.NoContext csenv ndeep m trace calledArgTy callerArg.Type ++ (fun () -> + let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg + SolveTypSubsumesTypWithReport csenv ndeep m trace calledArgTy callerArg.Type ++ (fun () -> if calledArg.IsParamArray && isArray1DTy g calledArgTy && not (isArray1DTy g callerArg.Type) then @@ -1968,10 +1974,10 @@ and MustUnifyInsideUndo csenv ndeep trace ty1 ty2 = and ArgsMustSubsumeOrConvertInsideUndo (csenv:ConstraintSolverEnv) ndeep trace isConstraint calledArg (CallerArg(callerArgTy,m,_,_) as callerArg) = let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg - SolveTypSubsumesTypWithReport ContextInfo.NoContext csenv ndeep m (WithTrace trace) calledArgTy callerArgTy + SolveTypSubsumesTypWithReport csenv ndeep m (WithTrace trace) calledArgTy callerArgTy and TypesMustSubsumeOrConvertInsideUndo (csenv:ConstraintSolverEnv) ndeep trace m calledArgTy callerArgTy = - SolveTypSubsumesTypWithReport ContextInfo.NoContext csenv ndeep m trace calledArgTy callerArgTy + SolveTypSubsumesTypWithReport csenv ndeep m trace calledArgTy callerArgTy and ArgsEquivInsideUndo (csenv:ConstraintSolverEnv) _trace isConstraint calledArg (CallerArg(callerArgTy,m,_,_) as callerArg) = let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg @@ -2418,7 +2424,7 @@ let EliminateConstraintsForGeneralizedTypars csenv trace (generalizedTypars: Typ //------------------------------------------------------------------------- let AddCxTypeEqualsType contextInfo denv css m ty1 ty2 = - SolveTypEqualsTypWithReport contextInfo (MakeConstraintSolverEnv css m denv) 0 m NoTrace ty1 ty2 + SolveTypEqualsTypWithReport contextInfo (MakeConstraintSolverEnv contextInfo css m denv) 0 m NoTrace ty1 ty2 |> RaiseOperationResult let UndoIfFailed f = @@ -2435,72 +2441,72 @@ let UndoIfFailed f = ReportWarnings warns; true let AddCxTypeEqualsTypeUndoIfFailed denv css m ty1 ty2 = - UndoIfFailed (fun trace -> SolveTypEqualsTypKeepAbbrevs (MakeConstraintSolverEnv css m denv) 0 m (WithTrace(trace)) ty1 ty2) + UndoIfFailed (fun trace -> SolveTypEqualsTypKeepAbbrevs (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m (WithTrace(trace)) ty1 ty2) let AddCxTypeEqualsTypeMatchingOnlyUndoIfFailed denv css m ty1 ty2 = - let csenv = MakeConstraintSolverEnv css m denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv let csenv = { csenv with MatchingOnly = true } UndoIfFailed (fun trace -> SolveTypEqualsTypKeepAbbrevs csenv 0 m (WithTrace(trace)) ty1 ty2) let AddCxTypeMustSubsumeTypeUndoIfFailed denv css m ty1 ty2 = - UndoIfFailed (fun trace -> SolveTypSubsumesTypKeepAbbrevs (MakeConstraintSolverEnv css m denv) 0 m (WithTrace(trace)) ty1 ty2) + UndoIfFailed (fun trace -> SolveTypSubsumesTypKeepAbbrevs (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m (WithTrace(trace)) ty1 ty2) let AddCxTypeMustSubsumeTypeMatchingOnlyUndoIfFailed denv css m ty1 ty2 = - let csenv = MakeConstraintSolverEnv css m denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv let csenv = { csenv with MatchingOnly = true } UndoIfFailed (fun trace -> SolveTypSubsumesTypKeepAbbrevs csenv 0 m (WithTrace(trace)) ty1 ty2) let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 = - SolveTypSubsumesTypWithReport contextInfo (MakeConstraintSolverEnv css m denv) 0 m trace ty1 ty2 + SolveTypSubsumesTypWithReport (MakeConstraintSolverEnv contextInfo css m denv) 0 m trace ty1 ty2 |> RaiseOperationResult let AddCxMethodConstraint denv css m trace traitInfo = - TryD (fun () -> SolveMemberConstraint (MakeConstraintSolverEnv css m denv) false 0 m trace traitInfo ++ (fun _ -> CompleteD)) + TryD (fun () -> SolveMemberConstraint (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) false 0 m trace traitInfo ++ (fun _ -> CompleteD)) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeMustSupportNull denv css m trace ty = - TryD (fun () -> SolveTypSupportsNull (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypSupportsNull (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeMustSupportComparison denv css m trace ty = - TryD (fun () -> SolveTypeSupportsComparison (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypeSupportsComparison (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeMustSupportEquality denv css m trace ty = - TryD (fun () -> SolveTypSupportsEquality (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypSupportsEquality (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeMustSupportDefaultCtor denv css m trace ty = - TryD (fun () -> SolveTypRequiresDefaultConstructor (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypRequiresDefaultConstructor (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeIsReferenceType denv css m trace ty = - TryD (fun () -> SolveTypIsReferenceType (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypIsReferenceType (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeIsValueType denv css m trace ty = - TryD (fun () -> SolveTypIsNonNullableValueType (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypIsNonNullableValueType (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeIsUnmanaged denv css m trace ty = - TryD (fun () -> SolveTypIsUnmanaged (MakeConstraintSolverEnv css m denv) 0 m trace ty) + TryD (fun () -> SolveTypIsUnmanaged (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeIsEnum denv css m trace ty underlying = - TryD (fun () -> SolveTypIsEnum (MakeConstraintSolverEnv css m denv) 0 m trace ty underlying) + TryD (fun () -> SolveTypIsEnum (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty underlying) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult let AddCxTypeIsDelegate denv css m trace ty aty bty = - TryD (fun () -> SolveTypIsDelegate (MakeConstraintSolverEnv css m denv) 0 m trace ty aty bty) + TryD (fun () -> SolveTypIsDelegate (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m trace ty aty bty) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult @@ -2509,7 +2515,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait TcVal = tcVal ExtraCxs=HashMultiMap(10, HashIdentity.Structural) InfoReader=new InfoReader(g,amap) } - let csenv = MakeConstraintSolverEnv css m (DisplayEnv.Empty g) + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) SolveMemberConstraint csenv true 0 m NoTrace traitInfo ++ (fun _res -> let sln = match traitInfo.Solution with @@ -2587,7 +2593,7 @@ let ChooseTyparSolutionAndSolve css denv tp = let g = css.g let amap = css.amap let max,m = ChooseTyparSolutionAndRange g amap tp - let csenv = MakeConstraintSolverEnv css m denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m denv TryD (fun () -> SolveTyparEqualsTyp csenv 0 m NoTrace (mkTyparTy tp) max) (fun err -> ErrorD(ErrorFromApplyingDefault(g,denv,tp,max,err,m))) |> RaiseOperationResult @@ -2597,7 +2603,7 @@ let ChooseTyparSolutionAndSolve css denv tp = let CheckDeclaredTypars denv css m typars1 typars2 = TryD (fun () -> CollectThenUndo (fun trace -> - SolveTypEqualsTypEqns (MakeConstraintSolverEnv css m denv) 0 m (WithTrace(trace)) + SolveTypEqualsTypEqns (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) 0 m (WithTrace(trace)) (List.map mkTyparTy typars1) (List.map mkTyparTy typars2))) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) @@ -2615,7 +2621,7 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy = TcVal = (fun _ -> failwith "should not be called") ExtraCxs=HashMultiMap(10, HashIdentity.Structural) InfoReader=new InfoReader(g,amap) } - let csenv = MakeConstraintSolverEnv css m (DisplayEnv.Empty g) + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) let minst = FreshenMethInfo m minfo match minfo.GetObjArgTypes(amap, m, minst) with | [reqdObjTy] -> diff --git a/src/fsharp/ConstraintSolver.fsi b/src/fsharp/ConstraintSolver.fsi index a0e404983e9..63238ec1c49 100644 --- a/src/fsharp/ConstraintSolver.fsi +++ b/src/fsharp/ConstraintSolver.fsi @@ -60,13 +60,17 @@ type ContextInfo = | RecordFields /// The type equation comes from the verification of a tuple in record fields. | TupleInRecordFields +/// The type equation comes from a return in a computation expression. +| ReturnInComputationExpression +/// The type equation comes from a yield in a computation expression. +| YieldInComputationExpression /// The type equation comes from a runtime type test. | RuntimeTypeTest of bool /// The type equation comes from an downcast where a upcast could be used. | DowncastUsedInsteadOfUpcast of bool exception ConstraintSolverTupleDiffLengths of DisplayEnv * TType list * TType list * range * range -exception ConstraintSolverInfiniteTypes of DisplayEnv * TType * TType * range * range +exception ConstraintSolverInfiniteTypes of ContextInfo * DisplayEnv * TType * TType * range * range exception ConstraintSolverTypesNotInEqualityRelation of DisplayEnv * TType * TType * range * range exception ConstraintSolverTypesNotInSubsumptionRelation of DisplayEnv * TType * TType * range * range exception ConstraintSolverMissingConstraint of DisplayEnv * Typar * TyparConstraint * range * range @@ -92,7 +96,7 @@ type ConstraintSolverEnv val BakedInTraitConstraintNames : string list -val MakeConstraintSolverEnv : ConstraintSolverState -> range -> DisplayEnv -> ConstraintSolverEnv +val MakeConstraintSolverEnv : ContextInfo -> ConstraintSolverState -> range -> DisplayEnv -> ConstraintSolverEnv type Trace = Trace of (unit -> unit) list ref diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index b05aaca7ae0..f9053080cf2 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -17,6 +17,8 @@ missingElseBranch,"The 'if' expression is missing an 'else' branch. The 'then' b elseBranchHasWrongType,"All branches of an 'if' expression must return the same type. This expression was expected to have type '%s' but here has type '%s'." commaInsteadOfSemicolonInRecord,"A ';' is used to separate field values in records. Consider replacing ',' with ';'." buildUnexpectedTypeArgs,"The non-generic type '%s' does not expect any type arguments, but here is given %d type argument(s)" +returnUsedInsteadOfReturnBang,"Consider using 'return!' instead of 'return'." +yieldUsedInsteadOfYieldBang,"Consider using 'yield!' instead of 'yield'." 203,buildInvalidWarningNumber,"Invalid warning number '%s'" 204,buildInvalidVersionString,"Invalid version string '%s'" 205,buildInvalidVersionFile,"Invalid version file '%s'" diff --git a/src/fsharp/FSStrings.resx b/src/fsharp/FSStrings.resx index 74511b33549..f95cf777b4a 100644 --- a/src/fsharp/FSStrings.resx +++ b/src/fsharp/FSStrings.resx @@ -124,7 +124,7 @@ The tuples have differing lengths of {0} and {1} - The resulting type would be infinite when unifying '{0}' and '{1}' + The types '{0}' and '{1}' cannot be unified. A type parameter is missing a constraint '{0}' diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ddcffab75a4..b550ef3302c 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2153,7 +2153,7 @@ module GeneralizationHelpers = let CanonicalizePartialInferenceProblem (cenv,denv,m) tps = // Canonicalize constraints prior to generalization - let csenv = (MakeConstraintSolverEnv cenv.css m denv) + let csenv = (MakeConstraintSolverEnv ContextInfo.NoContext cenv.css m denv) TryD (fun () -> ConstraintSolver.CanonicalizeRelevantMemberConstraints csenv 0 NoTrace tps) (fun res -> ErrorD (ErrorFromAddingConstraint(denv,res,m))) |> RaiseOperationResult @@ -2200,7 +2200,7 @@ module GeneralizationHelpers = generalizedTypars |> List.iter (SetTyparRigid cenv.g denv m) // Generalization removes constraints related to generalized type variables - let csenv = MakeConstraintSolverEnv cenv.css m denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext cenv.css m denv EliminateConstraintsForGeneralizedTypars csenv NoTrace generalizedTypars generalizedTypars @@ -3887,7 +3887,7 @@ let rec TcTyparConstraint ridx cenv newOk checkCxs occ (env: TcEnv) tpenv c = | WhereTyparDefaultsToType(tp,ty,m) -> let ty',tpenv = TcTypeAndRecover cenv newOk checkCxs occ env tpenv ty let tp',tpenv = TcTypar cenv env newOk tpenv tp - let csenv = (MakeConstraintSolverEnv cenv.css m env.DisplayEnv) + let csenv = (MakeConstraintSolverEnv env.eContextInfo cenv.css m env.DisplayEnv) AddConstraint csenv 0 m NoTrace tp' (TyparConstraint.DefaultsTo(ridx,ty',m)) |> CommitOperationResult tpenv @@ -5092,7 +5092,7 @@ and TcPatterns warnOnUpper cenv env vFlags s argtys args = and solveTypAsError cenv denv m ty = let ty2 = NewErrorType () assert((destTyparTy cenv.g ty2).IsFromError) - SolveTypEqualsTypKeepAbbrevs (MakeConstraintSolverEnv cenv.css m denv) 0 m NoTrace ty ty2 |> ignore + SolveTypEqualsTypKeepAbbrevs (MakeConstraintSolverEnv ContextInfo.NoContext cenv.css m denv) 0 m NoTrace ty ty2 |> ignore and RecordNameAndTypeResolutions_IdeallyWithoutHavingOtherEffects cenv env tpenv expr = // This function is motivated by cases like @@ -7636,6 +7636,12 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let mBuilderVal = mBuilderVal.MakeSynthetic() SynExpr.Lambda (false,false,SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)],mBuilderVal), runExpr, mBuilderVal) + let env = + match comp with + | SynExpr.YieldOrReturn ((true,_),_,_) -> { env with eContextInfo = ContextInfo.YieldInComputationExpression } + | SynExpr.YieldOrReturn ((_,true),_,_) -> { env with eContextInfo = ContextInfo.ReturnInComputationExpression } + | _ -> env + let lambdaExpr ,tpenv= TcExpr cenv (builderTy --> overallTy) env tpenv lambdaExpr // beta-var-reduce to bind the builder using a 'let' binding let coreExpr = mkApps cenv.g ((lambdaExpr,tyOfExpr cenv.g lambdaExpr),[],[interpExpr],mBuilderVal) @@ -7648,7 +7654,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv /// and helpers rather than to the builder methods (there is actually no builder for 'seq' in the library). /// These are later detected by state machine compilation. /// -/// Also "ienumerable extraction" is performaed on arguments to "for". +/// Also "ienumerable extraction" is performed on arguments to "for". and TcSequenceExpression cenv env tpenv comp overallTy m = let mkDelayedExpr (coreExpr:Expr) = @@ -8924,7 +8930,7 @@ and TcMethodApplication yield makeOneCalledMeth (minfo,pinfoOpt,false) ] let uniquelyResolved = - let csenv = MakeConstraintSolverEnv cenv.css mMethExpr denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext cenv.css mMethExpr denv let res = UnifyUniqueOverloading csenv callerArgCounts methodName ad preArgumentTypeCheckingCalledMethGroup returnTy match res with | ErrorResult _ -> afterTcOverloadResolution.OnOverloadResolutionFailure() @@ -9010,7 +9016,7 @@ and TcMethodApplication CalledMeth(cenv.infoReader,Some(env.NameEnv),checkingAttributeCall,FreshenMethInfo, mMethExpr,ad,minfo,minst,callerTyArgs,pinfoOpt,callerObjArgTys,callerArgs,usesParamArrayConversion,true,objTyOpt)) let callerArgCounts = (unnamedCurriedCallerArgs.Length, namedCurriedCallerArgs.Length) - let csenv = MakeConstraintSolverEnv cenv.css mMethExpr denv + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext cenv.css mMethExpr denv // Commit unassociated constraints prior to member overload resolution where there is ambiguity // about the possible target of the call. @@ -15637,7 +15643,7 @@ let ApplyDefaults cenv g denvAtEnd m mexpr extraAttribs = | TyparConstraint.DefaultsTo(priority2,ty2,m) when priority2 = priority -> let ty1 = mkTyparTy tp if not tp.IsSolved && not (typeEquiv cenv.g ty1 ty2) then - let csenv = MakeConstraintSolverEnv cenv.css m denvAtEnd + let csenv = MakeConstraintSolverEnv ContextInfo.NoContext cenv.css m denvAtEnd TryD (fun () -> ConstraintSolver.SolveTyparEqualsTyp csenv 0 m NoTrace ty1 ty2) (fun e -> solveTypAsError cenv denvAtEnd m ty1 ErrorD(ErrorFromApplyingDefault(g,denvAtEnd,tp,ty2,e,m))) diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop01.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop01.fs index bf56109e500..4a76753f582 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop01.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop01.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the ! for a loop -//Type mismatch\. Expecting a. ''a' .but given a. 'Async<'a>' .The resulting type would be infinite when unifying ''a' and 'Async<'a>'$ +//Type mismatch\. Expecting a.+''a'.+but given a.+'Async<'a>'.*The types ''a' and 'Async<'a>' cannot be unified. let rec loop() = async { let x = 1 return loop() } diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop02.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop02.fs index 73a3c6a2785..ad5f28403ea 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop02.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingBangForLoop02.fs @@ -2,6 +2,6 @@ // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the ! for a loop // Note: Desugared form of MissingBangForLoop01.fs -//Type mismatch\. Expecting a. ''a' .but given a. 'Async<'a>' .The resulting type would be infinite when unifying ''a' and 'Async<'a>'$ +//Type mismatch\. Expecting a. ''a' .but given a. 'Async<'a>' .The types ''a' and 'Async<'a>' cannot be unified. let rec loop2() = async.Delay(fun () -> async.Return(loop2())) diff --git a/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs b/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs new file mode 100644 index 00000000000..1cb8bff1a9e --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs @@ -0,0 +1,6 @@ +// #Warnings +//Type mismatch. Expecting a.+''a'.+but given a.+'Async<'a>'.+The types ''a' and 'Async<'a>' cannot be unified. Consider using 'return!' instead of 'return'.* + +let rec foo() = async { return foo() } + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs b/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs new file mode 100644 index 00000000000..ce048df29cd --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs @@ -0,0 +1,9 @@ +// #Warnings +//.Type mismatch. Expecting a.+''a'.+but given a.+''a list'.+The types ''a' and ''a list' cannot be unified. Consider using 'yield!' instead of 'yield'.* + +type Foo() = + member this.Yield(x) = [x] + +let rec f () = Foo() { yield f ()} + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/env.lst b/tests/fsharpqa/Source/Warnings/env.lst index 5ec49c6ddbf..89651c646aa 100644 --- a/tests/fsharpqa/Source/Warnings/env.lst +++ b/tests/fsharpqa/Source/Warnings/env.lst @@ -1,5 +1,7 @@ SOURCE=WrongNumericLiteral.fs # WrongNumericLiteral.fs SOURCE=WarnIfMissingElseBranch.fs # WarnIfMissingElseBranch.fs + SOURCE=ReturnInsteadOfReturnBang.fs # ReturnInsteadOfReturnBang.fs + SOURCE=YieldInsteadOfYieldBang.fs # YieldInsteadOfYieldBang.fs SOURCE=CommaInRecCtor.fs # CommaInRecCtor.fs SOURCE=ValidCommaInRecCtor.fs # ValidCommaInRecCtor.fs SOURCE=ElseBranchHasWrongType.fs # ElseBranchHasWrongType.fs From 740843c6028563972a6f7a832dd792e889c2c090 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Thu, 19 May 2016 15:09:12 +0200 Subject: [PATCH 162/334] Remove Seq.toList when we already have a list --- src/absil/illib.fs | 2 +- src/fsharp/CompileOps.fs | 3 +-- src/fsharp/NameResolution.fs | 22 ++++++---------------- src/fsharp/NicePrint.fs | 2 +- src/fsharp/PostInferenceChecks.fs | 2 +- src/fsharp/TypeChecker.fs | 10 +++++----- src/fsharp/lib.fs | 4 +--- 7 files changed, 16 insertions(+), 29 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 43d100a2f8f..c0f2d29ea1c 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -921,7 +921,7 @@ type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(con x.MarkAsCollapsible() member x.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) member x.TryFind k = contents.TryFind k - member x.Values = contents.Values |> Seq.concat + member x.Values = contents.Values |> List.concat static member Empty : LayeredMultiMap<'Key,'Value> = LayeredMultiMap LayeredMap.Empty [] diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0d8ea5a3fa5..e990146946b 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2793,8 +2793,7 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) = |> List.map resolveLoadedSource |> List.filter Option.isSome |> List.map Option.get - |> Seq.distinct - |> Seq.toList + |> List.distinct /// A closed set of assemblies where, for any subset S: /// - the TcImports object built for S (and thus the F# Compiler CCUs for the assemblies in S) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 8c5b65ebd89..7da5e0379f7 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1074,8 +1074,7 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec | _ -> #endif - mty.TypesByAccessNames.Values - |> Seq.toList + mty.TypesByAccessNames.Values |> List.map (tcref.NestedTyconRef >> MakeNestedType ncenv tinst m) |> List.filter (IsTypeAccessible g ncenv.amap m ad) else []) @@ -1540,8 +1539,7 @@ let CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities let tcrefs = tcrefs // remove later duplicates (if we've opened the same module more than once) - |> Seq.distinctBy (fun (_,tcref) -> tcref.Stamp) - |> Seq.toList + |> List.distinctBy (fun (_,tcref) -> tcref.Stamp) // List.sortBy is a STABLE sort (the order matters!) |> List.sortBy (fun (_,tcref) -> tcref.Typars(m).Length) @@ -3085,9 +3083,8 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is let ilTyconNames = mty.TypesByAccessNames.Values - |> Seq.toList |> List.choose (fun (tycon:Tycon) -> if tycon.IsILTycon then Some tycon.DisplayName else None) - |> Set.ofSeq + |> Set.ofList match plid with | [] -> @@ -3168,9 +3165,8 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE let ilTyconNames = nenv.TyconsByAccessNames(fullyQualified).Values - |> Seq.toList |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofSeq + |> Set.ofList /// Include all the entries in the eUnqualifiedItems table. let unqualifiedItems = @@ -3178,7 +3174,6 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE | FullyQualified -> [] | OpenQualified -> nenv.eUnqualifiedItems.Values - |> Seq.toList |> List.filter (function Item.UnqualifiedType _ -> false | _ -> true) |> List.filter (ItemIsUnseen ad g ncenv.amap m >> not) @@ -3201,7 +3196,6 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE let tycons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> Seq.toList |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) |> List.filter (fun tcref -> not tcref.IsExceptionDecl) |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) @@ -3210,7 +3204,6 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE // Get all the constructors accessible from here let constructors = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> Seq.toList |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) |> List.collect (InfosForTyconConstructors ncenv m ad) @@ -3266,9 +3259,8 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe let ilTyconNames = mty.TypesByAccessNames.Values - |> Seq.toList |> List.choose (fun (tycon:Tycon) -> if tycon.IsILTycon then Some tycon.DisplayName else None) - |> Set.ofSeq + |> Set.ofList match plid with | [] -> @@ -3333,9 +3325,8 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: // empty plid - return namespaces\modules\record types\accessible fields let iltyconNames = nenv.TyconsByAccessNames(fullyQualified).Values - |> Seq.toList |> List.choose (fun tyconRef -> if tyconRef.IsILTycon then Some tyconRef.DisplayName else None) - |> Set.ofSeq + |> Set.ofList let mods = nenv.ModulesAndNamespaces(fullyQualified) @@ -3348,7 +3339,6 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: let recdTyCons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> Seq.toList |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) |> List.filter (fun tcref -> tcref.IsRecordTycon) |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index c71cb4d1c87..bd2902fcc3c 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -58,7 +58,7 @@ module internal PrintUtilities = let applyMaxMembers maxMembers (alldecls : _ list) = match maxMembers with - | Some n when alldecls.Length > n -> (alldecls |> Seq.truncate n |> Seq.toList) @ [wordL "..."] + | Some n when alldecls.Length > n -> (alldecls |> List.truncate n) @ [wordL "..."] | _ -> alldecls /// fix up a name coming from IL metadata by quoting "funny" names (keywords, otherwise invalid identifiers) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index f3e72544a75..34f8ae804cf 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -958,7 +958,7 @@ and CheckAttribs cenv env (attribs: Attribs) = // Check for violations of allowMultiple = false let duplicates = - tcrefs + tcrefs |> Seq.groupBy (fun (tcref,_) -> tcref.Stamp) |> Seq.map (fun (_,elems) -> List.last (List.ofSeq elems), Seq.length elems) |> Seq.filter (fun (_,count) -> count > 1) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ddcffab75a4..401f0ba67f3 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -4460,9 +4460,9 @@ and CrackStaticConstantArgs cenv env tpenv (staticParameters: Tainted (Some id, v) | v -> (None, v)) let unnamedArgs = args |> Seq.takeWhile (fst >> isNone) |> Seq.toArray |> Array.map snd - let otherArgs = args |> Seq.skipWhile (fst >> isNone) |> Seq.toList - let namedArgs = otherArgs |> Seq.takeWhile (fst >> isSome) |> Seq.toList |> List.map (map1Of2 Option.get) - let otherArgs = otherArgs |> Seq.skipWhile (fst >> isSome) |> Seq.toList + let otherArgs = args |> List.skipWhile (fst >> isNone) + let namedArgs = otherArgs |> List.takeWhile (fst >> isSome) |> List.map (map1Of2 Option.get) + let otherArgs = otherArgs |> List.skipWhile (fst >> isSome) if not otherArgs.IsEmpty then error (Error(FSComp.SR.etBadUnnamedStaticArgs(),m)) for (n,_) in namedArgs do @@ -12382,8 +12382,8 @@ module TyconBindingChecking = begin | PassAIncrClassCtorJustAfterLastLet | PassAMember _ -> true let restRev = List.rev rest - let afterRev = restRev |> Seq.takeWhile isAfter |> Seq.toList - let beforeRev = restRev |> Seq.skipWhile isAfter |> Seq.toList + let afterRev = restRev |> List.takeWhile isAfter + let beforeRev = restRev |> List.skipWhile isAfter [ yield! List.rev beforeRev yield PassAIncrClassCtorJustAfterLastLet diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs index 125ef8fa8b6..3ed305323e0 100755 --- a/src/fsharp/lib.fs +++ b/src/fsharp/lib.fs @@ -268,9 +268,7 @@ let fmap2Of2 f z (a1,a2) = let z,a2 = f z a2 in z,(a1,a2) module List = let noRepeats xOrder xs = let s = Zset.addList xs (Zset.empty xOrder) // build set - Zset.elements s // get elements... no repeats - - let groupBy f (xs:list<'T>) = xs |> Seq.groupBy f |> Seq.map (map2Of2 Seq.toList) |> Seq.toList + Zset.elements s // get elements... no repeats //--------------------------------------------------------------------------- // Zmap rebinds From a23a52cc422ee222fb32867d99e458fce882f18f Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Thu, 19 May 2016 20:47:54 +0300 Subject: [PATCH 163/334] reduce allocations --- src/fsharp/MethodOverrides.fs | 8 +++----- src/fsharp/tast.fs | 15 +++++++-------- src/utils/prim-lexing.fs | 14 +++++++------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index 6b46480c4f1..637884f2aae 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -293,7 +293,7 @@ module DispatchSlotChecking = match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with | [] -> match overrides |> List.filter (fun overrideBy -> IsNameMatch dispatchSlot overrideBy && - IsImplMatch g dispatchSlot overrideBy) with + IsImplMatch g dispatchSlot overrideBy) with | [] -> noimpl() | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> @@ -307,12 +307,10 @@ module DispatchSlotChecking = errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) | [ overrideBy ] -> - - match dispatchSlots |> List.filter (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) with - | [] -> + if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then // Error will be reported below in CheckOverridesAreAllUsedOnce () - | _ -> + else noimpl() | _ -> diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index ad1f15cb268..32e671f7665 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -4398,19 +4398,18 @@ let fslibValRefEq fslibCcu vref1 vref2 = /// This takes into account the possibility that they may have type forwarders let primEntityRefEq compilingFslib fslibCcu (x : EntityRef) (y : EntityRef) = x === y || - match x.IsResolved,y.IsResolved with - | true, true when not compilingFslib -> x.ResolvedTarget === y.ResolvedTarget - | _ -> - match x.IsLocalRef,y.IsLocalRef with - | false, false when + + if x.IsResolved && y.IsResolved && not compilingFslib then + x.ResolvedTarget === y.ResolvedTarget + elif not x.IsLocalRef && not y.IsLocalRef && (// Two tcrefs with identical paths are always equal nonLocalRefEq x.nlr y.nlr || // The tcrefs may have forwarders. If they may possibly be equal then resolve them to get their canonical references // and compare those using pointer equality. - (not (nonLocalRefDefinitelyNotEq x.nlr y.nlr) && x.Deref === y.Deref)) -> + (not (nonLocalRefDefinitelyNotEq x.nlr y.nlr) && x.Deref === y.Deref)) then true - | _ -> - compilingFslib && fslibEntityRefEq fslibCcu x y + else + compilingFslib && fslibEntityRefEq fslibCcu x y /// Primitive routine to compare two UnionCaseRef's for equality let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1,c1) as uc1) (UCRef(tcr2,c2) as uc2) = diff --git a/src/utils/prim-lexing.fs b/src/utils/prim-lexing.fs index 380993e85b2..19098f4f2ed 100644 --- a/src/utils/prim-lexing.fs +++ b/src/utils/prim-lexing.fs @@ -184,9 +184,9 @@ namespace Internal.Utilities.Text.Lexing if lexBuffer.IsPastEndOfStream then failwith "End of file on lexing stream"; lexBuffer.IsPastEndOfStream <- true; //printf "state %d --> %d on eof\n" state snew; - scanUntilSentinel(lexBuffer,snew) + scanUntilSentinel lexBuffer snew else - scanUntilSentinel(lexBuffer, state) + scanUntilSentinel lexBuffer state let onAccept (lexBuffer:LexBuffer,a) = lexBuffer.LexemeLength <- lexBuffer.BufferScanLength; @@ -201,7 +201,7 @@ namespace Internal.Utilities.Text.Lexing let numUnicodeCategories = 30 let numLowUnicodeChars = 128 let numSpecificUnicodeChars = (trans.[0].Length - 1 - numLowUnicodeChars - numUnicodeCategories)/2 - let lookupUnicodeCharacters (state,inp) = + let lookupUnicodeCharacters state inp = let inpAsInt = int inp // Is it a fast ASCII character? if inpAsInt < numLowUnicodeChars then @@ -235,7 +235,7 @@ namespace Internal.Utilities.Text.Lexing loop 0 let eofPos = numLowUnicodeChars + 2*numSpecificUnicodeChars + numUnicodeCategories - let rec scanUntilSentinel(lexBuffer,state) = + let rec scanUntilSentinel lexBuffer state = // Return an endOfScan after consuming the input let a = int accept.[state] if a <> sentinel then @@ -251,14 +251,14 @@ namespace Internal.Utilities.Text.Lexing let inp = lexBuffer.Buffer.[lexBuffer.BufferScanPos] // Find the new state - let snew = lookupUnicodeCharacters (state,inp) + let snew = lookupUnicodeCharacters state inp if snew = sentinel then lexBuffer.EndOfScan() else lexBuffer.BufferScanLength <- lexBuffer.BufferScanLength + 1; //printf "state %d --> %d on '%c' (%d)\n" s snew (char inp) inp; - scanUntilSentinel(lexBuffer,snew) + scanUntilSentinel lexBuffer snew // Each row for the Unicode table has format // 128 entries for ASCII characters @@ -268,6 +268,6 @@ namespace Internal.Utilities.Text.Lexing member tables.Interpret(initialState,lexBuffer : LexBuffer) = startInterpret(lexBuffer) - scanUntilSentinel(lexBuffer, initialState) + scanUntilSentinel lexBuffer initialState static member Create(trans,accept) = new UnicodeTables(trans,accept) From 32673e4ac2d6a8da55ff4670e54854574af5aace Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sat, 21 May 2016 10:15:59 +0200 Subject: [PATCH 164/334] Remove tuples in primValRefEq --- src/fsharp/tast.fs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 32e671f7665..4ac9f87cadd 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -4424,12 +4424,10 @@ let primUnionCaseRefEq compilingFslib fslibCcu (UCRef(tcr1,c1) as uc1) (UCRef(tc /// Note this routine doesn't take type forwarding into account let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = x === y || - match x.IsResolved,y.IsResolved with - | true, true when x.ResolvedTarget === y.ResolvedTarget -> true - | _ -> - match x.IsLocalRef,y.IsLocalRef with - | true,true when valEq x.PrivateTarget y.PrivateTarget -> true - | _ -> + if (x.IsResolved && y.IsResolved && x.ResolvedTarget === y.ResolvedTarget) || + (x.IsLocalRef && y.IsLocalRef && valEq x.PrivateTarget y.PrivateTarget) then + true + else (// Use TryDeref to guard against the platforms/times when certain F# language features aren't available, // e.g. CompactFramework doesn't have support for quotations. let v1 = x.TryDeref From 303a957f047822573d866103a724dc93e3bb60ba Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 12:43:27 +0200 Subject: [PATCH 165/334] Remove unused stuff in reflect --- src/fsharp/FSharp.Core/reflect.fs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/fsharp/FSharp.Core/reflect.fs b/src/fsharp/FSharp.Core/reflect.fs index 7edf2847924..43ce45c62f1 100644 --- a/src/fsharp/FSharp.Core/reflect.fs +++ b/src/fsharp/FSharp.Core/reflect.fs @@ -571,12 +571,6 @@ module internal Impl = |> Array.filter isFieldProperty |> sortFreshArray (fun p1 p2 -> compare (sequenceNumberOfMember p1) (sequenceNumberOfMember p2)) - let recdDescOfProps props = - props |> Array.toList |> List.map (fun (p:PropertyInfo) -> p.Name, p.PropertyType) - - let getRecd obj (props:PropertyInfo[]) = - props |> Array.map (fun prop -> prop.GetValue(obj,null)) - let getRecordReader(typ:Type,bindingFlags) = let props = fieldPropsOfRecordType(typ,bindingFlags) (fun (obj:obj) -> props |> Array.map (fun prop -> prop.GetValue(obj,null))) From 3be7bfde1359cadc4d42643302c62ed5227055c9 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 16:24:54 +0200 Subject: [PATCH 166/334] Remove dead code --- src/absil/illib.fs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index c0f2d29ea1c..cd310874470 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -906,7 +906,6 @@ type Map<'Key,'Value when 'Key : comparison> with | Some r -> res <- r; true member x.Values = [ for (KeyValue(_,v)) in x -> v ] - member x.Elements = [ for kvp in x -> kvp ] member x.AddAndMarkAsCollapsible (kvs: _[]) = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) member x.MarkAsCollapsible () = x From c6be69da1b54bef802c0d67a040bfd21902b63b2 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sat, 21 May 2016 12:26:34 +0200 Subject: [PATCH 167/334] Fix bug in error reporting --- src/fsharp/MethodOverrides.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index 637884f2aae..cc210ade4cb 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -308,10 +308,10 @@ module DispatchSlotChecking = | [ overrideBy ] -> if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then + noimpl() + else // Error will be reported below in CheckOverridesAreAllUsedOnce () - else - noimpl() | _ -> fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) From bd10cac23c6282079ccc041b98082154dc534c09 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sat, 21 May 2016 12:49:12 +0200 Subject: [PATCH 168/334] Use exists instead of filter + match on [] --- src/fsharp/TypeChecker.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 401f0ba67f3..52c9b672bef 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2112,9 +2112,9 @@ module GeneralizationHelpers = match tp.Constraints |> List.partition (function (TyparConstraint.CoercesTo _) -> true | _ -> false) with | [TyparConstraint.CoercesTo(cxty,_)], others -> // Throw away null constraints if they are implied - match others |> List.filter (function (TyparConstraint.SupportsNull(_)) -> not (TypeSatisfiesNullConstraint cenv.g m cxty) | _ -> true) with - | [] -> Some cxty - | _ -> None + if others |> List.exists (function (TyparConstraint.SupportsNull(_)) -> not (TypeSatisfiesNullConstraint cenv.g m cxty) | _ -> true) + then None + else Some cxty | _ -> None From 453c95d46ce213ba3c1408b9716cd25c2ca22967 Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sat, 21 May 2016 17:10:46 +0300 Subject: [PATCH 169/334] refactor CheckDispatchSlotsAreImplemented --- src/fsharp/MethodOverrides.fs | 96 +++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index cc210ade4cb..fbe9b5c8598 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -265,17 +265,21 @@ module DispatchSlotChecking = let isReqdTyInterface = isInterfaceTy g reqdTy let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) - let res = ref true - let fail exn = (res := false ; if showMissingMethodsAndRaiseErrors then errorR exn) + let mutable res = true + let fail exn = (res <- false; if showMissingMethodsAndRaiseErrors then errorR exn) // Index the availPriorOverrides and overrides by name let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot,isOptional)) -> - - match NameMultiMap.find dispatchSlot.LogicalName overridesKeyed - |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with + for RequiredSlot(dispatchSlot,isOptional) in dispatchSlots do + let formatMethSig() = FormatMethInfoSig g amap m denv dispatchSlot + + let overrideInfos = + NameMultiMap.find dispatchSlot.LogicalName overridesKeyed + |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) + + match overrideInfos with | [ovd] -> if not ovd.IsCompilerGenerated then let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None) @@ -286,37 +290,55 @@ module DispatchSlotChecking = if not isOptional && // Check that no available prior override implements this dispatch slot not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot) then - // error reporting path - let (CompiledSig (vargtys,_vrty,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot - let noimpl() = if isReqdTyInterface then fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) - else fail(Error(FSComp.SR.typrelNoImplementationGiven(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) - match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with - | [] -> - match overrides |> List.filter (fun overrideBy -> IsNameMatch dispatchSlot overrideBy && - IsImplMatch g dispatchSlot overrideBy) with - | [] -> - noimpl() - | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> - let error_msg = - if argTys.Length <> vargtys.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - elif mtps.Length <> fvmtps.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) - else FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot) - fail(Error(error_msg, overrideBy.Range)) - | overrideBy :: _ -> - errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) - - | [ overrideBy ] -> - if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then - noimpl() - else - // Error will be reported below in CheckOverridesAreAllUsedOnce - () - - | _ -> - fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) - | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot),m))) - !res + // error reporting path + let (CompiledSig (vargtys,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot + + let noimpl() = + let formattedMethodInfo = NicePrint.stringOfMethInfo amap m denv dispatchSlot + if isReqdTyInterface then + fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(formattedMethodInfo), m)) + else + fail(Error(FSComp.SR.typrelNoImplementationGiven(formattedMethodInfo), m)) + + match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with + | [] -> + let overrides = overrides |> List.filter (fun overrideBy -> + IsNameMatch dispatchSlot overrideBy && IsImplMatch g dispatchSlot overrideBy) + + match overrides with + | [] -> noimpl() + | Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy :: rest -> + let formatOverride() = FormatOverride denv overrideBy + match rest with + | [] -> + let error_msg = + if argTys.Length <> vargtys.Length then + FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(formatOverride(), formatMethSig()) + elif mtps.Length <> fvmtps.Length then + FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(formatOverride(), formatMethSig()) + elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then + FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(formatOverride(), formatMethSig()) + else + FSComp.SR.typrelMemberCannotImplement(formatOverride(), NicePrint.stringOfMethInfo amap m denv dispatchSlot, formatMethSig()) + fail(Error(error_msg, overrideBy.Range)) + | _ -> + errorR(Error(FSComp.SR.typrelOverloadNotFound(formatMethSig(), formatMethSig()),overrideBy.Range)) + + | [ overrideBy ] -> + let matchedSlotsFound = + dispatchSlots + |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> + OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) + if matchedSlotsFound then + // Error will be reported below in CheckOverridesAreAllUsedOnce + () + else + noimpl() + + | _ -> + fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(formatMethSig()),m)) + | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(formatMethSig()),m)) + res /// Check all implementations implement some dispatch slot. let CheckOverridesAreAllUsedOnce(denv, g, amap, isObjExpr, reqdTy, From d7bcd7ca2e2bb761a29a7b007563a01471faa51b Mon Sep 17 00:00:00 2001 From: Vasily Kirichenko Date: Sun, 22 May 2016 13:51:19 +0300 Subject: [PATCH 170/334] fix condition fix condition change fsc.exe GCLatencyMode to LowLatency as it showed better performance than Batch Revert "change fsc.exe GCLatencyMode to LowLatency as it showed better performance than Batch" This reverts commit 828dfab278e09766bcdd2ffced175c67f1715cf9. --- src/fsharp/MethodOverrides.fs | 96 ++++++++++++++--------------------- 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/src/fsharp/MethodOverrides.fs b/src/fsharp/MethodOverrides.fs index fbe9b5c8598..cc210ade4cb 100644 --- a/src/fsharp/MethodOverrides.fs +++ b/src/fsharp/MethodOverrides.fs @@ -265,21 +265,17 @@ module DispatchSlotChecking = let isReqdTyInterface = isInterfaceTy g reqdTy let showMissingMethodsAndRaiseErrors = (isReqdTyInterface || not isOverallTyAbstract) - let mutable res = true - let fail exn = (res <- false; if showMissingMethodsAndRaiseErrors then errorR exn) + let res = ref true + let fail exn = (res := false ; if showMissingMethodsAndRaiseErrors then errorR exn) // Index the availPriorOverrides and overrides by name let availPriorOverridesKeyed = availPriorOverrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) let overridesKeyed = overrides |> NameMultiMap.initBy (fun ov -> ov.LogicalName) - for RequiredSlot(dispatchSlot,isOptional) in dispatchSlots do - let formatMethSig() = FormatMethInfoSig g amap m denv dispatchSlot - - let overrideInfos = - NameMultiMap.find dispatchSlot.LogicalName overridesKeyed - |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) - - match overrideInfos with + dispatchSlots |> List.iter (fun (RequiredSlot(dispatchSlot,isOptional)) -> + + match NameMultiMap.find dispatchSlot.LogicalName overridesKeyed + |> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with | [ovd] -> if not ovd.IsCompilerGenerated then let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None) @@ -290,55 +286,37 @@ module DispatchSlotChecking = if not isOptional && // Check that no available prior override implements this dispatch slot not (DispatchSlotIsAlreadyImplemented g amap m availPriorOverridesKeyed dispatchSlot) then - // error reporting path - let (CompiledSig (vargtys,_,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot - - let noimpl() = - let formattedMethodInfo = NicePrint.stringOfMethInfo amap m denv dispatchSlot - if isReqdTyInterface then - fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(formattedMethodInfo), m)) - else - fail(Error(FSComp.SR.typrelNoImplementationGiven(formattedMethodInfo), m)) - - match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with - | [] -> - let overrides = overrides |> List.filter (fun overrideBy -> - IsNameMatch dispatchSlot overrideBy && IsImplMatch g dispatchSlot overrideBy) - - match overrides with - | [] -> noimpl() - | Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy :: rest -> - let formatOverride() = FormatOverride denv overrideBy - match rest with - | [] -> - let error_msg = - if argTys.Length <> vargtys.Length then - FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(formatOverride(), formatMethSig()) - elif mtps.Length <> fvmtps.Length then - FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(formatOverride(), formatMethSig()) - elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then - FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(formatOverride(), formatMethSig()) - else - FSComp.SR.typrelMemberCannotImplement(formatOverride(), NicePrint.stringOfMethInfo amap m denv dispatchSlot, formatMethSig()) - fail(Error(error_msg, overrideBy.Range)) - | _ -> - errorR(Error(FSComp.SR.typrelOverloadNotFound(formatMethSig(), formatMethSig()),overrideBy.Range)) - - | [ overrideBy ] -> - let matchedSlotsFound = - dispatchSlots - |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> - OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) - if matchedSlotsFound then - // Error will be reported below in CheckOverridesAreAllUsedOnce - () - else - noimpl() - - | _ -> - fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(formatMethSig()),m)) - | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(formatMethSig()),m)) - res + // error reporting path + let (CompiledSig (vargtys,_vrty,fvmtps,_)) = CompiledSigOfMeth g amap m dispatchSlot + let noimpl() = if isReqdTyInterface then fail(Error(FSComp.SR.typrelNoImplementationGivenWithSuggestion(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + else fail(Error(FSComp.SR.typrelNoImplementationGiven(NicePrint.stringOfMethInfo amap m denv dispatchSlot), m)) + match overrides |> List.filter (IsPartialMatch g amap m dispatchSlot) with + | [] -> + match overrides |> List.filter (fun overrideBy -> IsNameMatch dispatchSlot overrideBy && + IsImplMatch g dispatchSlot overrideBy) with + | [] -> + noimpl() + | [ Override(_,_,_,(mtps,_),argTys,_,_,_) as overrideBy ] -> + let error_msg = + if argTys.Length <> vargtys.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfArguments(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + elif mtps.Length <> fvmtps.Length then FSComp.SR.typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + elif not (IsTyparKindMatch g amap m dispatchSlot overrideBy) then FSComp.SR.typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(FormatOverride denv overrideBy, FormatMethInfoSig g amap m denv dispatchSlot) + else FSComp.SR.typrelMemberCannotImplement(FormatOverride denv overrideBy, NicePrint.stringOfMethInfo amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot) + fail(Error(error_msg, overrideBy.Range)) + | overrideBy :: _ -> + errorR(Error(FSComp.SR.typrelOverloadNotFound(FormatMethInfoSig g amap m denv dispatchSlot, FormatMethInfoSig g amap m denv dispatchSlot),overrideBy.Range)) + + | [ overrideBy ] -> + if dispatchSlots |> List.exists (fun (RequiredSlot(dispatchSlot,_)) -> OverrideImplementsDispatchSlot g amap m dispatchSlot overrideBy) then + noimpl() + else + // Error will be reported below in CheckOverridesAreAllUsedOnce + () + + | _ -> + fail(Error(FSComp.SR.typrelOverrideWasAmbiguous(FormatMethInfoSig g amap m denv dispatchSlot),m)) + | _ -> fail(Error(FSComp.SR.typrelMoreThenOneOverride(FormatMethInfoSig g amap m denv dispatchSlot),m))) + !res /// Check all implementations implement some dispatch slot. let CheckOverridesAreAllUsedOnce(denv, g, amap, isObjExpr, reqdTy, From 4cce423a8df094adadbc62becfa61470f152f78f Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 23 May 2016 12:58:36 -0700 Subject: [PATCH 171/334] Add correct error message patterns --- tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs | 6 +++++- tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs b/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs index 1cb8bff1a9e..d9f87c521bd 100644 --- a/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs +++ b/tests/fsharpqa/Source/Warnings/ReturnInsteadOfReturnBang.fs @@ -1,5 +1,9 @@ // #Warnings -//Type mismatch. Expecting a.+''a'.+but given a.+'Async<'a>'.+The types ''a' and 'Async<'a>' cannot be unified. Consider using 'return!' instead of 'return'.* +//Type mismatch. Expecting a +//''a' +//but given a +//'Async<'a>' +//The types ''a' and 'Async<'a>' cannot be unified. Consider using 'return!' instead of 'return'. let rec foo() = async { return foo() } diff --git a/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs b/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs index ce048df29cd..bd547fa7b28 100644 --- a/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs +++ b/tests/fsharpqa/Source/Warnings/YieldInsteadOfYieldBang.fs @@ -1,5 +1,9 @@ // #Warnings -//.Type mismatch. Expecting a.+''a'.+but given a.+''a list'.+The types ''a' and ''a list' cannot be unified. Consider using 'yield!' instead of 'yield'.* +//Type mismatch. Expecting a +//''a' +//but given a +//''a list' +//The types ''a' and ''a list' cannot be unified. Consider using 'yield!' instead of 'yield'. type Foo() = member this.Yield(x) = [x] From 81e38b416c63cc40eb6180e333f1dff54ac3f72c Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sat, 21 May 2016 13:12:25 +0200 Subject: [PATCH 172/334] Reduce intermediate collections in type checker --- src/fsharp/TypeChecker.fs | 97 ++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index fbe0205101e..f7076bc14b4 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -5913,7 +5913,7 @@ and TcCtorCall isNaked cenv env tpenv overallTy objTy mObjTyOpt item superInit a // TcRecordConstruction //------------------------------------------------------------------------- -// Check a record consutrction expression +// Check a record construction expression and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = let tcref = tcrefOfAppTy cenv.g objTy let tycon = tcref.Deref @@ -5953,9 +5953,10 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = // Effect order - mutable fields may get modified by other bindings... let fieldNameUnbound nom = List.forall (fun (name,_) -> name <> nom) fldsList fspecs - |> List.filter (fun rfld -> rfld.Name |> fieldNameUnbound) - |> List.filter (fun f -> not f.IsZeroInit) - |> List.map (fun fspec ->fspec.Name, mkRecdFieldGet cenv.g (oldve',tcref.MakeNestedRecdFieldRef fspec,tinst,m)) + |> List.choose (fun rfld -> + if fieldNameUnbound rfld.Name && not rfld.IsZeroInit + then Some(rfld.Name, mkRecdFieldGet cenv.g (oldve',tcref.MakeNestedRecdFieldRef rfld,tinst,m)) + else None) let fldsList = fldsList @ oldFldsList @@ -6683,34 +6684,36 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let customOperationMethods = AllMethInfosOfTypeInScope cenv.infoReader env.NameEnv (None,ad) IgnoreOverrides mBuilderVal builderTy - |> List.filter (IsMethInfoAccessible cenv.amap mBuilderVal ad) |> List.choose (fun methInfo -> - let nameSearch = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) - (fun _ -> None) // We do not respect this attribute for provided methods - - let joinConditionWord = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,_,ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s),_,_,_)) -> Some s | _ -> None) - (fun _ -> None) // We do not respect this attribute for provided methods - let flagSearch (propName:string) = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,_,ExtractAttribNamedArg propName (AttribBoolArg b),_,_,_)) -> Some b | _ -> None) - (fun _ -> None)// We do not respect this attribute for provided methods - let maintainsVarSpaceUsingBind = defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false - let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false - let allowInto = defaultArg (flagSearch "AllowIntoPattern") false - let isLikeZip = defaultArg (flagSearch "IsLikeZip") false - let isLikeJoin = defaultArg (flagSearch "IsLikeJoin" ) false - let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin" ) false - - match nameSearch with - | None -> None - | Some nm -> Some (nm, maintainsVarSpaceUsingBind, maintainsVarSpace, allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, joinConditionWord, methInfo)) + if IsMethInfoAccessible cenv.amap mBuilderVal ad methInfo then + let nameSearch = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) + (fun _ -> None) // We do not respect this attribute for provided methods + + let joinConditionWord = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,_,ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s),_,_,_)) -> Some s | _ -> None) + (fun _ -> None) // We do not respect this attribute for provided methods + let flagSearch (propName:string) = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,_,ExtractAttribNamedArg propName (AttribBoolArg b),_,_,_)) -> Some b | _ -> None) + (fun _ -> None)// We do not respect this attribute for provided methods + let maintainsVarSpaceUsingBind = defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false + let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false + let allowInto = defaultArg (flagSearch "AllowIntoPattern") false + let isLikeZip = defaultArg (flagSearch "IsLikeZip") false + let isLikeJoin = defaultArg (flagSearch "IsLikeJoin" ) false + let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin" ) false + + match nameSearch with + | None -> None + | Some nm -> Some (nm, maintainsVarSpaceUsingBind, maintainsVarSpace, allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, joinConditionWord, methInfo) + else + None) let customOperationMethodsIndexedByKeyword = customOperationMethods @@ -8847,9 +8850,8 @@ and TcMethodApplication let GenerateMatchingSimpleArgumentTypes (calledMeth:MethInfo) = let curriedMethodArgAttribs = calledMeth.GetParamAttribs(cenv.amap, mItem) - curriedMethodArgAttribs - |> List.map (List.filter isSimpleFormalArg) - |> List.map (NewInferenceTypes) + curriedMethodArgAttribs + |> List.map (fun args -> List.filter isSimpleFormalArg args |> NewInferenceTypes) let UnifyMatchingSimpleArgumentTypes exprTy (calledMeth:MethInfo) = let curriedArgTys = GenerateMatchingSimpleArgumentTypes calledMeth @@ -9043,8 +9045,7 @@ and TcMethodApplication let resultMinfo = result.Method let overridingInfo = overriding - |> List.filter (fun (minfo,_) -> minfo.IsVirtual) - |> List.tryFind (fun (minfo,_) -> MethInfosEquivByNameAndSig EraseNone true cenv.g cenv.amap range0 resultMinfo minfo) + |> List.tryFind (fun (minfo,_) -> minfo.IsVirtual && MethInfosEquivByNameAndSig EraseNone true cenv.g cenv.amap range0 resultMinfo minfo) match overridingInfo with | Some r -> r |> callSink | None -> (result.Method,result.AssociatedPropertyInfo) |> callSink @@ -11341,7 +11342,7 @@ let TcOpenDecl tcSink g amap m scopem env (longId : Ident list) = let modrefs = ForceRaise (TcModuleOrNamespaceLidAndPermitAutoResolve env amap longId) // validate opened namespace names - longId |> List.filter (fun id -> id.idText <> MangledGlobalName) |> List.iter (CheckNamespaceModuleOrTypeName g) + longId |> List.iter (fun id -> if id.idText <> MangledGlobalName then CheckNamespaceModuleOrTypeName g id) let IsPartiallyQualifiedNamespace (modref: ModuleOrNamespaceRef) = let (CompPath(_,p)) = modref.CompilationPath @@ -12674,9 +12675,8 @@ module TyconBindingChecking = begin defnCs |> List.exists (function | PassCIncrClassBindings groups -> groups |> List.exists (function - | IncrClassBindingGroup(binds,isStatic,_) -> - let nonMethodBinds = binds |> List.filter (IncrClassReprInfo.IsMethodRepr cenv >> not) - isStatic && not nonMethodBinds.IsEmpty + | IncrClassBindingGroup(binds,isStatic,_) -> + isStatic && (binds |> List.exists (IncrClassReprInfo.IsMethodRepr cenv >> not)) | _ -> false) | _ -> false) @@ -14201,14 +14201,15 @@ module EstablishTypeDefinitionCores = begin let writeFakeRecordFieldsToSink (fields:RecdField list) = let nenv = envinner.NameEnv // Record fields should be visible from IntelliSense, so add fake names for them (similarly to "let a = ..") - for fspec in (fields |> List.filter (fun fspec -> not fspec.IsCompilerGenerated)) do - let info = RecdFieldInfo(thisTyInst, thisTyconRef.MakeNestedRecdFieldRef fspec) - let nenv' = AddFakeNameToNameEnv fspec.Name nenv (Item.RecdField info) - // Name resolution gives better info for tooltips - let item = FreshenRecdFieldRef cenv.nameResolver m (thisTyconRef.MakeNestedRecdFieldRef fspec) - CallNameResolutionSink cenv.tcSink (fspec.Range,nenv,item,item,ItemOccurence.Binding,envinner.DisplayEnv,ad) - // Environment is needed for completions - CallEnvSink cenv.tcSink (fspec.Range, nenv', ad) + for fspec in fields do + if not fspec.IsCompilerGenerated then + let info = RecdFieldInfo(thisTyInst, thisTyconRef.MakeNestedRecdFieldRef fspec) + let nenv' = AddFakeNameToNameEnv fspec.Name nenv (Item.RecdField info) + // Name resolution gives better info for tooltips + let item = FreshenRecdFieldRef cenv.nameResolver m (thisTyconRef.MakeNestedRecdFieldRef fspec) + CallNameResolutionSink cenv.tcSink (fspec.Range,nenv,item,item,ItemOccurence.Binding,envinner.DisplayEnv,ad) + // Environment is needed for completions + CallEnvSink cenv.tcSink (fspec.Range, nenv', ad) // Notify the Language Service about constructors in discriminated union declaration let writeFakeUnionCtorsToSink (unionCases: UnionCase list) = From 7b355f7da00f39e0720e3e76325e33db934d8333 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Sat, 21 May 2016 14:03:05 +0200 Subject: [PATCH 173/334] Reduce intermediate collections in constraint solver --- src/fsharp/ConstraintSolver.fs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index cfe592e1c27..bdb4fd8bdce 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -1225,12 +1225,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep let calledMethGroup = minfos // curried members may not be used to satisfy constraints - |> List.filter (fun minfo -> not minfo.IsCurried) - |> List.map (fun minfo -> - let callerArgs = argtys |> List.map (fun argty -> CallerArg(argty,m,false,dummyExpr)) - let minst = FreshenMethInfo m minfo - let objtys = minfo.GetObjArgTypes(amap, m, minst) - CalledMeth(csenv.InfoReader,None,false,FreshenMethInfo,m,AccessibleFromEverywhere,minfo,minst,minst,None,objtys,[(callerArgs,[])],false,false,None)) + |> List.choose (fun minfo -> + if minfo.IsCurried then None else + let callerArgs = argtys |> List.map (fun argty -> CallerArg(argty,m,false,dummyExpr)) + let minst = FreshenMethInfo m minfo + let objtys = minfo.GetObjArgTypes(amap, m, minst) + Some(CalledMeth(csenv.InfoReader,None,false,FreshenMethInfo,m,AccessibleFromEverywhere,minfo,minst,minst,None,objtys,[(callerArgs,[])],false,false,None))) let methOverloadResult,errors = CollectThenUndo (fun trace -> ResolveOverloading csenv (WithTrace(trace)) nm ndeep true (0,0) AccessibleFromEverywhere calledMethGroup false (Some rty)) @@ -1803,8 +1803,7 @@ and SolveTypRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 trac CompleteD elif GetIntrinsicConstructorInfosOfType csenv.InfoReader m ty - |> List.filter (IsMethInfoAccessible amap m AccessibleFromEverywhere) - |> List.exists (fun x -> x.IsNullary) + |> List.exists (fun x -> IsMethInfoAccessible amap m AccessibleFromEverywhere x && x.IsNullary) then if (isAppTy g ty && HasFSharpAttribute g g.attrib_AbstractClassAttribute (tcrefOfAppTy g ty).Attribs) then ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresNonAbstract(NicePrint.minimalStringOfType denv typ),m,m2)) From 9a6e9415c24ce888c300a6bb3058221c8beb5d23 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 25 May 2016 10:53:10 +0200 Subject: [PATCH 174/334] Feedback round --- src/fsharp/TypeChecker.fs | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index f7076bc14b4..f44e90cc2a0 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6685,35 +6685,33 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let customOperationMethods = AllMethInfosOfTypeInScope cenv.infoReader env.NameEnv (None,ad) IgnoreOverrides mBuilderVal builderTy |> List.choose (fun methInfo -> - if IsMethInfoAccessible cenv.amap mBuilderVal ad methInfo then - let nameSearch = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) - (fun _ -> None) // We do not respect this attribute for provided methods - - let joinConditionWord = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,_,ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s),_,_,_)) -> Some s | _ -> None) - (fun _ -> None) // We do not respect this attribute for provided methods - let flagSearch (propName:string) = - TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo - (fun _ -> None) // We do not respect this attribute for IL methods - (function (Attrib(_,_,_,ExtractAttribNamedArg propName (AttribBoolArg b),_,_,_)) -> Some b | _ -> None) - (fun _ -> None)// We do not respect this attribute for provided methods - let maintainsVarSpaceUsingBind = defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false - let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false - let allowInto = defaultArg (flagSearch "AllowIntoPattern") false - let isLikeZip = defaultArg (flagSearch "IsLikeZip") false - let isLikeJoin = defaultArg (flagSearch "IsLikeJoin" ) false - let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin" ) false - - match nameSearch with - | None -> None - | Some nm -> Some (nm, maintainsVarSpaceUsingBind, maintainsVarSpace, allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, joinConditionWord, methInfo) - else - None) + if not (IsMethInfoAccessible cenv.amap mBuilderVal ad methInfo) then None else + let nameSearch = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,[ AttribStringArg msg ],_,_,_,_)) -> Some msg | _ -> None) + (fun _ -> None) // We do not respect this attribute for provided methods + + let joinConditionWord = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,_,ExtractAttribNamedArg "JoinConditionWord" (AttribStringArg s),_,_,_)) -> Some s | _ -> None) + (fun _ -> None) // We do not respect this attribute for provided methods + let flagSearch (propName:string) = + TryBindMethInfoAttribute cenv.g mBuilderVal cenv.g.attrib_CustomOperationAttribute methInfo + (fun _ -> None) // We do not respect this attribute for IL methods + (function (Attrib(_,_,_,ExtractAttribNamedArg propName (AttribBoolArg b),_,_,_)) -> Some b | _ -> None) + (fun _ -> None)// We do not respect this attribute for provided methods + let maintainsVarSpaceUsingBind = defaultArg (flagSearch "MaintainsVariableSpaceUsingBind") false + let maintainsVarSpace = defaultArg (flagSearch "MaintainsVariableSpace") false + let allowInto = defaultArg (flagSearch "AllowIntoPattern") false + let isLikeZip = defaultArg (flagSearch "IsLikeZip") false + let isLikeJoin = defaultArg (flagSearch "IsLikeJoin" ) false + let isLikeGroupJoin = defaultArg (flagSearch "IsLikeGroupJoin" ) false + + match nameSearch with + | None -> None + | Some nm -> Some (nm, maintainsVarSpaceUsingBind, maintainsVarSpace, allowInto, isLikeZip, isLikeJoin, isLikeGroupJoin, joinConditionWord, methInfo)) let customOperationMethodsIndexedByKeyword = customOperationMethods @@ -8851,7 +8849,7 @@ and TcMethodApplication let GenerateMatchingSimpleArgumentTypes (calledMeth:MethInfo) = let curriedMethodArgAttribs = calledMeth.GetParamAttribs(cenv.amap, mItem) curriedMethodArgAttribs - |> List.map (fun args -> List.filter isSimpleFormalArg args |> NewInferenceTypes) + |> List.map (List.filter isSimpleFormalArg >> NewInferenceTypes) let UnifyMatchingSimpleArgumentTypes exprTy (calledMeth:MethInfo) = let curriedArgTys = GenerateMatchingSimpleArgumentTypes calledMeth @@ -11342,7 +11340,9 @@ let TcOpenDecl tcSink g amap m scopem env (longId : Ident list) = let modrefs = ForceRaise (TcModuleOrNamespaceLidAndPermitAutoResolve env amap longId) // validate opened namespace names - longId |> List.iter (fun id -> if id.idText <> MangledGlobalName then CheckNamespaceModuleOrTypeName g id) + for id in longId do + if id.idText <> MangledGlobalName then + CheckNamespaceModuleOrTypeName g id let IsPartiallyQualifiedNamespace (modref: ModuleOrNamespaceRef) = let (CompPath(_,p)) = modref.CompilationPath From a1ab53f301507cdf414154ca1f687d8b20fa3736 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 13:13:27 +0200 Subject: [PATCH 175/334] Calc range only in error case --- src/fsharp/TypeChecker.fs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index fbe0205101e..45432af8f7d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -5141,16 +5141,13 @@ and TcExprFlex cenv flex ty (env: TcEnv) tpenv (e: SynExpr) = and TcExpr cenv ty (env: TcEnv) tpenv (expr: SynExpr) = - - let m = expr.Range - // Start an error recovery handler // Note the try/catch can lead to tail-recursion problems for iterated constructs, e.g. let... in... // So be careful! try TcExprNoRecover cenv ty env tpenv expr with e -> - + let m = expr.Range // Error recovery - return some rubbish expression, but replace/annotate // the type of the current expression with a type variable that indicates an error errorRecovery e m From c2e97c2e31a4f92cde1577b63bff827996fa876f Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 14:38:58 +0200 Subject: [PATCH 176/334] Inline displayenv --- src/fsharp/ConstraintSolver.fs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index cfe592e1c27..f5c85667967 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -767,12 +767,10 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace | _ -> localAbortD and SolveTypEqualsTypKeepAbbrevs csenv ndeep m2 trace ty1 ty2 = - let denv = csenv.DisplayEnv - // Back out of expansions of type abbreviations to give improved error messages. // Note: any "normalization" of equations on type variables must respect the trace parameter TryD (fun () -> SolveTypEqualsTyp csenv ndeep m2 trace ty1 ty2) - (function LocallyAbortOperationThatLosesAbbrevs -> ErrorD(ConstraintSolverTypesNotInEqualityRelation(denv,ty1,ty2,csenv.m,m2)) + (function LocallyAbortOperationThatLosesAbbrevs -> ErrorD(ConstraintSolverTypesNotInEqualityRelation(csenv.DisplayEnv,ty1,ty2,csenv.m,m2)) | err -> ErrorD err) and SolveTypEqualsTypEqns csenv ndeep m2 trace origl1 origl2 = From b641ce93531172dceefd48fab0fa7dc0106813b1 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 15:26:54 +0200 Subject: [PATCH 177/334] Inline csenv.DisplayEnv --- src/fsharp/ConstraintSolver.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index f5c85667967..66156fea1af 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -654,7 +654,7 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = /// Propagate all effects of adding this constraint, e.g. to solve other variables let rec SolveTyparEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 trace ty1 ty = let m = csenv.m - let denv = csenv.DisplayEnv + DepthCheck ndeep m ++ (fun () -> match ty1 with | TType_var r | TType_measure (MeasureVar r) -> @@ -662,7 +662,7 @@ let rec SolveTyparEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 trace ty1 ty = if typeEquiv csenv.g ty1 ty then CompleteD else // The famous 'occursCheck' check to catch "infinite types" like 'a = list<'a> - see also https://github.com/Microsoft/visualfsharp/issues/1170 - if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo,denv,ty1,ty,m,m2)) else + if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo,csenv.DisplayEnv,ty1,ty,m,m2)) else // Note: warn _and_ continue! CheckWarnIfRigid csenv ty1 r ty ++ (fun () -> From e23c09424cf3a03740f5643b25e0e3d898057611 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 15:27:09 +0200 Subject: [PATCH 178/334] Optimize NameResolution --- src/fsharp/NameResolution.fs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 7da5e0379f7..27030f84773 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -696,13 +696,22 @@ let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv (modrefs: Module and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) m root nenv (modref:ModuleOrNamespaceRef) = let pri = NextExtensionMethodPriority() let mty = modref.ModuleOrNamespaceType - let tycons = mty.TypeAndExceptionDefinitions + + let mutable state = { nenv with eDisplayEnv = nenv.eDisplayEnv.AddOpenModuleOrNamespace modref } + + for exnc in mty.ExceptionDefinitions do + let tcref = modref.NestedTyconRef exnc + if IsEntityAccessible amap m ad tcref then + state <- AddExceptionDeclsToNameEnv BulkAdd.Yes state tcref + + let nenv = state + + let tcrefs = + mty.TypeAndExceptionDefinitions + |> List.choose (fun tycon -> + let tcref = modref.NestedTyconRef tycon + if IsEntityAccessible amap m ad tcref then Some(tcref) else None) - let exncs = mty.ExceptionDefinitions - let nenv = { nenv with eDisplayEnv= nenv.eDisplayEnv.AddOpenModuleOrNamespace modref } - let tcrefs = tycons |> List.map modref.NestedTyconRef |> List.filter (IsEntityAccessible amap m ad) - let exrefs = exncs |> List.map modref.NestedTyconRef |> List.filter (IsEntityAccessible amap m ad) - let nenv = (nenv,exrefs) ||> List.fold (AddExceptionDeclsToNameEnv BulkAdd.Yes) let nenv = (nenv,tcrefs) ||> AddTyconRefsToNameEnv BulkAdd.Yes false g amap m false let vrefs = mty.AllValsAndMembers.ToFlatList() @@ -722,7 +731,7 @@ and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) // open M1 // // The list contains [M1b; M1a] -and AddModulesAndNamespacesContentsToNameEnv g amap ad m root nenv modrefs = +and AddModulesAndNamespacesContentsToNameEnv g amap ad m root nenv modrefs = (modrefs, nenv) ||> List.foldBack (fun modref acc -> AddModuleOrNamespaceContentsToNameEnv g amap ad m root acc modref) /// Add a single modules or namespace to the name resolution environment From cc37e59b30fb057895430ad431a29162c1c226c5 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 25 May 2016 11:02:46 +0200 Subject: [PATCH 179/334] feedback round --- src/fsharp/NameResolution.fs | 49 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 27030f84773..8f0772bc4c4 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -694,34 +694,33 @@ let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv (modrefs: Module /// Add the contents of a module or namespace to the name resolution environment and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain) m root nenv (modref:ModuleOrNamespaceRef) = - let pri = NextExtensionMethodPriority() - let mty = modref.ModuleOrNamespaceType + let pri = NextExtensionMethodPriority() + let mty = modref.ModuleOrNamespaceType - let mutable state = { nenv with eDisplayEnv = nenv.eDisplayEnv.AddOpenModuleOrNamespace modref } + let nenv = + let mutable state = { nenv with eDisplayEnv = nenv.eDisplayEnv.AddOpenModuleOrNamespace modref } - for exnc in mty.ExceptionDefinitions do - let tcref = modref.NestedTyconRef exnc - if IsEntityAccessible amap m ad tcref then - state <- AddExceptionDeclsToNameEnv BulkAdd.Yes state tcref + for exnc in mty.ExceptionDefinitions do + let tcref = modref.NestedTyconRef exnc + if IsEntityAccessible amap m ad tcref then + state <- AddExceptionDeclsToNameEnv BulkAdd.Yes state tcref - let nenv = state - - let tcrefs = - mty.TypeAndExceptionDefinitions - |> List.choose (fun tycon -> - let tcref = modref.NestedTyconRef tycon - if IsEntityAccessible amap m ad tcref then Some(tcref) else None) - - let nenv = (nenv,tcrefs) ||> AddTyconRefsToNameEnv BulkAdd.Yes false g amap m false - let vrefs = - mty.AllValsAndMembers.ToFlatList() - |> FlatList.choose (fun x -> - if IsAccessible ad x.Accessibility then TryMkValRefInModRef modref x - else None) - |> FlatList.toArray - let nenv = AddValRefsToNameEnvWithPriority BulkAdd.Yes pri nenv vrefs - let nenv = (nenv,MakeNestedModuleRefs modref) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad - nenv + state + + let tcrefs = + mty.TypeAndExceptionDefinitions + |> List.choose (fun tycon -> + let tcref = modref.NestedTyconRef tycon + if IsEntityAccessible amap m ad tcref then Some(tcref) else None) + + let nenv = (nenv,tcrefs) ||> AddTyconRefsToNameEnv BulkAdd.Yes false g amap m false + let vrefs = + mty.AllValsAndMembers.ToFlatList() + |> FlatList.choose (fun x -> if IsAccessible ad x.Accessibility then TryMkValRefInModRef modref x else None) + |> FlatList.toArray + let nenv = AddValRefsToNameEnvWithPriority BulkAdd.Yes pri nenv vrefs + let nenv = (nenv,MakeNestedModuleRefs modref) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad + nenv /// Add a set of modules or namespaces to the name resolution environment // From 95981f5aeafecfdefb7bd0094a936fdd36fa209f Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 17:27:10 +0200 Subject: [PATCH 180/334] Simplify mapFold --- src/absil/illib.fs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index cd310874470..739edd1a33a 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -352,19 +352,14 @@ module List = let mem x l = contains x l // must be tail recursive - let mapFold f s l = + let mapFold (f:'a -> 'b -> 'c * 'a) (s:'a) (l:'b list) : 'c list * 'a = // microbenchmark suggested this implementation is faster than the simpler recursive one, and this function is called a lot let mutable s = s let mutable r = [] - let mutable l = l - let mutable finished = false - while not finished do - match l with - | x::xs -> let x',s' = f s x - s <- s' - r <- x' :: r - l <- xs - | _ -> finished <- true + for x in l do + let x',s' = f s x + s <- s' + r <- x' :: r List.rev r, s // Not tail recursive From 98fadf0cb7dcc50a4513f00f8eb8fc7db354fee0 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 18:20:05 +0200 Subject: [PATCH 181/334] Use replicate from FSharp.Core --- src/absil/il.fs | 2 +- src/absil/illib.fs | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 7bb6b0b3af4..2df801a0c3c 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -4641,7 +4641,7 @@ type ILTypeSigParser(tstring : string) = step() drop() - Some(ILArrayShape(List.repeat rank (Some 0, None))) + Some(ILArrayShape(List.replicate rank (Some 0, None))) else None diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 739edd1a33a..598b059a551 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -325,9 +325,6 @@ module List = module FrontAndBack = let (|NonEmpty|Empty|) l = match l with [] -> Empty | _ -> NonEmpty(frontAndBack l) - let replicate x n = - Array.toList (Array.create x n) - let range n m = [ n .. m ] let indexNotFound() = raise (new System.Collections.Generic.KeyNotFoundException("An index satisfying the predicate was not found in the collection")) @@ -382,9 +379,6 @@ module List = let count pred xs = List.fold (fun n x -> if pred x then n+1 else n) 0 xs - let rec private repeatAux n x acc = if n <= 0 then acc else repeatAux (n-1) x (x::acc) - let repeat n x = repeatAux n x [] - // WARNING: not tail-recursive let mapHeadTail fhead ftail = function | [] -> [] From 59d0820643a375dc19e71b98c8e0fc272e223aa5 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 18:22:06 +0200 Subject: [PATCH 182/334] We should be constistent and use List.contains --- src/absil/illib.fs | 4 ---- src/fsharp/CompileOps.fs | 14 +++++++------- src/fsharp/IlxGen.fs | 2 +- src/fsharp/PostInferenceChecks.fs | 2 +- src/fsharp/TastOps.fs | 2 +- src/fsharp/TypeChecker.fs | 6 +++--- src/fsharp/fsc.fs | 2 +- src/fsharp/lex.fsl | 2 +- src/fsharp/lexhelp.fs | 2 +- 9 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 598b059a551..c513757b007 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -339,15 +339,11 @@ module List = | [] -> false | ((h,_)::t) -> x = h || memAssoc x t - let rec contains x l = match l with [] -> false | h::t -> x = h || contains x t - let rec memq x l = match l with | [] -> false | h::t -> LanguagePrimitives.PhysicalEquality x h || memq x t - let mem x l = contains x l - // must be tail recursive let mapFold (f:'a -> 'b -> 'c * 'a) (s:'a) (l:'b list) : 'c list * 'a = // microbenchmark suggested this implementation is faster than the simpler recursive one, and this function is called a lot diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 64ff1917963..7fd5f7428ed 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -392,7 +392,7 @@ let GetWarningLevel err = let warningOn err level specificWarnOn = let n = GetErrorNumber err - List.mem n specificWarnOn || + List.contains n specificWarnOn || // Some specific warnings are never on by default, i.e. unused variable warnings match n with | 1182 -> false // chkUnusedValue - off by default @@ -2338,7 +2338,7 @@ type TcConfigBuilder = if not exists then warning(Error(FSComp.SR.buildSearchDirectoryNotFound(absolutePath),m)); exists | None -> false - if ok && not (List.mem absolutePath tcConfigB.includes) then + if ok && not (List.contains absolutePath tcConfigB.includes) then tcConfigB.includes <- tcConfigB.includes ++ absolutePath member tcConfigB.AddLoadedSource(m,path,pathLoadedFrom) = @@ -2351,7 +2351,7 @@ type TcConfigBuilder = | None -> // File doesn't exist in the paths. Assume it will be in the load-ed from directory. ComputeMakePathAbsolute pathLoadedFrom path - if not (List.mem path (List.map snd tcConfigB.loadedSources)) then + if not (List.contains path (List.map snd tcConfigB.loadedSources)) then tcConfigB.loadedSources <- tcConfigB.loadedSources ++ (m,path) @@ -3086,13 +3086,13 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) = let ReportWarning (globalWarnLevel : int, specificWarnOff : int list, specificWarnOn : int list) err = let n = GetErrorNumber err - warningOn err globalWarnLevel specificWarnOn && not (List.mem n specificWarnOff) + warningOn err globalWarnLevel specificWarnOn && not (List.contains n specificWarnOff) let ReportWarningAsError (globalWarnLevel : int, specificWarnOff : int list, specificWarnOn : int list, specificWarnAsError : int list, specificWarnAsWarn : int list, globalWarnAsError : bool) err = warningOn err globalWarnLevel specificWarnOn && - not (List.mem (GetErrorNumber err) specificWarnAsWarn) && - ((globalWarnAsError && not (List.mem (GetErrorNumber err) specificWarnOff)) || - List.mem (GetErrorNumber err) specificWarnAsError) + not (List.contains (GetErrorNumber err) specificWarnAsWarn) && + ((globalWarnAsError && not (List.contains (GetErrorNumber err) specificWarnOff)) || + List.contains (GetErrorNumber err) specificWarnAsError) //---------------------------------------------------------------------------- // Scoped #nowarn pragmas diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index e922edacc41..5192b1e4600 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -5618,7 +5618,7 @@ and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attr emptyILEvents, mkILCustomAttrs (GenAttrs cenv eenv attribs @ - (if List.mem tref.Name [TypeNameForImplicitMainMethod cloc; TypeNameForInitClass cloc; TypeNameForPrivateImplementationDetails cloc] + (if List.contains tref.Name [TypeNameForImplicitMainMethod cloc; TypeNameForInitClass cloc; TypeNameForPrivateImplementationDetails cloc] then [ (* mkCompilerGeneratedAttribute *) ] else [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Module)])), initTrigger) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 34f8ae804cf..bfb70df80cc 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1257,7 +1257,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = | None -> [] let namesOfMethodsThatMayDifferOnlyInReturnType = ["op_Explicit";"op_Implicit"] (* hardwired *) - let methodUniquenessIncludesReturnType (minfo:MethInfo) = List.mem minfo.LogicalName namesOfMethodsThatMayDifferOnlyInReturnType + let methodUniquenessIncludesReturnType (minfo:MethInfo) = List.contains minfo.LogicalName namesOfMethodsThatMayDifferOnlyInReturnType let MethInfosEquivWrtUniqueness eraseFlag m minfo minfo2 = if methodUniquenessIncludesReturnType minfo then MethInfosEquivByNameAndSig eraseFlag true cenv.g cenv.amap m minfo minfo2 diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 5f6269d2384..4c476d7b2c3 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -2210,7 +2210,7 @@ module PrettyTypes = begin choose (tp::tps) (typeIndex, measureIndex) acc let tryName (nm, typeIndex, measureIndex) f = - if List.mem nm alreadyInUse then + if List.contains nm alreadyInUse then f() else useThisName (nm, typeIndex, measureIndex) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index fbe0205101e..515cdd5a0c8 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2878,7 +2878,7 @@ let BuildPossiblyConditionalMethodCall cenv env isMutable m isProp minfo valUseF let conditionalCallDefineOpt = TryFindMethInfoStringAttribute cenv.g m cenv.g.attrib_ConditionalAttribute minfo match conditionalCallDefineOpt with - | Some(d) when not (List.mem d cenv.conditionalDefines) -> + | Some(d) when not (List.contains d cenv.conditionalDefines) -> // Methods marked with 'Conditional' must return 'unit' UnifyTypes cenv env m cenv.g.unit_ty (minfo.GetFSharpReturnTy(cenv.amap, m, minst)) @@ -5643,7 +5643,7 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = | SynExpr.TraitCall(tps,memSpfn,arg,m) -> let (TTrait(_,logicalCompiledName,_,argtys,returnTy,_) as traitInfo),tpenv = TcPseudoMemberSpec cenv NewTyparsOK env tps tpenv memSpfn m - if List.mem logicalCompiledName BakedInTraitConstraintNames then + if List.contains logicalCompiledName BakedInTraitConstraintNames then warning(BakedInMemberConstraintName(logicalCompiledName,m)) let returnTy = GetFSharpViewOfReturnType cenv.g returnTy @@ -9835,7 +9835,7 @@ and TcAttribute cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let conditionalCallDefineOpt = TryFindTyconRefStringAttribute cenv.g mAttr cenv.g.attrib_ConditionalAttribute tcref match conditionalCallDefineOpt with - | Some d when not (List.mem d cenv.conditionalDefines) -> + | Some d when not (List.contains d cenv.conditionalDefines) -> [] | _ -> diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 30354890769..bb90d564ef1 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -228,7 +228,7 @@ let AdjustForScriptCompile(tcConfigB:TcConfigBuilder,commandLineSourceFiles,lexR let tcConfig = TcConfig.Create(tcConfigB,validate=false) let AddIfNotPresent(filename:string) = - if not(!allSources |> List.mem filename) then + if not(!allSources |> List.contains filename) then allSources := filename::!allSources let AppendClosureInformation(filename) = diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 6532490338a..e807f71418c 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -606,7 +606,7 @@ rule token args skip = parse | anywhite* "#if" anywhite+ anystring { let m = lexbuf.LexemeRange - let lookup id = List.mem id args.defines + let lookup id = List.contains id args.defines let lexed = lexeme lexbuf let isTrue = evalIfDefExpression lexbuf.StartPos args lookup lexed args.ifdefStack := (IfDefIf,m) :: !(args.ifdefStack); diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 6aa2c1f18d7..25f90ab688f 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -321,7 +321,7 @@ module Keywords = args.resourceManager.InternIdentifierToken s let KeywordOrIdentifierToken args (lexbuf:UnicodeLexing.Lexbuf) s = - if not permitFsharpKeywords && List.mem s unreserveWords then + if not permitFsharpKeywords && List.contains s unreserveWords then // You can assume this condition never fires - this is a deprecated, undocumented command line option anyway, we can ignore it. IdentifierToken args lexbuf s else From 86b80def3fa4b39867385d3afbadded13944c379 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 18:45:49 +0200 Subject: [PATCH 183/334] Use List.last from FSharp.Core --- src/absil/illib.fs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index c513757b007..ec6498fbc67 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -319,9 +319,7 @@ module List = | x::xs,y::ys -> let cxy = eltOrder.Compare(x,y) if cxy=0 then loop xs ys else cxy loop xs ys } - - - let rec last l = match l with [] -> failwith "last" | [h] -> h | _::t -> last t + module FrontAndBack = let (|NonEmpty|Empty|) l = match l with [] -> Empty | _ -> NonEmpty(frontAndBack l) From 87d0802377b964976490d90d308f405ec7322fe1 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 18:53:54 +0200 Subject: [PATCH 184/334] Use List.singleton from FSharp.Core --- src/absil/illib.fs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index ec6498fbc67..ee80b86c5a8 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -383,8 +383,6 @@ module List = let l, s = mapFold f s l List.concat l, s - let singleton x = [x] - let collect2 f xs ys = List.concat (List.map2 f xs ys) let toArraySquared xss = xss |> List.map List.toArray |> List.toArray From fe2b8155282d725f001ce3d9df56b83e623f5335 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 18:59:39 +0200 Subject: [PATCH 185/334] Use Array.forall2 from FSharp.Core --- src/absil/illib.fs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index ee80b86c5a8..b6c96858425 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -100,13 +100,6 @@ module Array = i <- i + 1 if eq then inp else res - let forall2 f (arr1:'T array) (arr2:'T array) = - let len1 = arr1.Length - let len2 = arr2.Length - if len1 <> len2 then invalidArg "Array.forall2" "len1" - let rec loop i = (i >= len1) || (f arr1.[i] arr2.[i] && loop (i+1)) - loop 0 - let lengthsEqAndForall2 p l1 l2 = Array.length l1 = Array.length l2 && Array.forall2 p l1 l2 From 3fa05c539b488c6b364426e431e7fc0dddd45ba3 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 20 May 2016 19:02:02 +0200 Subject: [PATCH 186/334] Use Array.take from FSharp.Core --- src/absil/illib.fs | 2 -- src/fsharp/TypeChecker.fs | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index b6c96858425..e25067f7030 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -85,8 +85,6 @@ module Order = module Array = - let take n xs = xs |> Seq.take n |> Array.ofSeq - let mapq f inp = match inp with | [| |] -> inp diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 515cdd5a0c8..66ad61c690d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9457,16 +9457,16 @@ and TcMethodArg cenv env (lambdaPropagationInfo,tpenv) (lambdaPropagationInfoF // Apply the F# 3.1 rule for extracting information for lambdas // - // Before we check the argume, check to see if we can propagate info from a called lambda expression into the arguments of a received lambda + // Before we check the argument, check to see if we can propagate info from a called lambda expression into the arguments of a received lambda begin if lambdaPropagationInfoForArg.Length > 0 then let allOverloadsAreFuncOrMismatchForThisArg = lambdaPropagationInfoForArg |> Array.forall (function ArgDoesNotMatch | CallerLambdaHasArgTypes _ -> true | NoInfo | CalledArgMatchesType _ -> false) if allOverloadsAreFuncOrMismatchForThisArg then - let overloadsWhichAreFuncAtThisPosition = lambdaPropagationInfoForArg |> Array.choose (function CallerLambdaHasArgTypes r -> Some r | _ -> None) + let overloadsWhichAreFuncAtThisPosition = lambdaPropagationInfoForArg |> Array.choose (function CallerLambdaHasArgTypes r -> Some (List.toArray r) | _ -> None) if overloadsWhichAreFuncAtThisPosition.Length > 0 then - let minFuncArity = overloadsWhichAreFuncAtThisPosition |> Array.minBy List.length |> List.length + let minFuncArity = overloadsWhichAreFuncAtThisPosition |> Array.minBy Array.length |> Array.length let prefixOfLambdaArgsForEachOverload = overloadsWhichAreFuncAtThisPosition |> Array.map (Array.take minFuncArity) if prefixOfLambdaArgsForEachOverload.Length > 0 then From 7c27eb849723d1c14fec1cb06af7a42b2e0f5c38 Mon Sep 17 00:00:00 2001 From: enricosada Date: Wed, 25 May 2016 21:57:09 +0200 Subject: [PATCH 187/334] remove nuget.org v2 feed, the v3 (faster) is already defined --- .nuget/NuGet.Config | 1 - lkg/NuGet.Config | 1 - 2 files changed, 2 deletions(-) diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config index 8ef59b9c202..748f1076f6e 100644 --- a/.nuget/NuGet.Config +++ b/.nuget/NuGet.Config @@ -11,7 +11,6 @@ - diff --git a/lkg/NuGet.Config b/lkg/NuGet.Config index bb35d21f250..5f26bdd4195 100644 --- a/lkg/NuGet.Config +++ b/lkg/NuGet.Config @@ -8,7 +8,6 @@ - From a2c8216c0db85223ab9a922f7f53536139ed0394 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 26 May 2016 16:34:07 +0100 Subject: [PATCH 188/334] fixes to order or processing --- src/fsharp/TypeChecker.fs | 7 ++++--- tests/fsharp/core/members/basics-hw-mutrec/test.fsx | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 95214c911b5..ea2c6b7f3d6 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13020,10 +13020,11 @@ module MutRecBindingChecking = let lets = decls |> List.collect (function MutRecShape.Lets binds -> getVals binds | _ -> []) // Add the type definitions, exceptions, modules and "open" declarations - let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envAbove else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envAbove + let envForDecls = envAbove + let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) + let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) - let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) let envForDecls = (envForDecls, moduleAbbrevs) ||> List.fold (TcModuleAbbrevDecl cenv scopem) let envForDecls = AddLocalVals cenv.tcSink scopem lets envForDecls envForDecls) @@ -16068,7 +16069,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu loop (match parent with ParentNone -> true | Parent _ -> false) [] defs - let tpenv = emptyUnscopedTyparEnv // TODO: be more careful about tpenv, preserving old behaviour but not coalescing typars across mutrec definitions + let tpenv = emptyUnscopedTyparEnv let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns,m,scopem) // Check the assembly attributes diff --git a/tests/fsharp/core/members/basics-hw-mutrec/test.fsx b/tests/fsharp/core/members/basics-hw-mutrec/test.fsx index 03f308debf1..c3421cee247 100644 --- a/tests/fsharp/core/members/basics-hw-mutrec/test.fsx +++ b/tests/fsharp/core/members/basics-hw-mutrec/test.fsx @@ -2639,6 +2639,7 @@ module FSharp_1_0_bug_1748_Problem_Calling_A_Base_Member_A = begin end +(* module FSharp_1_0_bug_1748_Problem_Calling_A_Base_Member_B = begin type Exp<'c when 'c :> Exp<'c>> = abstract Print : unit -> unit @@ -2695,7 +2696,7 @@ module FSharp_1_0_bug_1748_Problem_Calling_A_Base_Member_B = begin do e3.Print() System.Console.Write(" = " + e3.Eval().ToString()) end - +*) module Test1 = begin @@ -3536,16 +3537,16 @@ module SlicingTests = f.[*] <- [3] module Bug_FSharp_1_0_3246 = - type r1 = + type R1 = { x : int } static member Empty = { x = 3 } - and r2 = + and R2 = { x : int } static member Empty = { x = 3 } - let r1 : r1 = r1.Empty - let r2 : r2 = r2.Empty + let r1 : R1 = R1.Empty + let r2 : R2 = R2.Empty module First_class_use_of_non_overloaded_method_should_detuple_1 = From 1b46daf5ba7f4776d84f8d4b15e4bfad37b6554a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 26 May 2016 16:53:23 +0100 Subject: [PATCH 189/334] fix reporting of tycons --- src/fsharp/TypeChecker.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ea2c6b7f3d6..f408ddc02f9 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13022,7 +13022,7 @@ module MutRecBindingChecking = // Add the type definitions, exceptions, modules and "open" declarations let envForDecls = envAbove let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) - let envForDecls = if report then AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls else AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls + let envForDecls = if report then AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls else AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) let envForDecls = (envForDecls, moduleAbbrevs) ||> List.fold (TcModuleAbbrevDecl cenv scopem) From d2f5d56719c64e0de7623d52982fa51232295674 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 26 May 2016 18:12:52 +0100 Subject: [PATCH 190/334] fix tests --- .../basics-hw-mutrec/{test.fsx => test.fs} | 0 tests/fsharp/typecheck/sigs/neg95.bsl | 12 ++++++ tests/fsharp/typecheck/sigs/neg95.fs | 41 +++++++++++++++++++ 3 files changed, 53 insertions(+) rename tests/fsharp/core/members/basics-hw-mutrec/{test.fsx => test.fs} (100%) create mode 100644 tests/fsharp/typecheck/sigs/neg95.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg95.fs diff --git a/tests/fsharp/core/members/basics-hw-mutrec/test.fsx b/tests/fsharp/core/members/basics-hw-mutrec/test.fs similarity index 100% rename from tests/fsharp/core/members/basics-hw-mutrec/test.fsx rename to tests/fsharp/core/members/basics-hw-mutrec/test.fs diff --git a/tests/fsharp/typecheck/sigs/neg95.bsl b/tests/fsharp/typecheck/sigs/neg95.bsl new file mode 100644 index 00000000000..e57936f6d62 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg95.bsl @@ -0,0 +1,12 @@ + +neg95.fs(3,5,3,26): typecheck error FS3199: The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored + +neg95.fs(11,12,11,18): typecheck error FS3200: In a recursive declaration group, 'open' declarations must come first in each module + +neg95.fs(19,7,19,22): typecheck error FS3201: In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations + +neg95.fs(26,12,26,18): typecheck error FS3200: In a recursive declaration group, 'open' declarations must come first in each module + +neg95.fs(32,12,32,18): typecheck error FS3200: In a recursive declaration group, 'open' declarations must come first in each module + +neg95.fs(39,12,39,18): typecheck error FS3200: In a recursive declaration group, 'open' declarations must come first in each module diff --git a/tests/fsharp/typecheck/sigs/neg95.fs b/tests/fsharp/typecheck/sigs/neg95.fs new file mode 100644 index 00000000000..58415b312fb --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg95.fs @@ -0,0 +1,41 @@ +namespace rec Neg95 + + module rec RecImplied = + let x = 1 + +namespace Neg95B + + module rec ModuleAbbreviationsAfterOpen = + module M = List + + open System + + module rec ModuleAbbreviationsBeforeLet = + + open System + + let x = 1 + + module M = List + + + module rec OpenBeforeLet = + + let x = 1 + + open System + + module rec OpenBeforeType = + + type C() = class end + + open System + + + module rec OpenBeforeException = + + exception E of string + + open System + + //module rec RecNotAllowedOnModuleAbbreviation = List From d8b3d35b9cb027999fba188c2f5b5e3a15be2cde Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 27 May 2016 12:58:00 +0100 Subject: [PATCH 191/334] fix test --- .../global/E_AsType.fsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx index 25d49277f83..02787a4807e 100644 --- a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx +++ b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx @@ -2,7 +2,7 @@ // Regression test for FSHARP1.0:4937, FSHARP1.0:5295 // Usage of 'global' - global is a keyword //Invalid namespace, module, type or union case name -//'global' may only be used as the first name in a qualified path + // OK From d60abf7edb18310d1338a2d7ff87fdeb8c4d3f32 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 27 May 2016 13:23:24 +0100 Subject: [PATCH 192/334] ensure type names get name resolution recorded --- src/fsharp/TypeChecker.fs | 28 ++++++++++++------- .../global/E_AsType.fsx | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a9371c74722..07d06d05bf2 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15129,15 +15129,23 @@ module TcDeclarations = begin /// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an /// intrinsic or extrinsic extension - let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envInitial inSig m (typars:SynTyparDecl list) cs longPath = - let ad = envInitial.eAccessRights + let private ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls inSig m (typars:SynTyparDecl list) cs longPath = + let ad = envForDecls.eAccessRights let tcref = match tyconOpt with - | Some tycon when isAtOriginalTyconDefn -> mkLocalTyconRef tycon + | Some tycon when isAtOriginalTyconDefn -> + + // This records a name resolution of the type at the location + let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs typars.Length + ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No + |> ignore + + mkLocalTyconRef tycon + | _ -> let resInfo = TypeNameResolutionStaticArgsInfo.FromTyArgs typars.Length - match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envInitial.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with + match ResolveTypeLongIdent cenv.tcSink cenv.nameResolver ItemOccurence.Binding OpenQualified envForDecls.eNameResEnv ad longPath resInfo PermitDirectReferenceToGeneratedType.No with | Result res -> res | res when inSig && longPath.Length = 1 -> errorR(Deprecated(FSComp.SR.tcReservedSyntaxForAugmentation(),m)) @@ -15161,7 +15169,7 @@ module TcDeclarations = begin else let isInSameModuleOrNamespace = - match envInitial.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with + match envForDecls.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with | Some tycon -> (tyconOrder.Compare(tcref.Deref,tycon) = 0) | None -> //false @@ -15178,10 +15186,10 @@ module TcDeclarations = begin // not recoverable error(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) - let declaredTypars = TcTyparDecls cenv envInitial typars - let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envInitial + let declaredTypars = TcTyparDecls cenv envForDecls typars + let envForTycon = AddDeclaredTypars CheckForDuplicateTypars declaredTypars envForDecls let _tpenv = TcTyparConstraints cenv NoNewTypars CheckCxs ItemOccurence.UseInType envForTycon emptyUnscopedTyparEnv cs - declaredTypars |> List.iter (SetTyparRigid cenv.g envInitial.DisplayEnv m) + declaredTypars |> List.iter (SetTyparRigid cenv.g envForDecls.DisplayEnv m) if not (typarsAEquiv cenv.g TypeEquivEnv.Empty reqTypars declaredTypars) then errorR(Error(FSComp.SR.tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(tcref.DisplayNameWithStaticParametersAndUnderscoreTypars), m)) ExtrinsicExtensionBinding, declaredTypars @@ -15430,10 +15438,10 @@ module TcDeclarations = begin let SplitMutRecDefns mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn - let private PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envMutRecPrelim (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclRange) = + let private PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclRange) = let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo - let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envMutRecPrelim false tyDeclRange typars cs longPath + let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls false tyDeclRange typars cs longPath let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) // NewSlotsOK only on fsobjs diff --git a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx index 02787a4807e..25d49277f83 100644 --- a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx +++ b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/global/E_AsType.fsx @@ -2,7 +2,7 @@ // Regression test for FSHARP1.0:4937, FSHARP1.0:5295 // Usage of 'global' - global is a keyword //Invalid namespace, module, type or union case name - +//'global' may only be used as the first name in a qualified path // OK From 63b974b7a7199921187a1a68f542bc5b5fe6326a Mon Sep 17 00:00:00 2001 From: cartermp Date: Fri, 27 May 2016 16:34:55 -0700 Subject: [PATCH 193/334] Trim FSharp.Core package dependencies --- src/fsharp/FSharp.Core/project.json | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/project.json b/src/fsharp/FSharp.Core/project.json index 6912cae9c4b..d3ee8bd7886 100644 --- a/src/fsharp/FSharp.Core/project.json +++ b/src/fsharp/FSharp.Core/project.json @@ -1,14 +1,30 @@ { "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", + "Microsoft.NETCore.Runtime": "1.0.2-rc2-24027", + "System.Collections": "4.0.11-rc2-24027", + "System.Console": "4.0.0-rc2-24027", + "System.Diagnostics.Debug": "4.0.11-rc2-24027", + "System.Diagnostics.Tools": "4.0.1-rc2-24027", + "System.Globalization": "4.0.11-rc2-24027", + "System.IO": "4.1.0-rc2-24027", + "System.Linq": "4.1.0-rc2-24027", "System.Linq.Expressions": "4.0.11-rc2-24027", "System.Linq.Queryable": "4.0.1-rc2-24027", - "System.Reflection.TypeExtensions": "4.1.0-rc2-24027", "System.Net.Requests": "4.0.11-rc2-24027", + "System.Reflection": "4.1.0-rc2-24027", + "System.Reflection.Extensions": "4.0.1-rc2-24027", + "System.Resources.ResourceManager":"4.0.1-rc2-24027", + "System.Runtime": "4.1.0-rc2-24027", + "System.Runtime.Extensions": "4.1.0-rc2-24027", + "System.Runtime.Numerics": "4.0.1-rc2-24027", + "System.Text.RegularExpressions": "4.0.12-rc2-24027", + "System.Threading": "4.0.11-rc2-24027", + "System.Threading.Tasks": "4.0.11-rc2-24027", "System.Threading.Tasks.Parallel": "4.0.1-rc2-24027", "System.Threading.Thread": "4.0.0-rc2-24027", "System.Threading.ThreadPool": "4.0.10-rc2-24027", + "System.Threading.Timer": "4.0.1-rc2-24027" }, "runtimes": { "win7-x86": { }, From 56b4d559910dbb470fe692ef1d0f9bf137737a85 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 25 May 2016 15:35:17 +0200 Subject: [PATCH 194/334] Improve error reporting: Detect module declarations that incorrectly end with `=` - fixes #1214 --- src/fsharp/CompileOps.fs | 16 ++++++++++++---- src/fsharp/FSComp.txt | 1 + .../basic/E_NoNamespaceModuleDec02a.fs | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 70666dd6b23..4ff176e17ed 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -3235,8 +3235,12 @@ let PostParseModuleImpl (_i,defaultNamespace,isLastCompiland,filename,impl) = | ParsedImplFileFragment.AnonModule (defs,m)-> let isLast, isExe = isLastCompiland - if not (isLast && isExe ) && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix (String.lowercase filename))) then - errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),trimRangeToLine m)) + let lower = String.lowercase filename + if not (isLast && isExe) && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix lower)) then + match defs with + | SynModuleDecl.NestedModule(_) :: _ -> errorR(Error(FSComp.SR.noEqualSignAfterModule(),trimRangeToLine m)) + | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),trimRangeToLine m)) + let modname = ComputeAnonModuleName (nonNil defs) defaultNamespace filename (trimRangeToLine m) SynModuleOrNamespace(modname,true,defs,PreXmlDoc.Empty,[],None,m) @@ -3259,8 +3263,12 @@ let PostParseModuleSpec (_i,defaultNamespace,isLastCompiland,filename,intf) = | ParsedSigFileFragment.AnonModule (defs,m) -> let isLast, isExe = isLastCompiland - if not (isLast && isExe) && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix (String.lowercase filename))) then - errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),m)) + let lower = String.lowercase filename + if not (isLast && isExe) && not (doNotRequireNamespaceOrModuleSuffixes |> List.exists (Filename.checkSuffix lower)) then + match defs with + | SynModuleSigDecl.NestedModule(_) :: _ -> errorR(Error(FSComp.SR.noEqualSignAfterModule(),m)) + | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(),m)) + let modname = ComputeAnonModuleName (nonNil defs) defaultNamespace filename (trimRangeToLine m) SynModuleOrNamespaceSig(modname,true,defs,PreXmlDoc.Empty,[],None,m) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 04ac2ac620a..28b15426e03 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -42,6 +42,7 @@ buildCouldNotReadVersionInfoFromMscorlib,"Could not read version from mscorlib.d 220,buildAssemblyResolutionFailed,"Assembly resolution failure at or near this location" 221,buildImplicitModuleIsNotLegalIdentifier,"The declarations in this file will be placed in an implicit module '%s' based on the file name '%s'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file." 222,buildMultiFileRequiresNamespaceOrModule,"Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration." +222,noEqualSignAfterModule,"Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error." 223,buildMultipleToplevelModules,"This file contains multiple declarations of the form 'module SomeNamespace.SomeModule'. Only one declaration of this form is permitted in a file. Change your file to use an initial namespace declaration and/or use 'module ModuleName = ...' to define your modules." 224,buildOptionRequiresParameter,"Option requires parameter: %s" 225,buildCouldNotFindSourceFile,"Source file '%s' could not be found" diff --git a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/basic/E_NoNamespaceModuleDec02a.fs b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/basic/E_NoNamespaceModuleDec02a.fs index 780614d5292..cf4a81f9441 100644 --- a/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/basic/E_NoNamespaceModuleDec02a.fs +++ b/tests/fsharpqa/Source/Conformance/ImplementationFilesAndSignatureFiles/NamespacesFragmentsAndImplementationFiles/basic/E_NoNamespaceModuleDec02a.fs @@ -2,7 +2,7 @@ // This testcase will emit a warning even though it contains a module, becase // it is a nested module and not a 'real' module -//Files in libraries or multiple-file applications must begin with a namespace or module declaration, e\.g\. 'namespace SomeNamespace\.SubNamespace' or 'module SomeNamespace\.SomeModule'\. Only the last source file of an application may omit such a declaration\.$ +//Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error. module ANestedModule = From ed93f9a6d337d1f87100bd59e939bddadccb70f0 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 14:14:56 +0100 Subject: [PATCH 195/334] add more tests --- .../dont.use.generated.signature | 1 + .../members/incremental-hw-mutrec/test.fsx | 724 ++++++++++++++++++ .../members/incremental-hw/dont.run.peverify | Bin 76 -> 0 bytes .../core/members/incremental-hw/test.fsx | 10 +- tests/fsharp/core/tests_core.fs | 336 ++------ 5 files changed, 785 insertions(+), 286 deletions(-) create mode 100644 tests/fsharp/core/members/incremental-hw-mutrec/dont.use.generated.signature create mode 100644 tests/fsharp/core/members/incremental-hw-mutrec/test.fsx delete mode 100644 tests/fsharp/core/members/incremental-hw/dont.run.peverify diff --git a/tests/fsharp/core/members/incremental-hw-mutrec/dont.use.generated.signature b/tests/fsharp/core/members/incremental-hw-mutrec/dont.use.generated.signature new file mode 100644 index 00000000000..c1301f0bf90 --- /dev/null +++ b/tests/fsharp/core/members/incremental-hw-mutrec/dont.use.generated.signature @@ -0,0 +1 @@ +foo diff --git a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx new file mode 100644 index 00000000000..b64bfe4212c --- /dev/null +++ b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx @@ -0,0 +1,724 @@ +// #Conformance #MemberDefinitions #Mutable #ObjectOrientedTypes #Classes #InterfacesAndImplementations #Recursion + + +module rec IncrementalHwMutrec + +//! Setup + +let failures = ref false +let report_failure () = stderr.WriteLine " NO"; failures := true +let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() + + +//! Address of incremental local mutable + +module AddresOfIncrementalClassLocalMutable = + + open System.Drawing + open System.Windows.Forms + let rr = new Rectangle() // <-------- value type + type LocalMutableTestA() = + let mutable mvarA = rr + member x.MethodA() = mvarA.X // <-------- require address of it for arg to getter + + + + +//! Address of mutable record field (related to above) + +module AddresOfMutableRecordField = + open System.Drawing + open System.Windows.Forms + + type RectR = { mutable field : Rectangle } + let f (x:RectR) = x.field.X <- 10 + let boxR = {field = new Rectangle() } + do assert(boxR.field.X=0) + do f boxR + do assert(boxR.field.X=10) + + + +//! Minor test + +module MinorTest = + type A<'a>(x:'a) = + + let (y:'a) = x + member this.X = y + + + let x1 = new A("abc") + let x2 = new A(3) + let x3 = new A(3L) + + + +//! Misc + +module Misc = + type 'a Area9aa(x) = + + let a = (x : 'a) + let f (y:'a) = y + + + type AList(a) = + let x1 = a + 1 + let y2 = x1 + 1 + let y3 = 3 + member pairs_this.Pair() = x1,y2 + + let a = new AList 12 + do assert( a.Pair() = (13,14) ) + + + +//! Wire prevously + +(* accepted *) +module WireOld = + [] + type 'a wire = + + abstract Send : 'a -> unit + abstract Listen : ('a -> unit) -> unit + new () = {} + member self.Event = self :> 'a IEvent + interface IEvent<'a> with + member x.Subscribe(handler) = failwith "nyi" + member x.AddHandler(handler) = failwith "nyi" + member x.RemoveHandler(handler) = failwith "nyi" + + + let createWire() = + let listeners = ref [] in + {new wire<'a>() with + member __.Send(x) = List.iter (fun f -> f x) !listeners + member __.Listen(f) = listeners := f :: !listeners + } + + + +//! Wire variations + +module WireVariations = + (* Accepted *) + type wire2(z) = + + let z = z + member this.Send(x) = 1 + z + x + + + (* Accepted *) + type 'a wire3(z) = + + let listeners = (z:'a) + member this.Send(x:'a) = x + + + (* Accepted *) + type wire4<'a>(z) = + + let listeners = let z:'a = z in ref ([] : ('a -> unit) list) + member this.Send(x:'a) = List.iter (fun f -> f x) !listeners + member this.Listen(f:'a -> unit) = listeners := f :: !listeners + + + (* Accepted *) + type 'a wire5(z) = + + let listeners = ref ([] : ('a -> unit) list) + member this.Send(x:'a) = let z:'a = z in List.iter (fun f -> f x) !listeners + member this.Listen(f:'a -> unit) = listeners := f :: !listeners + + + (* Accepted now - fixed tinst missing error *) + type 'a wire6(z) = + + let mutable listeners = ([] : ('a -> unit) list) + member this.Send(x:'a) = let z:'a = z in List.iter (fun f -> f x) listeners + member this.Listen(f:'a -> unit) = listeners <- f :: listeners + + + (* OK, now this types are asserted equal *) + type 'a wire7(z) = + + let listeners = 12 + let z : 'a = z + member this.SendA(x:int) = this,listeners + member this.SendB(x:int) = this,listeners + + + (* Soundness concern: should uses of let-fields force a member "this" to be ('a wire) typed? *) + type 'a wire8(z) = + + let z : 'a = z + let listeners = 12 + member this.SendA(x:int) = x,z,(this: 'a wire8) + member this.SendB(x:int) = x,z,(this: 'a wire8) + + + (* Accepted *) + type 'a wire9(z) = + + let mutable listeners = ([] : int list) + let z : 'a = z + member this.Send(x:int) = + let ls : int list = 1 :: 2 :: listeners in + List.map (fun x -> x+1) ls + + + (* Accepted *) + type 'a wire10(z) = + + let mutable listeners = ([] : int list) + let z : 'a = z + member this.Send(x:int) = + let ls : int list = listeners @ [1] in (* it seems listeners may have the wrong type... *) + List.map (fun f -> f) ls + + + (* Accepted *) + type 'a wire11(z) = + + let listeners = let z:int = z in ([] : int list) + member this.Send(x:'a) = (* List.iter (fun f -> ()) listeners *) + let xx : 'a wire11 = this in + Some (x,List.head listeners) + + + (* Accepted *) + type 'a wire12(z) = + + let listeners = let z:'a = z in ([] : int list) + member this.Send(x:'b) = (* List.iter (fun f -> ()) listeners *) + Some (this,x,List.head listeners) + + + (* OK, after avoid the value restriction *) + type wire13(z) = + + member this.Send(x:'b) = (ignore (z:int)); Some (this,x) + + + (* Accepted *) + type 'a wire14(z) = + + let mutable listeners = let z:int = z in ([] : int list) + member this.Send(x:'a) = (* List.iter (fun f -> ()) listeners *) + listeners + + + + +//! Area variations + +module AreaVariations = + (* Accepted *) + open System.Drawing + open System.Windows.Forms + open WireOld + + type Area1(x) = + + inherit Panel() + let x = x * 2 + + + type Area2(x) = + + inherit Panel() + let x = x * 2 + let mutable Bitmap = new Bitmap(100,100) + let mutable GC = Graphics.FromImage(Bitmap) + let fff (x:Area2) = x.Resize () + member this.Resize () = Bitmap <- new Bitmap(10,20) + + + type Area3(x) = + + let basePanel = let x = x:unit in new Panel() + let mutable Bitmap = new Bitmap(100,100) + let mutable GC = Graphics.FromImage(Bitmap) + let fff (x:Area3) = x.Resize () + member this.Resize () = Bitmap <- new Bitmap(10,20) + + + type Area4 = + + inherit Panel + member this.X() = base.Dock + + + type Area5(x) = + + inherit Panel() + let x = 1 + x + (**) + let mutable Bitmap = new Bitmap(100,100) + let mutable GC = Graphics.FromImage(Bitmap) (* GC for bitmap *) + let resizedWire = createWire() : (int*int) wire + let mutable Count = 0 + (**) + do base.BackColor <- Color.Black + do base.Dock <- DockStyle.Fill + do base.Cursor <- Cursors.Cross + // do base.Resize.Add(fun arg -> area.resize ()) (* use before defn risk *) + // do base.Paint .Add(fun args -> area.redrawDrawArea args.Graphics) (* use before defn risk *) + (**) + member this.ResizedE = resizedWire.Event + (**) + member this.Resize () = + let ww,hh = base.Width,base.Height in + if ww>0 && hh>0 then ( + Bitmap <- new Bitmap(ww,hh); + GC <- Graphics.FromImage(Bitmap); + resizedWire.Send((ww,hh)) + ) + (**) + // TODO: need to be able to call this.PriorMethod without this.qualification + // do base.Resize.Add(fun arg -> Resize ()) (* no risk *) + (**) + member this.RedrawDrawArea (gc:Graphics) = gc.DrawImage(Bitmap,new Point(0,0)) + // member this.Refresh() = using (base.CreateGraphics()) (fun gc -> RedrawDrawArea gc) + member this.Refresh2() = using (base.CreateGraphics()) (fun gc -> this.RedrawDrawArea gc) + (**) + // do base.Paint.Add(fun args -> RedrawDrawArea args.Graphics) (* no risk *) + // do base.Paint.Add(fun args -> .RedrawDrawArea args.Graphics) (* no risk *) + + + type Area5b(x) as self = + + inherit Panel() + let x = 1 + x + (**) + let mutable Bitmap = new Bitmap(100,100) + let mutable GC = Graphics.FromImage(Bitmap) (* GC for bitmap *) + let resizedWire = createWire() : (int*int) wire + let mutable Count = 0 + (**) + do self.BackColor <- Color.Black + do self.Dock <- DockStyle.Fill + do self.Cursor <- Cursors.Cross + // do self.Resize.Add(fun arg -> area.resize ()) (* use before defn risk *) + // do self.Paint .Add(fun args -> area.redrawDrawArea args.Graphics) (* use before defn risk *) + (**) + member this.ResizedE = resizedWire.Event + (**) + member this.Resize () = + let ww,hh = self.Width,self.Height in + if ww>0 && hh>0 then ( + Bitmap <- new Bitmap(ww,hh); + GC <- Graphics.FromImage(Bitmap); + resizedWire.Send((ww,hh)) + ) + (**) + // TODO: need to be able to call this.PriorMethod without this.qualification + // do self.Resize.Add(fun arg -> Resize ()) (* no risk *) + (**) + member this.RedrawDrawArea (gc:Graphics) = gc.DrawImage(Bitmap,new Point(0,0)) + // member this.Refresh() = using (self.CreateGraphics()) (fun gc -> RedrawDrawArea gc) + member this.Refresh2() = using (self.CreateGraphics()) (fun gc -> this.RedrawDrawArea gc) + (**) + // do self.Paint.Add(fun args -> RedrawDrawArea args.Graphics) (* no risk *) + // do self.Paint.Add(fun args -> .RedrawDrawArea args.Graphics) (* no risk *) + + + type Area6(x) = + + inherit Panel() + let x = 1 + x + do base.BackColor <- Color.Black + + + type Area7(x) = + + inherit Panel() + let a,b = x : int * int + do base.BackColor <- Color.Black + + + + + type 'a Area8(x) = + + inherit Panel() + let a,b = (x : int * int) + do base.BackColor <- Color.Black + let f (y:'a) = y + let xx = a + + + type 'a Area9(x) = + + let a = (x : 'a) + // let f (y:'a) = y + + + type 'a Area10 = + + val f : 'a -> 'a + new (x:int) = { f = fun x -> x} + + + + +//! Person + +(* Scala person example *) +module ScalaPersonExample = + type Person1(firstLastSpouse) = + + let firstName,lastName,spouse = firstLastSpouse + member x.FirstName = firstName : string + member x.LastName = lastName : string + member x.Spouse = spouse : Person1 option + member x.Introduction() = + "Hi, my name is " + firstName + " " + lastName + + (match spouse with + | None -> "." + | Some spouse -> " and this is my spouse, " + spouse.FirstName + " " + spouse.LastName + ".") + // TODO: the implicit ctor is not in scope for defining alt constructors. + // new (f,l) = new Person1(f,l,None) + + let pA = new Person1(("bob" ,"smith",None)) + let pB = new Person1(("jill","smith",Some pA)) + + + + +//! Forms + +module Forms1 = + open System.Drawing + open System.Windows.Forms + type DrawPanel(w) as c = + + inherit Panel() + do base.Width <- w + do base.Height <- w + do base.BackColor <- Color.Black + let mutable BM = new Bitmap(w,w) + let GC' = Graphics.FromImage(BM) + let refresh() = using (c.CreateGraphics()) (fun gc -> gc.DrawImage(BM,new Point(0,0))) + do c.Paint.Add(fun _ -> refresh()) + (*external*) + member this.Redraw() = refresh() + member this.GC = GC' + + + +module Forms2 = + + open System.Drawing + open System.Windows.Forms + type DrawPanel2 (w,h) as c = + + inherit Panel() + do base.Width <- w + do base.Height <- h + do base.BackColor <- Color.DarkBlue + let mutable BM = new Bitmap(w,w) + let refresh() = using (c.CreateGraphics()) (fun gc -> gc.DrawImage(BM,new Point(0,0))) + let GC' = Graphics.FromImage(BM) + let uuu = () + let u2 = uuu,uuu + (*external*) + do c.Paint.Add(fun _ -> refresh()) + member this.Redraw() = refresh() + member this.GC = GC' + + + //let form = new Form(Visible=true,AutoScroll=true) + //let dp = new DrawPanel2(800,400) + //do form.Controls.Add(dp) + //do dp.GC.DrawLine(Pens.White,10,20,30,40) + //do dp.Redraw() + + +module Regression1 = + (* Regression test: local vals of unit type are not given field storage (even if mutable) *) + type UnitTestA2 (x,y) = + + do printf "TestA %d\n" (x*y) + let u = () + let mutable mu = () + let mutable kept = false + member this.Unlikely() = mu <- (kept <- true; (* ensure effect is not optimised away *) + printf "Boo\n" + ) + member this.Kept with get() = kept + + let x = new UnitTestA2(1,2) + do x.Unlikely() + do assert(x.Kept = true) + + + +//! typar scoping + +module TyparScopeChecks = + (* typar scoping checks 1 *) + type ('a,'b) classB1(aa,bb) = + + let a = aa : 'a + let b = bb : 'b + let f (aaa:'a) (bbb:'b) = aaa,bbb + + + (* typar scoping checks *) + type ('a,'b) classB2(aa:'a,bb:'b) = + + let a = aa + let b = bb + let f (aaa:'a) (bbb:'b) = aaa,bbb + + + + + +module LocalLetRecTests = + //! local let rec test + + (* let rec tests *) + type LetRecClassA1 (a,b) = + + let a,b = a,b + let x = a*3 + b*2 + let rec fact n = if n=1 then 1 else n * fact (n-1) + member this.Fa() = fact a + member this.Fb() = fact b + + let lrCA1 = new LetRecClassA1(3,4) + let xa = lrCA1.Fa() + let xb = lrCA1.Fb() + + (* let rec tests *) + type LetRecClassA2 () = + + let rec odd n = printf "odd %d?\n" n; if n=0 then false else not(even (n-1)) + and even n = printf "even %d?\n" n; if n=0 then true else not(odd (n-1)) + member this.Even(x) = even x + member this.Odd(x) = odd x + + let lrCA2 = new LetRecClassA2() + let ex2 = lrCA2.Even(2) + let ex3 = lrCA2.Odd(3) + let ox2 = lrCA2.Odd(2) + let ox3 = lrCA2.Even(3) + + + //! local let rec test + + type nats = HD of int * (unit -> nats) + let rec ns = HD (2,(fun () -> HD (3,(fun () -> ns)))) + let rec take n (HD (x,xf)) = if n=0 then [] else x :: take (n-1) (xf()) + + type LetRecClassA3 () = + + let rec ns = HD (2,(fun () -> HD (3,(fun () -> ns)))) + let rec xs = 1::2::3::xs (* WHY IS THIS ACCEPT HERE, BUT NOT AT THE TOP LEVEL??? *) + member this.NS = ns + member this.XS = xs + + let lrCA3 = new LetRecClassA3() + let ns123 = lrCA3.NS + let xs123 = lrCA3.XS + + type LetRecClassA4 () = + + let rec xs = 1::2::3::xs (* WHY IS THIS ACCEPT HERE, BUT NOT AT THE TOP LEVEL??? *) + member this.XS = xs + + let lrCA4 = new LetRecClassA4() + let error123 = lrCA4.XS + + + +//! override test + +module OverrideTest1 = + [] + type AbstractClass = + + new() = {} + abstract MA : int -> int + abstract MB : int -> int + + + type OverrideClassA1 () = + + inherit AbstractClass() + override this.MA(x) = x+1 + override this.MB(x) = x+2 + + + +module OverrideTest2 = + + //! abstract test + + [] + type ImplicitAbstractClass() = + + abstract MA : int -> int + abstract MB : int -> int + + + type OverrideClassA2 () = + + inherit ImplicitAbstractClass() + override this.MA(x) = x+1 + override this.MB(x) = x+2 + + let oca2 = new OverrideClassA2() + do assert(oca2.MA(1)=2) + do assert(oca2.MB(1)=3) + + + +module ConstructionTests = + //! CC tests + type CC (x) = + + let mutable z = x+1 + let f = fun () -> z + member a.F() = f() + member a.Set x = z <- x + + + let cc = new CC(1) + cc.F() + cc.Set(20) + cc.F() + + + //! interface + type CCCCCCCC() = + interface System.IDisposable with + member x.Dispose() = () + + + + + +module StaticMemberScopeTest = + //! static expr test + type StaticTestA1(argA,argB) = + let locval = 1 + argA + let mutable locmut = 2 + argB + static member M = 12 (* can not use: locval + locmut + argA *) + + + +module ConstructorArgTests = + + //! ctor args stored in fields + type CtorArgClassA1(argA,argB) = + member x.M = argA + argB*2 + + + +module SelfReferenceTests = + type SelfReferences(a,b) as self = + let f() = self.M + let ab = a*b+2 + let x = + let ok = + try + let x = self.M in + printf "Error: self reference got through - should catch these\n"; + false (* not ok here *) + with _ -> + printf "Self reference during construction threw exception, as required\n"; + true (* ok, got exn *) + in + assert(ok); + ok + member self.M = (ab : int) + member self.P = f() + + let sr = new SelfReferences(1,2) + + +//! Bug: 878 - type unsoundness - implicit constructor members generalising "free-imperative" typars from let-bindings +(* must be -ve test +type C() = + let t = ref (Map.empty) + let f x = (!t).Add("3",x) + member x.M() = !t + +*) + + +module MixedRecursiveTypeDefinitions = + + type ClassType<'a>(x:'a) = + member self.X = x + + and RecordType = + { field1 : int; + field2 : ClassType } + member self.GetField() = self.field2 + + and UnionType = + | Case1 of string * AbbrevType1 + | Case2 of string * AbbrevType2 + + and AbbrevType1 = ClassType + + and AbbrevType2 = ClassType + + and AnotherClassType<'a>(x:'a) = + member self.X = x + interface InterfaceType<'a> with + member self.X = x + + and InterfaceType<'a> = + abstract X : 'a + + + +module ExceptionsWithAugmentations = + exception E of string * string + with + override x.Message = "A" + end + + + let x = E("3","3") + + 1+1 + + test "ckwh98u" ((try raise x with e -> e.Message) = "A") + + exception E2Exception of string * string + with + override x.Message = "A" + member x.Member2 = "E" + end + + + let x2 = E2Exception("3","3") + + 1+1 + + test "ckwh98v" ((try raise x2 with :? E2Exception as e -> e.Member2) = "E") + + +//! Test cases: +(* + [ ] - self-references - allowed and trapped + [ ] - direct calls to most derrived base override + [ ] - calls on "super" object - via self and super vars +*) + +//! Finish + +let _ = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) + diff --git a/tests/fsharp/core/members/incremental-hw/dont.run.peverify b/tests/fsharp/core/members/incremental-hw/dont.run.peverify deleted file mode 100644 index ce274c82a821326879dcc552de9b050d52d1d314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmezWFNh(LA&()2A)g_aA%~%oK>^54Wk_bo1k))%ejZS+1W1] - let access p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () +let singleTestBuildAndRun p = check (attempt { + let { Directory = dir; Config = cfg } = testContext () - do! SingleTestBuild.singleTestBuild cfg dir p + do! SingleTestBuild.singleTestBuild cfg dir p - do! SingleTestRun.singleTestRun cfg dir p - }) + do! SingleTestRun.singleTestRun cfg dir p + }) + + +module Access = + [] + let access p = singleTestBuildAndRun p module Apporder = [] - let apporder p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let apporder p = singleTestBuildAndRun p module Array = [] - let array p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let array p = singleTestBuildAndRun p module Attributes = [] - let attributes p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let attributes p = singleTestBuildAndRun p module Comprehensions = [] - let comprehensions p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let comprehensions p = singleTestBuildAndRun p module ComprehensionsHw = [] - let comprehensions p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let comprehensions p = check singleTestBuildAndRun p module Control = [] - let control p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let control p = singleTestBuildAndRun p [] let ``control --tailcalls`` p = check (attempt { @@ -102,13 +69,7 @@ module ControlChamenos = module ControlMailbox = [] - let controlMailbox p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let controlMailbox p = singleTestBuildAndRun p [] let ``controlMailbox --tailcalls`` p = check (attempt { @@ -121,23 +82,11 @@ module ControlMailbox = module ControlWpf = [] - let controlWpf p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let controlWpf p = singleTestBuildAndRun p module Csext = [] - let csext p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let csext p = singleTestBuildAndRun p module Events = @@ -506,13 +455,7 @@ module fsiAndModifiers = module GenericMeasures = [] - let genericmeasures p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let genericmeasures p = singleTestBuildAndRun p module Hiding = @@ -549,25 +492,13 @@ module Hiding = module Innerpoly = [] - let innerpoly p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let innerpoly p = singleTestBuildAndRun p module ``test int32`` = [] - let int32 p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let int32 p = singleTestBuildAndRun p module QueriesCustomQueryOps = @@ -825,13 +756,7 @@ module Quotes = module Namespaces = [] - let attributes p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let attributes p = singleTestBuildAndRun p module Parsing = @@ -928,15 +853,8 @@ module Unicode = }) [] - let unicode2 p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - // call %~d0%~p0..\..\single-test-build.bat - do! SingleTestBuild.singleTestBuild cfg dir p - - // call %~d0%~p0..\..\single-test-run.bat - do! SingleTestRun.singleTestRun cfg dir p - }) + let unicode2 p = singleTestBuildAndRun p + check (attempt { module InternalsVisible = @@ -1035,46 +953,22 @@ module Interop = module ``test lazy`` = [] - let ``lazy`` p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let ``lazy`` p = singleTestBuildAndRun p module letrec = [] - let letrec p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let letrec p = singleTestBuildAndRun p module LibTest = [] - let libtest p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let libtest p = singleTestBuildAndRun p module Lift = [] - let lift p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let lift p = singleTestBuildAndRun p module ``Load-Script`` = @@ -1242,29 +1136,16 @@ module ``Load-Script`` = }) - module LongNames = [] - let longnames p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let longnames p = singleTestBuildAndRun p module ``test map`` = [] - let map p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let map p = singleTestBuildAndRun p module Math = //TODO math/lalgebra does not have build.bat/run.bat and #r "FSharp.Math.Providers.dll" @@ -1272,125 +1153,65 @@ module Math = module Numbers = [] - let numbers p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let numbers p = singleTestBuildAndRun p module numbersVS2008 = [] - let numbersVS2008 p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let numbersVS2008 p = singleTestBuildAndRun p module Measures = [] - let measures p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let measures p = singleTestBuildAndRun p module Members = module Basics = [] - let Basics p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let Basics p = singleTestBuildAndRun p [] - let BasicsHw p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let BasicsHw p = singleTestBuildAndRun p [] - let BasicsHwMutrec p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let BasicsHwMutrec p = singleTestBuildAndRun p module Ctree = [] - let ctree p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let ctree p = singleTestBuildAndRun p module Factors = [] - let factors p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let factors p = singleTestBuildAndRun p module Incremental = [] - let incremental p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let incremental p = singleTestBuildAndRun p + + [] + let incrementalHw p = singleTestBuildAndRun p + + [] + let incrementalHwMutrec = singleTestBuildAndRun p module Ops = [] - let ops p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let ops p = singleTestBuildAndRun p module Nested = [] - let nested p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let nested p = singleTestBuildAndRun p module NetCore = @@ -1547,15 +1368,7 @@ module NetCore = module Patterns = [] - let patterns p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) - - + let patterns p = singleTestBuildAndRun p module Pinvoke = @@ -1629,13 +1442,7 @@ module ``test printf`` = let permutations () = [ FSharpSuiteTestCaseData("core/printf", FSC_BASIC) ] [] - let printf p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let printf p = singleTestBuildAndRun p module QueriesLeafExpressionConvert = @@ -2101,13 +1908,7 @@ module QuotesInMultipleModules = module Reflect = [] - let reflect p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let reflect p = singleTestBuildAndRun p module ``test resources`` = @@ -2181,53 +1982,26 @@ module ``test resources`` = module ``test seq`` = [] - let seq p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) - + let seq p = singleTestBuildAndRun p module Subtype = [] - let subtype p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) - + let subtype p = singleTestBuildAndRun p module Syntax = [] - let syntax p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) + let syntax p = singleTestBuildAndRun p module Tlr = [] - let tlr p = check (attempt { - let { Directory = dir; Config = cfg } = testContext () - - do! SingleTestBuild.singleTestBuild cfg dir p - - do! SingleTestRun.singleTestRun cfg dir p - }) - + let tlr p = singleTestBuildAndRun p module Topinit = From e4b8360fe3cf1c765f17c07a45d9e4c1797bad90 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 14:39:46 +0100 Subject: [PATCH 196/334] add more tests, cleanup tests --- .../members/incremental-hw-mutrec/test.fsx | 258 +++++------- tests/fsharp/core/members/ops-mutrec/test.fsx | 388 ++++++++++++++++++ tests/fsharp/core/members/ops/test.fsx | 237 +---------- tests/fsharp/core/tests_core.fs | 6 + 4 files changed, 514 insertions(+), 375 deletions(-) create mode 100644 tests/fsharp/core/members/ops-mutrec/test.fsx diff --git a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx index b64bfe4212c..88f5d0900a6 100644 --- a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx +++ b/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx @@ -1,16 +1,20 @@ // #Conformance #MemberDefinitions #Mutable #ObjectOrientedTypes #Classes #InterfacesAndImplementations #Recursion +//--------------------------------------------------------------- +// Same test as "members\incremental-hw" but with "rec" added -module rec IncrementalHwMutrec -//! Setup + +module rec IncrementalHwMutrec // <----- NOTE THE "rec" + +// Setup let failures = ref false let report_failure () = stderr.WriteLine " NO"; failures := true let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() -//! Address of incremental local mutable +// Address of incremental local mutable module AddresOfIncrementalClassLocalMutable = @@ -24,7 +28,7 @@ module AddresOfIncrementalClassLocalMutable = -//! Address of mutable record field (related to above) +// Address of mutable record field (related to above) module AddresOfMutableRecordField = open System.Drawing @@ -39,12 +43,12 @@ module AddresOfMutableRecordField = -//! Minor test +// Minor test module MinorTest = - type A<'a>(x:'a) = + type A<'T>(x:'T) = - let (y:'a) = x + let (y:'T) = x member this.X = y @@ -54,13 +58,13 @@ module MinorTest = -//! Misc +// Misc module Misc = - type 'a Area9aa(x) = + type 'T Area9aa(x) = - let a = (x : 'a) - let f (y:'a) = y + let a = (x : 'T) + let f (y:'T) = y type AList(a) = @@ -74,18 +78,18 @@ module Misc = -//! Wire prevously +// Wire prevously (* accepted *) module WireOld = [] - type 'a wire = + type wire<'T> = - abstract Send : 'a -> unit - abstract Listen : ('a -> unit) -> unit + abstract Send : 'T -> unit + abstract Listen : ('T -> unit) -> unit new () = {} - member self.Event = self :> 'a IEvent - interface IEvent<'a> with + member self.Event = self :> IEvent<'T> + interface IEvent<'T> with member x.Subscribe(handler) = failwith "nyi" member x.AddHandler(handler) = failwith "nyi" member x.RemoveHandler(handler) = failwith "nyi" @@ -93,129 +97,128 @@ module WireOld = let createWire() = let listeners = ref [] in - {new wire<'a>() with + {new wire<'T>() with member __.Send(x) = List.iter (fun f -> f x) !listeners member __.Listen(f) = listeners := f :: !listeners } -//! Wire variations +// Wire variations module WireVariations = - (* Accepted *) + // Accepted type wire2(z) = let z = z member this.Send(x) = 1 + z + x - (* Accepted *) - type 'a wire3(z) = + // Accepted + type wire3<'T>(z) = - let listeners = (z:'a) - member this.Send(x:'a) = x + let listeners = (z:'T) + member this.Send(x:'T) = x - (* Accepted *) - type wire4<'a>(z) = + // Accepted + type wire4<'T>(z) = - let listeners = let z:'a = z in ref ([] : ('a -> unit) list) - member this.Send(x:'a) = List.iter (fun f -> f x) !listeners - member this.Listen(f:'a -> unit) = listeners := f :: !listeners + let listeners = let z:'T = z in ref ([] : ('T -> unit) list) + member this.Send(x:'T) = List.iter (fun f -> f x) !listeners + member this.Listen(f:'T -> unit) = listeners := f :: !listeners - (* Accepted *) - type 'a wire5(z) = + // Accepted + type wire5<'T>(z) = - let listeners = ref ([] : ('a -> unit) list) - member this.Send(x:'a) = let z:'a = z in List.iter (fun f -> f x) !listeners - member this.Listen(f:'a -> unit) = listeners := f :: !listeners + let listeners = ref ([] : ('T -> unit) list) + member this.Send(x:'T) = let z:'T = z in List.iter (fun f -> f x) !listeners + member this.Listen(f:'T -> unit) = listeners := f :: !listeners - (* Accepted now - fixed tinst missing error *) - type 'a wire6(z) = + // Accepted now - fixed tinst missing error + type wire6<'T>(z) = - let mutable listeners = ([] : ('a -> unit) list) - member this.Send(x:'a) = let z:'a = z in List.iter (fun f -> f x) listeners - member this.Listen(f:'a -> unit) = listeners <- f :: listeners + let mutable listeners = ([] : ('T -> unit) list) + member this.Send(x:'T) = let z:'T = z in List.iter (fun f -> f x) listeners + member this.Listen(f:'T -> unit) = listeners <- f :: listeners - (* OK, now this types are asserted equal *) - type 'a wire7(z) = + // OK, now this types are asserted equal + type wire7<'T>(z) = let listeners = 12 - let z : 'a = z + let z : 'T = z member this.SendA(x:int) = this,listeners member this.SendB(x:int) = this,listeners - (* Soundness concern: should uses of let-fields force a member "this" to be ('a wire) typed? *) - type 'a wire8(z) = + // Soundness concern: should uses of let-fields force a member "this" to be ('T wire) typed? + type wire8<'T>(z) = - let z : 'a = z + let z : 'T = z let listeners = 12 - member this.SendA(x:int) = x,z,(this: 'a wire8) - member this.SendB(x:int) = x,z,(this: 'a wire8) + member this.SendA(x:int) = x,z,(this: 'T wire8) + member this.SendB(x:int) = x,z,(this: 'T wire8) - (* Accepted *) - type 'a wire9(z) = + // Accepted + type wire9<'T>(z) = let mutable listeners = ([] : int list) - let z : 'a = z + let z : 'T = z member this.Send(x:int) = let ls : int list = 1 :: 2 :: listeners in List.map (fun x -> x+1) ls - (* Accepted *) - type 'a wire10(z) = + // Accepted + type wire10<'T>(z) = let mutable listeners = ([] : int list) - let z : 'a = z + let z : 'T = z member this.Send(x:int) = - let ls : int list = listeners @ [1] in (* it seems listeners may have the wrong type... *) + let ls : int list = listeners @ [1] in List.map (fun f -> f) ls - (* Accepted *) - type 'a wire11(z) = + // Accepted + type wire11<'T>(z) = let listeners = let z:int = z in ([] : int list) - member this.Send(x:'a) = (* List.iter (fun f -> ()) listeners *) - let xx : 'a wire11 = this in + member this.Send(x:'T) = + let xx : 'T wire11 = this in Some (x,List.head listeners) - (* Accepted *) - type 'a wire12(z) = + // Accepted + type wire12<'T>(z) = - let listeners = let z:'a = z in ([] : int list) - member this.Send(x:'b) = (* List.iter (fun f -> ()) listeners *) + let listeners = let z:'T = z in ([] : int list) + member this.Send(x:'b) = Some (this,x,List.head listeners) - (* OK, after avoid the value restriction *) + // OK, after avoid the value restriction type wire13(z) = member this.Send(x:'b) = (ignore (z:int)); Some (this,x) - (* Accepted *) - type 'a wire14(z) = + // Accepted + type wire14<'T>(z) = let mutable listeners = let z:int = z in ([] : int list) - member this.Send(x:'a) = (* List.iter (fun f -> ()) listeners *) + member this.Send(x:'T) = (* List.iter (fun f -> ()) listeners *) listeners -//! Area variations +// Area variations module AreaVariations = - (* Accepted *) open System.Drawing open System.Windows.Forms open WireOld @@ -255,20 +258,14 @@ module AreaVariations = inherit Panel() let x = 1 + x - (**) let mutable Bitmap = new Bitmap(100,100) let mutable GC = Graphics.FromImage(Bitmap) (* GC for bitmap *) let resizedWire = createWire() : (int*int) wire let mutable Count = 0 - (**) do base.BackColor <- Color.Black do base.Dock <- DockStyle.Fill do base.Cursor <- Cursors.Cross - // do base.Resize.Add(fun arg -> area.resize ()) (* use before defn risk *) - // do base.Paint .Add(fun args -> area.redrawDrawArea args.Graphics) (* use before defn risk *) - (**) member this.ResizedE = resizedWire.Event - (**) member this.Resize () = let ww,hh = base.Width,base.Height in if ww>0 && hh>0 then ( @@ -276,36 +273,21 @@ module AreaVariations = GC <- Graphics.FromImage(Bitmap); resizedWire.Send((ww,hh)) ) - (**) - // TODO: need to be able to call this.PriorMethod without this.qualification - // do base.Resize.Add(fun arg -> Resize ()) (* no risk *) - (**) member this.RedrawDrawArea (gc:Graphics) = gc.DrawImage(Bitmap,new Point(0,0)) - // member this.Refresh() = using (base.CreateGraphics()) (fun gc -> RedrawDrawArea gc) member this.Refresh2() = using (base.CreateGraphics()) (fun gc -> this.RedrawDrawArea gc) - (**) - // do base.Paint.Add(fun args -> RedrawDrawArea args.Graphics) (* no risk *) - // do base.Paint.Add(fun args -> .RedrawDrawArea args.Graphics) (* no risk *) - type Area5b(x) as self = inherit Panel() let x = 1 + x - (**) let mutable Bitmap = new Bitmap(100,100) let mutable GC = Graphics.FromImage(Bitmap) (* GC for bitmap *) let resizedWire = createWire() : (int*int) wire let mutable Count = 0 - (**) do self.BackColor <- Color.Black do self.Dock <- DockStyle.Fill do self.Cursor <- Cursors.Cross - // do self.Resize.Add(fun arg -> area.resize ()) (* use before defn risk *) - // do self.Paint .Add(fun args -> area.redrawDrawArea args.Graphics) (* use before defn risk *) - (**) member this.ResizedE = resizedWire.Event - (**) member this.Resize () = let ww,hh = self.Width,self.Height in if ww>0 && hh>0 then ( @@ -313,16 +295,8 @@ module AreaVariations = GC <- Graphics.FromImage(Bitmap); resizedWire.Send((ww,hh)) ) - (**) - // TODO: need to be able to call this.PriorMethod without this.qualification - // do self.Resize.Add(fun arg -> Resize ()) (* no risk *) - (**) member this.RedrawDrawArea (gc:Graphics) = gc.DrawImage(Bitmap,new Point(0,0)) - // member this.Refresh() = using (self.CreateGraphics()) (fun gc -> RedrawDrawArea gc) member this.Refresh2() = using (self.CreateGraphics()) (fun gc -> this.RedrawDrawArea gc) - (**) - // do self.Paint.Add(fun args -> RedrawDrawArea args.Graphics) (* no risk *) - // do self.Paint.Add(fun args -> .RedrawDrawArea args.Graphics) (* no risk *) type Area6(x) = @@ -341,32 +315,32 @@ module AreaVariations = - type 'a Area8(x) = + type 'T Area8(x) = inherit Panel() let a,b = (x : int * int) do base.BackColor <- Color.Black - let f (y:'a) = y + let f (y:'T) = y let xx = a - type 'a Area9(x) = + type 'T Area9(x) = - let a = (x : 'a) - // let f (y:'a) = y + let a = (x : 'T) + // let f (y:'T) = y - type 'a Area10 = + type 'T Area10 = - val f : 'a -> 'a + val f : 'T -> 'T new (x:int) = { f = fun x -> x} -//! Person +// Person -(* Scala person example *) +// Scala person example module ScalaPersonExample = type Person1(firstLastSpouse) = @@ -379,8 +353,6 @@ module ScalaPersonExample = (match spouse with | None -> "." | Some spouse -> " and this is my spouse, " + spouse.FirstName + " " + spouse.LastName + ".") - // TODO: the implicit ctor is not in scope for defining alt constructors. - // new (f,l) = new Person1(f,l,None) let pA = new Person1(("bob" ,"smith",None)) let pB = new Person1(("jill","smith",Some pA)) @@ -388,7 +360,7 @@ module ScalaPersonExample = -//! Forms +// Forms module Forms1 = open System.Drawing @@ -430,15 +402,9 @@ module Forms2 = member this.GC = GC' - //let form = new Form(Visible=true,AutoScroll=true) - //let dp = new DrawPanel2(800,400) - //do form.Controls.Add(dp) - //do dp.GC.DrawLine(Pens.White,10,20,30,40) - //do dp.Redraw() - module Regression1 = - (* Regression test: local vals of unit type are not given field storage (even if mutable) *) + // Regression test: local vals of unit type are not given field storage (even if mutable) type UnitTestA2 (x,y) = do printf "TestA %d\n" (x*y) @@ -456,32 +422,31 @@ module Regression1 = -//! typar scoping +// typar scoping module TyparScopeChecks = (* typar scoping checks 1 *) - type ('a,'b) classB1(aa,bb) = + type ('T,'b) classB1(aa,bb) = - let a = aa : 'a + let a = aa : 'T let b = bb : 'b - let f (aaa:'a) (bbb:'b) = aaa,bbb + let f (aaa:'T) (bbb:'b) = aaa,bbb (* typar scoping checks *) - type ('a,'b) classB2(aa:'a,bb:'b) = + type ('T,'b) classB2(aa:'T,bb:'b) = let a = aa let b = bb - let f (aaa:'a) (bbb:'b) = aaa,bbb + let f (aaa:'T) (bbb:'b) = aaa,bbb module LocalLetRecTests = - //! local let rec test + // local let rec test - (* let rec tests *) type LetRecClassA1 (a,b) = let a,b = a,b @@ -494,7 +459,6 @@ module LocalLetRecTests = let xa = lrCA1.Fa() let xb = lrCA1.Fb() - (* let rec tests *) type LetRecClassA2 () = let rec odd n = printf "odd %d?\n" n; if n=0 then false else not(even (n-1)) @@ -509,7 +473,7 @@ module LocalLetRecTests = let ox3 = lrCA2.Even(3) - //! local let rec test + // local let rec test type nats = HD of int * (unit -> nats) let rec ns = HD (2,(fun () -> HD (3,(fun () -> ns)))) @@ -518,7 +482,7 @@ module LocalLetRecTests = type LetRecClassA3 () = let rec ns = HD (2,(fun () -> HD (3,(fun () -> ns)))) - let rec xs = 1::2::3::xs (* WHY IS THIS ACCEPT HERE, BUT NOT AT THE TOP LEVEL??? *) + let rec xs = 1::2::3::xs member this.NS = ns member this.XS = xs @@ -528,7 +492,7 @@ module LocalLetRecTests = type LetRecClassA4 () = - let rec xs = 1::2::3::xs (* WHY IS THIS ACCEPT HERE, BUT NOT AT THE TOP LEVEL??? *) + let rec xs = 1::2::3::xs member this.XS = xs let lrCA4 = new LetRecClassA4() @@ -536,7 +500,7 @@ module LocalLetRecTests = -//! override test +// override test module OverrideTest1 = [] @@ -556,8 +520,6 @@ module OverrideTest1 = module OverrideTest2 = - - //! abstract test [] type ImplicitAbstractClass() = @@ -579,7 +541,7 @@ module OverrideTest2 = module ConstructionTests = - //! CC tests + // CC tests type CC (x) = let mutable z = x+1 @@ -593,8 +555,6 @@ module ConstructionTests = cc.Set(20) cc.F() - - //! interface type CCCCCCCC() = interface System.IDisposable with member x.Dispose() = () @@ -604,7 +564,6 @@ module ConstructionTests = module StaticMemberScopeTest = - //! static expr test type StaticTestA1(argA,argB) = let locval = 1 + argA let mutable locmut = 2 + argB @@ -614,7 +573,6 @@ module StaticMemberScopeTest = module ConstructorArgTests = - //! ctor args stored in fields type CtorArgClassA1(argA,argB) = member x.M = argA + argB*2 @@ -642,19 +600,9 @@ module SelfReferenceTests = let sr = new SelfReferences(1,2) -//! Bug: 878 - type unsoundness - implicit constructor members generalising "free-imperative" typars from let-bindings -(* must be -ve test -type C() = - let t = ref (Map.empty) - let f x = (!t).Add("3",x) - member x.M() = !t - -*) - - module MixedRecursiveTypeDefinitions = - type ClassType<'a>(x:'a) = + type ClassType<'T>(x:'T) = member self.X = x and RecordType = @@ -670,13 +618,13 @@ module MixedRecursiveTypeDefinitions = and AbbrevType2 = ClassType - and AnotherClassType<'a>(x:'a) = + and AnotherClassType<'T>(x:'T) = member self.X = x - interface InterfaceType<'a> with + interface InterfaceType<'T> with member self.X = x - and InterfaceType<'a> = - abstract X : 'a + and InterfaceType<'T> = + abstract X : 'T @@ -707,14 +655,6 @@ module ExceptionsWithAugmentations = test "ckwh98v" ((try raise x2 with :? E2Exception as e -> e.Member2) = "E") -//! Test cases: -(* - [ ] - self-references - allowed and trapped - [ ] - direct calls to most derrived base override - [ ] - calls on "super" object - via self and super vars -*) - -//! Finish let _ = if !failures then (stdout.WriteLine "Test Failed"; exit 1) diff --git a/tests/fsharp/core/members/ops-mutrec/test.fsx b/tests/fsharp/core/members/ops-mutrec/test.fsx new file mode 100644 index 00000000000..1fa82e5c373 --- /dev/null +++ b/tests/fsharp/core/members/ops-mutrec/test.fsx @@ -0,0 +1,388 @@ +// #Conformance #MemberDefinitions #Overloading #ComputationExpressions + +//--------------------------------------------------------------- +// Same test as "members\ops" but with "rec" added + +module rec OpsMutrec // <----- NOTE THE "rec" + +open Microsoft.FSharp.Math + +let failures = ref false +let report_failure () = + stderr.WriteLine " NO"; failures := true +let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() + +module FuncTest = + + type func = + class + val numCalls: int ref + val impl: int -> int option + member x.Invoke(y) = incr x.numCalls; x.impl(y) + new(f) = { numCalls = ref 0; impl=f } + static member (>>>>) ((f: func), (g: func)) = + new func(fun x -> match f.Invoke(x) with None -> None | Some b -> g.Invoke(b)) + static member (<<<<) ((f: func), (g: func)) = + new func(fun x -> match g.Invoke(x) with None -> None | Some b -> f.Invoke(b)) + end + + let konst a = new func(fun x -> Some a) + + let morph f = new func(fun x -> Some (f x)) + + let something = (morph (fun x -> x * x)) >>>> (morph (fun x -> x + x)) + let something2 = (morph (fun x -> x * x)) <<<< (morph (fun x -> x + x)) + + do test "cn39233" (something.Invoke(3) = Some 18) + do test "cn39233b" (something2.Invoke(3) = Some 36) + + + + +module OverloadSamples = + + open System + + //----------------------------------------------------------------------- + // Examples 1-5: Simple overloading + + let f1 x = x + 1.0 // add on floats + let f2 x = x + 1.0f // add on 32-bit floats + let f3 x = x + 2 // add on integers + let f4 (x:DateTime) = x + new TimeSpan(300L) // add on dates + let f5 (x:TimeSpan) = x + new TimeSpan(1000L) // add on time spans + + //----------------------------------------------------------------------- + // Example 6: overloading on types you've defined yourself. Normally + // we would use the standard F# pattern of defining a type + // (i.e. it's data representation), then defining + // a module that carries the operations associated with the type, then + // using an augmentation to assocaite the operations with the type. However + // here we've just added the augmentation straight away. + + type IntVector = + | V of int array + static member (+) (V x, V y) = + if x.Length <> y.Length then invalidArg "arg" "IntVectorOps.add"; + V(Array.init x.Length (fun i -> x.[i] + y.[i])) + + // Now use the overloading: + + let res6 = V [| 1;2;3 |] + V [| 3;2;1 |] + + //============================================================================== + // Example 7: Generic Vectors (correct approach) + // + // The solution is to have your generic types carry a dictionary of operations. + // Overloads on the generic type can then be correctly defined. This is a lot + // like writing the translation of Haskell type classes by hand, with the advantage + // that you get complete control over the instantiations and where the + // dictionaries are created and passed, but with the disadvantage that + // it is a little more verbose. + + // Here is the dictionary of operations: + + type 'a NumberOps = + { zero: 'a; + one: 'a; + add : 'a -> 'a -> 'a; + mul : 'a -> 'a -> 'a; + neg : 'a -> 'a; } + + // Here are two instantiations of this dictionary of operations: + + let intOps = + { zero = 0; + one = 1; + add = (+); + mul = ( * ); + neg = (~-); } + + let floatOps = + { zero = 0.0; + one = 1.0; + add = (+); + mul = ( * ); + neg = (~-); } + + // Now the GenericVector type itself, its operations and the augmentation + // giving the operator overload: + + type 'a GenericVector = + { ops: 'a NumberOps; + arr: 'a array } + + let add x y = + if x.arr.Length <> y.arr.Length then invalidArg "arg" "Matrix.(+)"; + {ops=x.ops; arr=Array.init x.arr.Length (fun i -> x.ops.add x.arr.[i] y.arr.[i]) } + + let create ops arr = + {ops=ops; arr=arr } + + type 'a GenericVector + with + // Nb. For an operator assocaited with a generic type + // the the type parameters involved in the operator's definition must be the same + // as the type parameters of the enclosing class. + static member (+) ((x : 'a GenericVector),(y : 'a GenericVector)) = add x y + end + + let IGV arr = create intOps arr + let FGV arr = create floatOps arr + + // Now the GenericVector type itself, its operations and the augmentation + // giving the operator overload: + + let f8 (x:GenericVector) = x + IGV [| 1;2;3 |] + let f9 (x:GenericVector) = x + FGV [| 1.0 |] + let twice (x:GenericVector<'a>) (y:GenericVector<'a>) = x + y + + let f10 (x:GenericVector) = twice x + let f11 (x:GenericVector) = twice x + + + + +module StateMonadTest = + + type 'a IO = + { impl: unit -> 'a } + with + member f.Invoke() = f.impl() + static member Result(r) = { impl = (fun () -> r) } + member f.Bind(g) : 'b IO = g(f.impl()) + static member BindOp((f : 'a IO), (g : 'a -> 'b IO)) = f.Bind(g) + end + + let (>>=) (f: 'a IO) g = f.Bind(g) + let result x = {impl = (fun () -> x) } + let mcons (p: 'a IO) (q : 'a list IO) = p >>= (fun x -> q >>= (fun y -> result (x::y))) + let sequence (l: 'a IO list) : 'a list IO = + List.foldBack mcons l (result []) + + + + +module StreamMonadTest = + + type 'a NumberOps = + { zero: 'a; + one: 'a; + add : 'a -> 'a -> 'a; + mul : 'a -> 'a -> 'a; + neg : 'a -> 'a; } + + let intOps = + { zero = 0; + one = 1; + add = (+); + mul = ( * ); + neg = (~-); } + + let floatOps = + { zero = 0.0; + one = 1.0; + add = (+); + mul = ( * ); + neg = (~-); } + + + + + + +module AnotherFuncTest = + + type func = + class + val numCalls: int ref + val impl: int -> int option + member x.Invoke(y) = incr x.numCalls; x.impl(y) + new(f) = { numCalls = ref 0; impl=f } + static member (++) ((f: func), (g: func)) = + new func(fun x -> match f.Invoke(x) with None -> None | Some b -> g.Invoke(b)) + end + + + + + +module BasicOverloadTests = + + let f4 x = 1 + x + + // This gets type int -> int + let f5 x = 1 - x + + // This gets type DateTime -> DateTime -> TimeSpan, through non-conservative resolution. + let f6 x1 (x2:System.DateTime) = x1 - x2 + + // This gets type TimeSpan -> TimeSpan -> TimeSpan, through non-conservative resolution. + let f7 x1 (x2:System.TimeSpan) = x1 - x2 + + // This gets type TimeSpan -> TimeSpan -> TimeSpan, through non-conservative resolution. + let f8 x1 (x2:System.TimeSpan) = x2 - x1 + + // This gets type TimeSpan -> TimeSpan -> TimeSpan, through non-conservative resolution. + let f9 (x1:System.TimeSpan) x2 = x1 - x2 + + + // This gets type TimeSpan -> TimeSpan -> TimeSpan + let f10 x1 (x2:System.TimeSpan) = x1 + x2 + + // Note this gets a different type to f10 as more possible overloads become available through further + // type annotations + let f11 (x1:System.DateTime) (x2:System.TimeSpan) = x1 + x2 + + + let f17 (x1: float) x2 = x1 * x2 + let f18 (x1: int) x2 = x1 * x2 + let f19 x1 (x2:int) = x1 * x2 + let f20 x1 (x2:float) = x1 * x2 + let f21 x1 (x2:string) = x1 + x2 + let f22 (x1:string) x2 = x1 + x2 + + + + // This one is tricky because the type of "s" is unknown, and could in theory resolve to a + // nominal type which has an extra interesting "op_Addition(string,C)" overload. + // However, non-conservative resolution is applied prior to method overload resolution in + // expressions. This means the overload constraint is resolved OK to op_Addition(string,string). + let f26 s = stdout.Write("-"+s) + + let f27 x = x + x + + let f28 x = + let g x = x + x in + g x + + let f29 x = + let g x = x + 1.0 in + g x + + let f30 x = + let g x = x + "a" in + g x + "3" + + + +module SubtypingAndOperatorOverloads = + type C() = + class + static member (+) (x:C,y:C) = new C() + end + + type D() = + class + inherit C() + static member (+) (x:D,y:D) = new D() + end + + let f201 (x1: C) (x2: C) = D.op_Addition(x1,x2) + let f202 (x1: D) (x2: C) = D.op_Addition(x1,x2) + let f203 (x1: D) (x2: D) = D.op_Addition(x1,x2) + let f204 (x1: C) (x2: D) = D.op_Addition(x1,x2) + let f205 (x1: C) (x2: _) = D.op_Addition(x1,x2) + let f206 (x1: _) (x2: C) = D.op_Addition(x1,x2) + + let f301 (x1: C) (x2: C) = x1 + x2 + + let f302 (x1: D) (x2: C) = x1 + x2 + + let f303 (x1: D) (x2: D) = x1 + x2 + + let f304 (x1: C) (x2: D) = x1 + x2 + + let f305 (x1: C) (x2: _) = x1 + x2 + + let f306 (x1: _) (x2: C) = x1 + x2 + + // TODO: investigate + let f307 (x1: D) (x2: _) = x1 + x2 + // TODO: investigate + let f308 (x1: _) (x2: D) = x1 + x2 + + +module OperatorOverloadsWithFloat = + type C() = + class + static member (+) (x:C,y:float) = new C() + + static member (+) (x:float,y:C) = new C() + + static member (+) (x:C,y:C) = new C() + end + + + let f201 (x1: C) (x2: C) = C.op_Addition(x1,x2) + let f202 (x1: float) (x2: C) = C.op_Addition(x1,x2) + let f204 (x1: C) (x2: float) = C.op_Addition(x1,x2) +#if NEGATIVE + let f205 (x1: C) (x2: _) = C.op_Addition(x1,x2) + let f206 (x1: _) (x2: C) = C.op_Addition(x1,x2) +#endif + let f207 (x1: float) (x2: _) = C.op_Addition(x1,x2) + let f208 (x1: _) (x2: float) = C.op_Addition(x1,x2) + + let f301 (x1: C) (x2: C) = x1 + x2 + let f302 (x1: float) (x2: C) = x1 + x2 + let f304 (x1: C) (x2: float) = x1 + x2 + + // TODO: investigate + let f305 (x1: C) (x2: _) = x1 + x2 + // TODO: investigate + let f306 (x1: _) (x2: C) = x1 + x2 + + + + +module MiscOperatorOverloadTests = + + let rec findBounding2Power b tp = if b<=tp then tp else findBounding2Power b (tp*2) + let leastBounding2Power b = + findBounding2Power b 1 + + let inline sumfR f (a:int,b:int) = + let mutable res = 0.0 in + for i = a to b do + res <- res + f i + done; + res + + + + +module EnumerationOperatorTests = + let x1 : System.DateTimeKind = enum 3 + let x2 : System.DateTimeKind = enum<_> 3 + let x3 = enum 3 + let x4 = int32 (enum 3) + let inline f5 x = x |> int32 |> enum + + + +module TraitCallsAndConstructors = + open System + let inline clone (v : ^a) = (^a : (new : string * Exception -> ^a) ("", v)) + let _ : InvalidOperationException = clone (InvalidOperationException()) + type Base(x : float) = + member this.x : float = x + + let inline (~-.) (v:^b) = (^b:(new : float -> ^b)(-((v:>Base).x))) + + type Inherited(x : float) = + inherit Base(x) + + //let aBase = Base(5.0) + //let aInherited = Inherited(5.0) + + + //let _ : Inherited = -aInherited + + +let _ = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) + diff --git a/tests/fsharp/core/members/ops/test.fsx b/tests/fsharp/core/members/ops/test.fsx index 367ca6a027b..915efac9089 100644 --- a/tests/fsharp/core/members/ops/test.fsx +++ b/tests/fsharp/core/members/ops/test.fsx @@ -1,16 +1,13 @@ // #Conformance #MemberDefinitions #Overloading #ComputationExpressions +open Microsoft.FSharp.Math + let failures = ref false let report_failure () = stderr.WriteLine " NO"; failures := true let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() -//let inline (>>) (x:$a) (y:$b) = (($a.(>>) <> <'a,'b,'c> : $t1<'a,'b> * $t2<'b,'c> -> $t2<'a,'c>) (x,y)) -//let inline (+) (x:$t1) (y:$t2) = (($a.(+) <...> <> : $t1<...> * $t2 -> $t1<...>) (x,y)) -//let inline (>>) (x:^a) (y:^b) : ^b = (^a.(>>) (x,y) ) -//let inline (<<) (x:^a) (y:^b) : ^a = (^a.(<<) (x,y) ) - -module FuncTest = begin +module FuncTest = type func = class @@ -28,18 +25,16 @@ module FuncTest = begin let morph f = new func(fun x -> Some (f x)) - #if UNNAMED_OPS let something = (morph (fun x -> x * x)) >>>> (morph (fun x -> x + x)) let something2 = (morph (fun x -> x * x)) <<<< (morph (fun x -> x + x)) do test "cn39233" (something.Invoke(3) = Some 18) do test "cn39233b" (something2.Invoke(3) = Some 36) - #endif -end -module OverloadSamples = begin + +module OverloadSamples = open System @@ -60,54 +55,16 @@ module OverloadSamples = begin // using an augmentation to assocaite the operations with the type. However // here we've just added the augmentation straight away. - type IntVector = V of int array - with + type IntVector = + | V of int array static member (+) (V x, V y) = if x.Length <> y.Length then invalidArg "arg" "IntVectorOps.add"; V(Array.init x.Length (fun i -> x.[i] + y.[i])) - end // Now use the overloading: let res6 = V [| 1;2;3 |] + V [| 3;2;1 |] - // val res6 = V [|4; 4; 4|] - - - //============================================================================== - // Example 7: Generic Vectors (incorrect approach) - // - // F# overloading does not propagate as far as you may wish. In particular, - // overloading on generic types will often produce unsatisfying results (extending - // overloading in this direction is being considered). - // - // For example, you can't create a generic vector type and have the overloading - // on the element type just magically propagate to the new type. - - type 'a BadGenericVector = - { arr: 'a array } - with - // This function is not as general as you might wish, despite the use of - // the overloaded "+" operator. Each instance of an overloaded operator - // must relate to one and only one type across the entire scope of - // type inference. So this gives rise to an "add" function that will be - // used to add one as-yet-to-be-determined type of element. - // - // So this function gives rise to the error - // test.ml(_,_): error: FS0001: The declared type parameter 'a cannot be used in - // conjunction with this overloaded operator since the overloading cannot be - // resolved at compile time - - // static member (+) ((x : 'a BadGenericVector),(y :'a BadGenericVector)) = - // if x.arr.Length <> y.arr.Length then invalidArg "Matrix.(+)"; - // {arr=Array.init x.arr.Length (fun i -> x.arr.[i] + y.arr.[i])} - end - - //let BGV arr = {arr=arr} - // This means you cannot use these - //let f7a (x:BadGenericVector) = x + BGV [| 1;2;3 |] - //let f7b (x:BadGenericVector) = x + BGV [| 1.0 |] - //============================================================================== // Example 7: Generic Vectors (correct approach) // @@ -179,10 +136,9 @@ module OverloadSamples = begin let f11 (x:GenericVector) = twice x -end -module StateMonadTest = begin +module StateMonadTest = type 'a IO = { impl: unit -> 'a } @@ -200,22 +156,9 @@ module StateMonadTest = begin List.foldBack mcons l (result []) -//These run into problems because we don't support higher-kinded polymorphism. -// For example we really wish to write: -// -//let inline result (x:'a) : ^f<'a> = (^f<'a>).Result(x) -//let inline (>>=) (x:^f<'a>) (y:'a -> ^f<'b>) = (^f<'a>).BindOp<'b> (x,y) - -//This is ok: -//let inline result (x:^a) : ^b = ^b.Result(x) -//This is not enough: -//let inline (>>>=) (x:^f) (y:'a -> ^g) = (^f.BindOp(x,y)) -end - - -module StreamMonadTest = begin +module StreamMonadTest = type 'a NumberOps = { zero: 'a; @@ -240,10 +183,10 @@ module StreamMonadTest = begin -end -module AnotherFuncTest = begin + +module AnotherFuncTest = type func = class @@ -256,146 +199,10 @@ module AnotherFuncTest = begin end -end - - -(* -module GenericFunc = begin - -type ('a,'b) func = - class - val numCalls: int ref - val impl: 'a -> 'b option - member x.Invoke(y) = incr x.numCalls; x.impl(y) - new(f) = { inherit obj(); numCalls = ref 0; impl=f } - static member FF (f: func<'a,'b>) (g: func<'b,'c>) = - new func<'a,'c>(fun x -> match f.Invoke(x) with None -> None | Some b -> g.Invoke(b)) - end - - -end - -module GenericFunc2 = begin - -type func<'a,'b> = - class - val numCalls: int ref - val impl: 'a -> 'b option - - new(f) = { inherit obj(); numCalls = ref 0; impl=f } - - static member FF (f: func<'a,'b>) (g: func<'b,'c>) = - new func<'a,'c>(fun x -> match f.Invoke(x) with None -> None | Some b -> g.Invoke(b)) - - member x.Invoke(y : 'a) : 'b option = incr x.numCalls; x.impl(y) - end - - -end - -module AnotherGenericFunc = begin - -type func<'a,'b> = - class - abstract Invoke : 'a -> 'b option - static member FF (f: func<'a,'b>) (g: func<'b,'c>) = - {new func<'a,'c>() with Invoke(x) = match f.Invoke(x) with None -> None | Some b -> g.Invoke(b)} - // FEATURE REQUEST: inherit should never be needed for base classes that have a default constructor and no other - // constructors - new() = { } - end - -let konst a = {new func<_,_>() with Invoke(x) = Some a} - -let morph f = {new func<_,_>() with Invoke(x) = Some (f x)} - -let something = func.FF (morph (fun x -> x * x)) (morph (fun x -> x + x)) - -end - - -module UsingPolymorphicRecursion1 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let invoke<'a,'b,..> (f:func<'a,'b>) x = f.impl x -let rec invoke2<'a,..> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke f x with None -> None | Some b -> invoke g b)} -end - -module UsingPolymorphicRecursion2 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let invoke<'a,'b> (f:func<'a,'b>) x = f.impl x - -let rec invoke2<'a,..> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke f x with None -> None | Some b -> invoke g b)} - - -end - - -module UsingPolymorphicRecursion3 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let invoke<'a,..> (f:func<'a,'b>) x = f.impl x - -let rec invoke2<'a,..> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke f x with None -> None | Some b -> invoke g b)} - - -end - -module UsingPolymorphicRecursion4 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let invoke< .. > (f:func<'a,'b>) x = f.impl x - -let rec invoke2<'a,..> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke f x with None -> None | Some b -> invoke g b)} - - -end - -module UsingPolymorphicRecursion5 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let rec invoke2<'a,'b,..> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke2 f x with None -> None | Some b -> invoke2 g b)} - - -end - -module UsingPolymorphicRecursion6 = begin - -type func<'a,'b> = { impl : 'a -> 'b option } - -let rec invoke2<'a,'b> (f:func<'a,'b>) x = f.impl x -and compose (f: func<'a,'b>) (g: func<'b,'c>) = - {impl=(fun x -> match invoke2 f x with None -> None | Some b -> invoke2 g b)} - - -end -*) - - - - -open Microsoft.FSharp.Math - -module BasicOverloadTests = begin +module BasicOverloadTests = let f4 x = 1 + x @@ -451,10 +258,10 @@ module BasicOverloadTests = begin let f30 x = let g x = x + "a" in g x + "3" -end + -module SubtypingAndOperatorOverloads = begin +module SubtypingAndOperatorOverloads = type C() = class static member (+) (x:C,y:C) = new C() @@ -489,9 +296,9 @@ module SubtypingAndOperatorOverloads = begin let f307 (x1: D) (x2: _) = x1 + x2 // TODO: investigate let f308 (x1: _) (x2: D) = x1 + x2 -end + -module OperatorOverloadsWithFloat = begin +module OperatorOverloadsWithFloat = type C() = class static member (+) (x:C,y:float) = new C() @@ -521,12 +328,10 @@ module OperatorOverloadsWithFloat = begin // TODO: investigate let f306 (x1: _) (x2: C) = x1 + x2 -end - -//let f3 (a:matrix) (b:string) = a * b + -module MiscOperatorOverloadTests = begin +module MiscOperatorOverloadTests = let rec findBounding2Power b tp = if b<=tp then tp else findBounding2Power b (tp*2) let leastBounding2Power b = @@ -539,17 +344,17 @@ module MiscOperatorOverloadTests = begin done; res -end -module EnumerationOperatorTests = begin + +module EnumerationOperatorTests = let x1 : System.DateTimeKind = enum 3 let x2 : System.DateTimeKind = enum<_> 3 let x3 = enum 3 let x4 = int32 (enum 3) let inline f5 x = x |> int32 |> enum -end + module TraitCallsAndConstructors = open System diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 2945a54c501..f12123221e4 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -1191,6 +1191,9 @@ module Members = [] let factors p = singleTestBuildAndRun p + [] + let factorsMutrec p = singleTestBuildAndRun p + module Incremental = [] @@ -1207,6 +1210,9 @@ module Members = [] let ops p = singleTestBuildAndRun p + [] + let opsMutrec p = singleTestBuildAndRun p + module Nested = From 6b41765d5d14dffe13c9cc658fad0925459a1955 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 15:28:18 +0100 Subject: [PATCH 197/334] add mroe tests --- tests/fsharp/core/letrec-mutrec/test.fsx | 210 +++++++++++++ tests/fsharp/core/letrec-mutrec2/test.fsx | 342 ++++++++++++++++++++++ tests/fsharp/core/tests_core.fs | 6 + 3 files changed, 558 insertions(+) create mode 100644 tests/fsharp/core/letrec-mutrec/test.fsx create mode 100644 tests/fsharp/core/letrec-mutrec2/test.fsx diff --git a/tests/fsharp/core/letrec-mutrec/test.fsx b/tests/fsharp/core/letrec-mutrec/test.fsx new file mode 100644 index 00000000000..5a150fb787c --- /dev/null +++ b/tests/fsharp/core/letrec-mutrec/test.fsx @@ -0,0 +1,210 @@ +// #Conformance #LetBindings #Recursion #TypeInference #ObjectConstructors #Classes #Records + +module rec Core_letrec_mutrec + +let failures = ref false +let report_failure s = + stderr.WriteLine ("FAIL: "+s); failures := true + +let test t s1 s2 = + if s1 <> s2 then + (stderr.WriteLine ("test "+t+" failed"); + failures := true) + else + stdout.WriteLine ("test "+t+" succeeded") + + +let f = + let x = ref 0 in + fun () -> + x := !x + 1; + let rec g n = if (n = 0) then 1 else h(n-1) + and h n = if (n = 0) then 2 else g(n-1) in + g !x + +do if f() <> 2 then report_failure "ewiucew" +do if f() <> 1 then report_failure "ewiew8w" + + +let nestedInnerRec2 = + let x = ref 0 in + fun () -> + x := !x + 1; + let rec g n = if (n = 0) then !x + 100 else h(n-1) + and h n = if (n = 0) then !x + 200 else g(n-1) in + g !x + +do if nestedInnerRec2() <> 201 then report_failure "ewiucew" +do if nestedInnerRec2() <> 102 then report_failure "ewiew8w" + + + +(* -------------------------------------------------------------------- + * Recursion through constuctors + * -------------------------------------------------------------------- *) + + +type myRecType = { f1: int; f2: myRecType } +let x = { f1=3; f2=x } +let y1 = { f1=3; f2=y2 } +let y2 = { f1=3; f2=y1 } +let f2 = + let x = ref 0 in + fun () -> + x := !x + 1; + let rec y = { f1=3; f2=y } in + y + +do if (f2()).f1 <> 3 then report_failure "ewi3dw8w" +do if (f2()).f2.f1 <> 3 then report_failure "dwc8w" + + +(* TYPEERROR: let rec a = 1 :: a *) + +type myRecType2 = { g1: int; g2: myRecType2 ref } +let z1 = { g1=3; g2= { contents = z2 } } +let z2 = { g1=4; g2={ contents = z1 } } + +do if z2.g1 <> 4 then report_failure "ewieds32w8w" +do if z2.g2.contents.g1 <> 3 then report_failure "ceewieds32w8w" + + +(* -------------------------------------------------------------------- + * Recursion through constuctors + * -------------------------------------------------------------------- *) + +(* -------------------------------------------------------------------- + * Inner recursion where some items go TLR and others do not + * -------------------------------------------------------------------- *) + +(* TLR letrec, with only some functions going TLR. + Required optimisations off to hit bug. + Fix: use SELF-CARRYING env values. +*) + +let apply f x = f x +let dec n = (n:int) (* -1 *) + +let inner () = + let rec + odd n = if n=1 then true else not (even (dec n)) + and even n = if n=0 then true else not (apply odd (dec n)) + in + even 99 + +(* -------------------------------------------------------------------- + * Polymorphic letrec where not all bindings get qualified by all type + * variables. Surprisingly hard to get right in a type-preserving + * compiler. + * -------------------------------------------------------------------- *) + +module PartiallyPolymorphicLetRecTest = + + let f x = g (fun y -> ()) + let g h = () + + + let f2 x = g2 (fun y -> ()); g2 (fun z -> ()) + let g2 h = () + + let f3 x = g3 (fun y -> ()); g3 (fun z -> ()) + let g3 h = h3 (fun z -> ()) + let h3 h = () + + +module GeneralizeObjectExpressions = + + type IPattern<'a,'b> = + abstract Query : ('b -> 'a option) + abstract Make : ('a -> 'b) + + let ApCons = { new IPattern<'a * 'a list, 'a list> with + member __.Query = fun xs -> match xs with y::ys -> Some (y,ys) | _ -> None + member __.Make = fun (x,xs) -> x::xs } + let ApNil = { new IPattern with + member __.Query = fun xs -> match xs with [] -> Some () | _ -> None + member __.Make = fun () -> [] } + + let x1 = ApCons : IPattern + let x2 = ApCons : IPattern + let y1 = ApNil : IPattern + let y2 = ApNil : IPattern + +module GeneralizeObjectExpressions2 = + + type IPattern<'a,'b> = + abstract Query : ('b -> 'a option) + abstract Make : ('a -> 'b) + + let rec ApCons = { new IPattern<'a * 'a list, 'a list> with + member __.Query = fun xs -> match xs with y::ys -> Some (y,ys) | _ -> None + member __.Make = fun (x,xs) -> x::xs } + and ApNil = { new IPattern with + member __.Query = fun xs -> match xs with [] -> Some () | _ -> None + member __.Make = fun () -> [] } + + let x1 = ApCons : IPattern + let x2 = ApCons : IPattern + let y1 = ApNil : IPattern + let y2 = ApNil : IPattern + + +module RecursiveInterfaceObjectExpressions = + + type Expr = App of IOp * Expr | Const of float + type IOp = + abstract Name : string; + abstract Deriv : Expr -> Expr + + + let NegOp = { new IOp with member __.Name = "neg" + member __.Deriv(e) = Const (-1.0) } + let Neg x = App(NegOp,x) + let CosOp = { new IOp with + member __.Name = "cos" + member __.Deriv(e) = Neg(Sin(e)) } + let Cos x = App(CosOp,x) + let Sin x = App(SinOp,x) + let SinOp = { new IOp with + member __.Name = "sin" + member __.Deriv(e) = Cos(e) } + + + let f nm = + let NegOp = { new IOp with member __.Name = nm + member __.Deriv(e) = Const (-1.0) } in + let Neg x = App(NegOp,x) in + let rec CosOp = { new IOp with + member __.Name = nm + member __.Deriv(e) = Neg(Sin(e)) } + and Cos x = App(CosOp,x) + and Sin x = App(SinOp,x) + and SinOp = { new IOp with member __.Name = nm + member __.Deriv(e) = Cos(e) } in + CosOp,Cos,Sin,SinOp,Neg,NegOp + + let ops = f "abc" + let CosOp2 = (let CosOp2,Cos2,Sin2,SinOp2,Neg2,NegOp2 = ops in CosOp2) + let Cos2 = (let CosOp2,Cos2,Sin2,SinOp2,Neg2,NegOp2 = ops in Cos2) + let One = Const 1.0 + let x = Cos(One) + let Two = Const 2.0 + let y = Cos2(Two) + + do if CosOp.Name <> "cos" then report_failure "RecursiveInterfaceObjectExpressions: test 1" + do if CosOp2.Name <> "abc" then report_failure "RecursiveInterfaceObjectExpressions: test 2" + + +#if Portable +let aa = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; exit 0) +#else +do + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + + +do (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) +#endif \ No newline at end of file diff --git a/tests/fsharp/core/letrec-mutrec2/test.fsx b/tests/fsharp/core/letrec-mutrec2/test.fsx new file mode 100644 index 00000000000..17cc11cc512 --- /dev/null +++ b/tests/fsharp/core/letrec-mutrec2/test.fsx @@ -0,0 +1,342 @@ +// #Conformance #LetBindings #Recursion #TypeInference #ObjectConstructors #Classes #Records + +module rec Core_letrec_mutrec2 + +let failures = ref false +let report_failure s = + stderr.WriteLine ("FAIL: "+s); failures := true + +let test t s1 s2 = + if s1 <> s2 then + (stderr.WriteLine ("test "+t+" failed"); + failures := true) + else + stdout.WriteLine ("test "+t+" succeeded") + +let a1 = 1 +let b = a1 +do if a1 <> 1 then report_failure "celkewieds32w8w" +do if b <> a1 then report_failure "cel3f98u8w" + + + +let a2 = test "grekjre" (b2 + 1 ) 3 +let b2 = 2 + + + +let nonRecursiveImmediate () = + stdout.WriteLine "Testing nonRecursiveImmediate"; + let x = ref 1 in + let rec a1 = (x := 3; !x) + and b = a1 in + if a1 <> 3 then report_failure "dqwij"; + if b <> 3 then report_failure "dqwecqwij" + +do nonRecursiveImmediate() +do nonRecursiveImmediate() + +let recObj = {new System.Object() with member __.GetHashCode() = (recObj.ToString()).Length} + +do Printf.printf "recObj.GetHashCode() = %d\n" (recObj.GetHashCode()) +do Printf.printf "recObj.ToString() = %s\n" (recObj.ToString()) +do if recObj.GetHashCode() <> (recObj.ToString()).Length then report_failure "dqwij" + + +let WouldFailAtRuntimeTest () = + let rec a2 = (fun x -> stdout.WriteLine "a2app"; stderr.Flush(); a2 + 2) (stdout.WriteLine "a2arg"; stderr.Flush(); 1) in + a2 + +do try WouldFailAtRuntimeTest (); report_failure "fwoi-03" with _ -> stdout.WriteLine "caught ok!" + +let WouldFailAtRuntimeTest2 () = + let rec a2 = (fun x -> a3 + 2) 1 + and a3 = (fun x -> a2 + 2) 1 in + a2 + a3 + + + +module InitializationGraphAtTopLevel = + + let nyi2 (callback) = callback + let aaa = nyi2 (fun () -> ggg(); ) + let ggg () = (bbb = false) + let bbb = true + + + +module ClassInitTests = + // one initial do bindings - raises exception + type FooFail1() as this = + do + printfn "hi" + this.Bar() + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + // two initial do bindings - raises exception + type FooFail2() as this = + do + printfn "hi" + this.Bar() + do + printfn "hi" + this.Bar() + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + // one initial let _ bindings - raises exception + type FooFail3() as this = + let _ = + printfn "hi" + this.Bar() + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + // one initial let _ bindings then one initial do binding - raises exception + type FooFail4() as this = + let _ = + printfn "hi" + do + printfn "hi" + this.Bar() + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + // two initial let _ bindings - raises exception + type FooFail5() as this = + let _ = + printfn "hi" + this.Bar() + let _ = + printfn "hi" + this.Bar() + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + // one initial let _ bindings then one initial do binding - raises exception + type FooFail6() as this = + let _ = + printfn "hi" + this.Bar() + do + printfn "hi" + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + + // no initial do bindings - succeeds + type FooSucceeds() as this = + let x = 3 + do + printfn "bye" + this.Bar() + + member this.Bar() = printfn "Bar %d" x + + test "cneqec21" (try new FooFail1() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec22" (try new FooFail2() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec23" (try new FooFail3() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec24" (try new FooFail4() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec25" (try new FooFail5() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec26" (try new FooFail6() |> ignore; false with :? System.InvalidOperationException -> true) true + test "cneqec27" (try new FooSucceeds() |> ignore; false with :? System.InvalidOperationException -> true) false + + +module BasicPermutations = + + module Perm1 = + let A1 = 1 + let A2 = A1 + + test "vsdlknv01" (A1,A2) (1,1) + + module Perm2 = + let A1 = A2 + let A2 = 1 + + test "vsdlknv02" (A1,A2) (1,1) + + module Perm3a = + let A1 = A2 + let A2 = 1 + let A3 = 1 + + test "vsdlknv03" (A1,A2,A3) (1,1,1) + + module Perm3b = + let A1 = A2 + let A2 = A3 + let A3 = 1 + + test "vsdlknv04" (A1,A2,A3) (1,1,1) + + module Perm3c = + let A1 = A2 + let A2 = 1 + let A3 = A2 + + test "vsdlknv05" (A1,A2,A3) (1,1,1) + + module Perm3d = + let A1 = A3 + let A2 = 1 + let A3 = 1 + + test "vsdlknv06" (A1,A2,A3) (1,1,1) + + module Perm3e = + let A1 = A3 + let A2 = A3 + let A3 = 1 + + test "vsdlknv07" (A1,A2,A3) (1,1,1) + + module Perm3f = + let A1 = A3 + let A2 = 1 + let A3 = A2 + + test "vsdlknv08" (A1,A2,A3) (1,1,1) + + module Perm3g = + let A1 = A3 + let A2 = A3 + let A3 = 1 + + test "vsdlknv09" (A1,A2,A3) (1,1,1) + + module Perm3h = + let A1 = 1 + let A2 = A1 + let A3 = A2 + + test "vsdlknv0q" (A1,A2,A3) (1,1,1) + + module Perm3i = + let A1 = 1 + let A2 = A3 + let A3 = 1 + + test "vsdlknv0w" (A1,A2,A3) (1,1,1) + + module Perm4i = + let A1 = A4 + let A2 = 1 + let A3 = A2 + let A4 = A3 + + test "vsdlknv0e" (A1,A2,A3,A4) (1,1,1,1) + + module PermMisc = + let A1 = A4 + 1 + let A2 = 1 + let A3 = A2 + 1 + let A4 = A3 + 1 + + test "vsdlknv0r" (A1,A2,A3,A4) (4,1,2,3) + + module bug162155 = + + type SuperType1() = + + abstract Foo : int -> int + + default x.Foo a = a + 1 + + + + type SubType1() = + + inherit SuperType1() + + override x.Foo a = base.Foo(a) + + + + type SuperType2() = + + abstract Foo : int -> int + + default x.Foo a = a + 1 + + + + type SubType2 = + + inherit SuperType2 + + new () = { inherit SuperType2() } + + override x.Foo a = base.Foo(a) + + + type SuperType3() = + + abstract Foo : int -> int + + default x.Foo a = a + 1 + + + + type SubType3() = + + inherit SuperType3() + + override x.Foo a = base.Foo(a) + + + + type SuperType4() = + abstract Foo : int -> int + default x.Foo a = a + 1 + + type SubType4 = + inherit SuperType4 + new () = { inherit SuperType4() } + + // With visual studio SP1 this will not compile + // with the following error: + // + // Error 1 'base' values may only be used to make direct calls + // to the base implementations of overridden members + override x.Foo a = base.Foo(a) + + +#if Portable +let aa = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; exit 0) +#else +let aa = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + + +do (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) +#endif \ No newline at end of file diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index f12123221e4..fb945ae84a8 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -960,6 +960,12 @@ module letrec = [] let letrec p = singleTestBuildAndRun p + [] + let ``letrec (mutrec variations part one)`` p = singleTestBuildAndRun p + + [] + let ``letrec (mutrec variations part two)`` p = singleTestBuildAndRun p + module LibTest = [] From 3e540661061fb26591fbfaaf0db0f7383be51cfe Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 15:30:34 +0100 Subject: [PATCH 198/334] fix tets driver --- tests/fsharp/core/tests_core.fs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index fb945ae84a8..d491af417d9 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -854,7 +854,6 @@ module Unicode = [] let unicode2 p = singleTestBuildAndRun p - check (attempt { module InternalsVisible = From da467eb169d955f0f4c04d2c4b6641ccb5b45b3d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 15:47:14 +0100 Subject: [PATCH 199/334] fix test driver --- tests/fsharp/core/tests_core.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index d491af417d9..583c4373df8 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -42,7 +42,7 @@ module Comprehensions = module ComprehensionsHw = [] - let comprehensions p = check singleTestBuildAndRun p + let comprehensions p = singleTestBuildAndRun p module Control = [] @@ -1208,7 +1208,7 @@ module Members = let incrementalHw p = singleTestBuildAndRun p [] - let incrementalHwMutrec = singleTestBuildAndRun p + let incrementalHwMutrec p = singleTestBuildAndRun p module Ops = From f98a9f0c3a5700eb97ac9e3094277100fd8a516b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 31 May 2016 18:00:07 +0100 Subject: [PATCH 200/334] avoid fsi for tests --- .../core/letrec-mutrec/{test.fsx => test.fs} | 0 .../core/letrec-mutrec2/{test.fsx => test.fs} | 0 .../dont.use.generated.signature | 1 + .../core/members/factors-mutrec/test.fs | 157 ++++++++++++++++++ .../{test.fsx => test.fs} | 0 .../members/ops-mutrec/{test.fsx => test.fs} | 0 6 files changed, 158 insertions(+) rename tests/fsharp/core/letrec-mutrec/{test.fsx => test.fs} (100%) rename tests/fsharp/core/letrec-mutrec2/{test.fsx => test.fs} (100%) create mode 100644 tests/fsharp/core/members/factors-mutrec/dont.use.generated.signature create mode 100644 tests/fsharp/core/members/factors-mutrec/test.fs rename tests/fsharp/core/members/incremental-hw-mutrec/{test.fsx => test.fs} (100%) rename tests/fsharp/core/members/ops-mutrec/{test.fsx => test.fs} (100%) diff --git a/tests/fsharp/core/letrec-mutrec/test.fsx b/tests/fsharp/core/letrec-mutrec/test.fs similarity index 100% rename from tests/fsharp/core/letrec-mutrec/test.fsx rename to tests/fsharp/core/letrec-mutrec/test.fs diff --git a/tests/fsharp/core/letrec-mutrec2/test.fsx b/tests/fsharp/core/letrec-mutrec2/test.fs similarity index 100% rename from tests/fsharp/core/letrec-mutrec2/test.fsx rename to tests/fsharp/core/letrec-mutrec2/test.fs diff --git a/tests/fsharp/core/members/factors-mutrec/dont.use.generated.signature b/tests/fsharp/core/members/factors-mutrec/dont.use.generated.signature new file mode 100644 index 00000000000..fd3906a5d5b --- /dev/null +++ b/tests/fsharp/core/members/factors-mutrec/dont.use.generated.signature @@ -0,0 +1 @@ +"no printing of typar declared constraints" diff --git a/tests/fsharp/core/members/factors-mutrec/test.fs b/tests/fsharp/core/members/factors-mutrec/test.fs new file mode 100644 index 00000000000..8772bc99c06 --- /dev/null +++ b/tests/fsharp/core/members/factors-mutrec/test.fs @@ -0,0 +1,157 @@ +// #Regression #Conformance #MemberDefinitions #ObjectOrientedTypes #Classes + + +//--------------------------------------------------------------- +// Same test as "members\factors" but with "rec" added and declarations in mixed up order + + +module rec Factors // <----- NOTE THE "rec" + +open System +open System.Collections.Generic + +let failures = ref false +let report_failure () = + stderr.WriteLine " NO"; failures := true +let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() + +/// The list of distribution operations (at the moment, this is just the constant distribution). +type DistributionOps<'Distribution> = + /// The constant function distribution. + abstract One : 'Distribution + +/// The 1D Gaussian class for probability distribtion. +type Gaussian1D = + /// The precision mean of the Gaussian + val tau : float + /// The precision of the Gaussian + val pi : float + + /// The standard constructor. + new () = + { tau = 0.0; pi = 0.0; } + /// The parameterised constructor. + new (precisionMean, precision) = + { tau = precisionMean; pi = precision; } + + /// Precision of the Gaussian. + member x.Precision with get() = x.pi + /// Precision times mean of the Gaussian. + member x.PrecisionMean with get() = x.tau + /// Mean of the Gaussian (Mu). + member x.Mean with get () = x.tau / x.pi + /// Variance of the Gaussian (Sigma^2). + member x.Variance with get () = 1.0 / x.pi + + member x.Density (point:Matrix) = + if (point.NoRows > 1 || point.NoColumns > 1) then + failwith "This is a 1D distribution which cannot have a density of multidimensional points." + else + let diff = point.Item(1,1) - x.Mean in + sqrt (x.Precision / (2.0 * System.Math.PI)) * exp (-diff * x.Precision * diff / 2.0) + + /// Absolute difference between two Gaussians + member x.AbsoluteDifference (y: Gaussian1D) = + max (abs (x.PrecisionMean - y.PrecisionMean)) (abs (x.Precision - y.Precision)) + + /// Samples a 1D Gaussian + member x.Sample (numberOfSamples:int) random = M 1 + + interface IDistribution with + override x.Density point = x.Density (point) + override x.AbsoluteDifference distribution = + match distribution with + | :? Gaussian1D as gaussian1D -> x.AbsoluteDifference (gaussian1D) + | _ -> failwith "Wrong distribution" + + override x.Sample numberOfSamples random = x.Sample numberOfSamples random + + /// String representation of a 1D Gaussian + override x.ToString() = "[" + x.Mean.ToString () + "," + (sqrt (x.Variance)).ToString () + "]" + +//*************************************************** +// The distribution operations of a 1D Gaussian +//*************************************************** + +let GaussianDistributionOps = { new DistributionOps with + member __.One = new Gaussian1D (0.0 , 0.0) } + + +/// A single variable node in a factor graph. This is the non-mutable interface. +type IVariableNode = + /// The marginal distribution of the variable. + abstract Distribution : IDistribution + +/// The computation nodes (i.e. factor nodes) of a factor graph. +type IFactorNode = + /// The list of all variables that this factor "talks" to. + abstract VariableNodes : IEnumerable< IVariableNode > + /// The list of messages from the factor to all its variables. + abstract Messages : IEnumerable< IDistribution > + /// Abstract update (computation) mechansim + abstract UpdateMessage : int -> float + + +let OneVariableNode((var: VariableNode<_>),f) = + { new IFactorNode with + member __.UpdateMessage i = + if i > 0 then + raise (new ArgumentOutOfRangeException ("iVariableIndex", "This factor only points to one variable.")); + let oldMarginal = var.distribution in + let newMarginal = f oldMarginal in + var.distribution <- newMarginal; + (oldMarginal :> IDistribution).AbsoluteDifference (newMarginal) + member __.Messages = Seq.ofList [ (* (!message :> IDistribution) *) ] + member __.VariableNodes = Seq.ofList [ (var :> IVariableNode) ] } + + +module ResizeArray = + /// Iterates the function f for every element of the ResizeArray. + let iter f (r:ResizeArray<_>) = r.ForEach (fun x -> f x) + + /// Creates a ResizeArray from a List. + let of_list l :ResizeArray<_> = new ResizeArray<_>(List.toArray l) + +type Matrix = + | M of int + member x.NoRows = 0 + member x.NoColumns = 0 + member x.Item with get((i:int),(j:int)) = 0.0 + +/// An abstract class for probability distributions in the exponential family. +type IDistribution = + /// Gets a sample from the distribution. + abstract member Sample : int -> System.Random -> Matrix + /// Computes the probability density value at a particular point. + abstract member Density : Matrix -> float + /// Computes the absolute change between two distributions. + abstract member AbsoluteDifference : IDistribution -> float + + +/// A single variable in a factor graph. +type VariableNode<'Distribution> when 'Distribution :> IDistribution = + interface IVariableNode with + /// Just return the distribution + member x.Distribution = x.distribution :> IDistribution + + /// The marginal distribution of the variable. + val mutable distribution : 'Distribution + + /// Sets up a new variable node + new (dOps : DistributionOps<_>) = { distribution = dOps.One; } + +let Gaussian1DPriorFactorNode((var: VariableNode), mean, variance) = + let update (oldMarginal : Gaussian1D) = new Gaussian1D (mean / variance + oldMarginal.PrecisionMean, 1.0 / variance + oldMarginal.Precision) in + OneVariableNode(var, update) + + +//--------------------------------------------------------------------- +// Finish up + + +let _ = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) + diff --git a/tests/fsharp/core/members/incremental-hw-mutrec/test.fsx b/tests/fsharp/core/members/incremental-hw-mutrec/test.fs similarity index 100% rename from tests/fsharp/core/members/incremental-hw-mutrec/test.fsx rename to tests/fsharp/core/members/incremental-hw-mutrec/test.fs diff --git a/tests/fsharp/core/members/ops-mutrec/test.fsx b/tests/fsharp/core/members/ops-mutrec/test.fs similarity index 100% rename from tests/fsharp/core/members/ops-mutrec/test.fsx rename to tests/fsharp/core/members/ops-mutrec/test.fs From 3b662ee115d5088664577b50fa99717ef13fa831 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 1 Jun 2016 09:17:19 +0200 Subject: [PATCH 201/334] Create test that reproduces #1231 --- .../FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs index 9125a72f371..7a4bf490b5b 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs @@ -420,6 +420,12 @@ type AsyncModule() = Check.QuickThrowOnFailure (normalize >> runChoice) #endif + [] + member this.``dispose should not throw when called on null``() = + let result = async { use x = null in return () } |> Async.RunSynchronously + + Assert.AreEqual((), result) + [] member this.``error on one workflow should cancel all others``() = let counter = From 301c2cc0ae77df1442cb294f202c954ecd48f17b Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 1 Jun 2016 10:07:32 +0200 Subject: [PATCH 202/334] Create a notnullFast primitive - fixes #1231 --- src/fsharp/FSharp.Core/control.fs | 4 ++-- src/fsharp/FSharp.Core/prim-types.fs | 5 +++++ src/fsharp/FSharp.Core/prim-types.fsi | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/control.fs b/src/fsharp/FSharp.Core/control.fs index b8cdaeffbce..07aaf2c118e 100644 --- a/src/fsharp/FSharp.Core/control.fs +++ b/src/fsharp/FSharp.Core/control.fs @@ -908,8 +908,8 @@ namespace Microsoft.FSharp.Control resultA() /// Implement use/Dispose - let usingA (r:'T :> IDisposable) f = - tryFinallyA (fun () -> r.Dispose()) (callA f r) + let usingA (r:'T :> IDisposable) f = + tryFinallyA (fun () -> if BasicInlinedOperations.notnullFast r then r.Dispose()) (callA f r) let ignoreA p = bindA p (fun _ -> doneA) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 73df74a77d5..ef98d51a647 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -478,6 +478,11 @@ namespace Microsoft.FSharp.Core let inline isinstPrim<'T>(x:obj) = (# "isinst !0" type ('T) x : obj #) let inline castclassPrim<'T>(x:obj) = (# "castclass !0" type ('T) x : 'T #) let inline notnullPrim<'T when 'T : not struct>(x:'T) = (# "ldnull cgt.un" x : bool #) + + let inline internal notnullFast (x: ^T) = + notnullPrim x + when ^T struct = true + let inline iscastPrim<'T when 'T : not struct>(x:obj) = (# "isinst !0" type ('T) x : 'T #) diff --git a/src/fsharp/FSharp.Core/prim-types.fsi b/src/fsharp/FSharp.Core/prim-types.fsi index 117734705e5..41c63b0e231 100644 --- a/src/fsharp/FSharp.Core/prim-types.fsi +++ b/src/fsharp/FSharp.Core/prim-types.fsi @@ -763,6 +763,12 @@ namespace Microsoft.FSharp.Core /// System.Int64. type int64<[] 'Measure> = int64 + module BasicInlinedOperations = + + /// Determines whether the given value is null. + /// The value to check. + /// True when value is null, false otherwise. + val inline internal notnullFast : value:'T -> bool /// Language primitives associated with the F# language module LanguagePrimitives = From f473a1f611ef2b934d5a7cebe0940720773793b3 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 1 Jun 2016 10:11:08 +0200 Subject: [PATCH 203/334] Create a IsNonNull primitive - fixes #1231 --- src/fsharp/FSharp.Core/control.fs | 4 ++-- src/fsharp/FSharp.Core/prim-types.fs | 10 +++++----- src/fsharp/FSharp.Core/prim-types.fsi | 11 ++++------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/fsharp/FSharp.Core/control.fs b/src/fsharp/FSharp.Core/control.fs index 07aaf2c118e..cb10ea490ec 100644 --- a/src/fsharp/FSharp.Core/control.fs +++ b/src/fsharp/FSharp.Core/control.fs @@ -908,8 +908,8 @@ namespace Microsoft.FSharp.Control resultA() /// Implement use/Dispose - let usingA (r:'T :> IDisposable) f = - tryFinallyA (fun () -> if BasicInlinedOperations.notnullFast r then r.Dispose()) (callA f r) + let usingA (r:'T :> IDisposable) (f:'T -> Async<'a>) : Async<'a> = + tryFinallyA (fun () -> if LanguagePrimitives.IsNonNull r then r.Dispose()) (callA f r) let ignoreA p = bindA p (fun _ -> doneA) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index ef98d51a647..65b521bccb9 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -415,7 +415,7 @@ namespace Microsoft.FSharp.Core #endif - module BasicInlinedOperations = + module internal BasicInlinedOperations = let inline unboxPrim<'T>(x:obj) = (# "unbox.any !0" type ('T) x : 'T #) let inline box (x:'T) = (# "box !0" type ('T) x : obj #) let inline not (b:bool) = (# "ceq" b false : bool #) @@ -478,10 +478,6 @@ namespace Microsoft.FSharp.Core let inline isinstPrim<'T>(x:obj) = (# "isinst !0" type ('T) x : obj #) let inline castclassPrim<'T>(x:obj) = (# "castclass !0" type ('T) x : 'T #) let inline notnullPrim<'T when 'T : not struct>(x:'T) = (# "ldnull cgt.un" x : bool #) - - let inline internal notnullFast (x: ^T) = - notnullPrim x - when ^T struct = true let inline iscastPrim<'T when 'T : not struct>(x:obj) = (# "isinst !0" type ('T) x : 'T #) @@ -663,6 +659,10 @@ namespace Microsoft.FSharp.Core // code for each new datatype. module LanguagePrimitives = + + let inline IsNonNull (x: 'T) = + (# "ldnull cgt.un" x : bool #) + when ^T struct = true module (* internal *) ErrorStrings = diff --git a/src/fsharp/FSharp.Core/prim-types.fsi b/src/fsharp/FSharp.Core/prim-types.fsi index 41c63b0e231..76b57e57fe2 100644 --- a/src/fsharp/FSharp.Core/prim-types.fsi +++ b/src/fsharp/FSharp.Core/prim-types.fsi @@ -763,16 +763,13 @@ namespace Microsoft.FSharp.Core /// System.Int64. type int64<[] 'Measure> = int64 - module BasicInlinedOperations = - - /// Determines whether the given value is null. - /// The value to check. - /// True when value is null, false otherwise. - val inline internal notnullFast : value:'T -> bool - /// Language primitives associated with the F# language module LanguagePrimitives = + /// Determines whether the given value is not null. + /// The value to check. + /// True when value is not null, false otherwise. + val inline IsNonNull : value:'T -> bool /// Compare two values for equality using partial equivalence relation semantics ([nan] <> [nan]) /// The first value. From c7fb7386da660609c3e53a0452e36670a165610b Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 1 Jun 2016 15:04:59 +0200 Subject: [PATCH 204/334] Add a test for structs --- .../Microsoft.FSharp.Control/AsyncModule.fs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs index 7a4bf490b5b..cfa03d36597 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs @@ -13,6 +13,12 @@ open NUnit.Framework open FsCheck #endif +type [] Dummy (x: int) = + member this.X = x + interface IDisposable with + member this.Dispose () = () + + #if !(FSHARP_CORE_PORTABLE || FSHARP_CORE_NETCORE_PORTABLE) [] module ChoiceUtils = @@ -426,6 +432,12 @@ type AsyncModule() = Assert.AreEqual((), result) + [] + member this.``dispose should not throw when called on null struct``() = + let result = async { use x = new Dummy(1) in return () } |> Async.RunSynchronously + + Assert.AreEqual((), result) + [] member this.``error on one workflow should cancel all others``() = let counter = From 8746779ba9eef875cbed168d2062971d9169cf31 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 1 Jun 2016 14:43:45 +0100 Subject: [PATCH 205/334] trial fix to name resolution --- src/fsharp/TypeChecker.fs | 487 ++++++++++++++------------ tests/fsharp/core/namespaces/test.fs | 45 +++ tests/fsharp/core/namespaces/test.fsi | 37 ++ 3 files changed, 337 insertions(+), 232 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 07d06d05bf2..3e49b90612d 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -399,7 +399,7 @@ let AddLocalVal tcSink scopem v env = CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) env -let AddLocalExnDefnAndReport tcSink scopem (exnc:Tycon) env = +let AddLocalExnDefnAndReport tcSink scopem env (exnc:Tycon) = let env = ModifyNameResEnv (fun nenv -> AddExceptionDeclsToNameEnv BulkAdd.No nenv (mkLocalEntityRef exnc)) env (* Also make VisualStudio think there is an identifier in scope at the range of the identifier text of its binding location *) CallEnvSink tcSink (exnc.Range,env.NameEnv,env.eAccessRights) @@ -412,8 +412,8 @@ let AddLocalTyconRefs ownDefinition g amap m tcrefs env = let AddLocalTycons g amap m (tycons: Tycon list) env = env |> AddLocalTyconRefs false g amap m (List.map mkLocalTyconRef tycons) -let AddLocalTyconsAndReport tcSink g amap scopem tycons env = - let env = AddLocalTycons g amap scopem tycons env +let AddLocalTyconsAndReport tcSink scopem g amap m tycons env = + let env = AddLocalTycons g amap m tycons env CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) env @@ -460,16 +460,20 @@ let AddLocalRootModuleOrNamespace tcSink g amap scopem env (mtyp:ModuleOrNamespa CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) env -let AddModuleAbbreviation tcSink scopem id modrefs env = +let AddModuleAbbreviationAndReport tcSink scopem id modrefs env = let env = ModifyNameResEnv (fun nenv -> AddModuleAbbrevToNameEnv id nenv modrefs) env CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) let item = Item.ModuleOrNamespaces(modrefs) CallNameResolutionSink tcSink (id.idRange,env.NameEnv,item,item,ItemOccurence.Use,env.DisplayEnv,env.eAccessRights) env -let AddLocalSubModuleAndReport tcSink g amap m scopem env (modul:ModuleOrNamespace) = +let AddLocalSubModule g amap m env (modul:ModuleOrNamespace) = let env = ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights nenv (mkLocalModRef modul)) env let env = {env with eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems} + env + +let AddLocalSubModuleAndReport tcSink scopem g amap m env (modul:ModuleOrNamespace) = + let env = AddLocalSubModule g amap m env modul CallEnvSink tcSink (scopem,env.NameEnv,env.eAccessRights) env @@ -13004,7 +13008,7 @@ module MutRecBindingChecking = errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)),m)) let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace) modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) - let env = (if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env else env) + let env = (if modrefs.Length > 0 then AddModuleAbbreviationAndReport cenv.tcSink scopem id modrefs env else env) env @@ -13014,28 +13018,54 @@ module MutRecBindingChecking = (fun envAbove (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec)) -> MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove decls -> + // Collect the type definitions, exception definitions, modules and "open" declarations let tycons = decls |> List.choose (function MutRecShape.Tycon d -> getTyconOpt d | _ -> None) let mspecs = decls |> List.choose (function MutRecShape.Module (MutRecDefnsPhase2DataForModule (_, mspec),_) -> Some mspec | _ -> None) let moduleAbbrevs = decls |> List.choose (function MutRecShape.ModuleAbbrev (MutRecDataForModuleAbbrev (id,mp,m)) -> Some (id,mp,m) | _ -> None) let opens = decls |> List.choose (function MutRecShape.Open (MutRecDataForOpen (mp,m)) -> Some (mp,m) | _ -> None) let lets = decls |> List.collect (function MutRecShape.Lets binds -> getVals binds | _ -> []) + let exns = tycons |> List.filter (fun (tycon:Tycon) -> tycon.IsExceptionDecl) + + // Add the type definitions, exceptions, modules and "open" declarations. + // The order here is sensitive. The things added first will be resolved in an environment + // where not everything has been added. The things added last will be preferred in name + // resolution. + // + // 'open' declarations ('open M') may refer to modules being defined ('M') and so must be + // processed in an environment where 'M' is present. However, in later processing the names of + // modules being defined ('M') take precedence over those coming from 'open' declarations. + // So add the names of the modules being defined to the environment twice - once to allow + // the processing of 'open M', and once to allow the correct name resolution of 'M'. + // + // Module abbreviations being defined ('module M = A.B.C') are not available for use in 'open' + // declarations. So + // namespace rec N = + // open M + // module M = FSharp.Core.Operators + // is not allowed. - // Add the type definitions, exceptions, modules and "open" declarations let envForDecls = envAbove + // Add the modules being defined + let envForDecls = (envForDecls, mspecs) ||> List.fold ((if report then AddLocalSubModuleAndReport cenv.tcSink scopem else AddLocalSubModule) cenv.g cenv.amap m) + // Process the 'open' declarations let envForDecls = (envForDecls, opens) ||> List.fold (fun env (mp,m) -> TcOpenDecl cenv.tcSink cenv.g cenv.amap m scopem env mp) - let envForDecls = if report then AddLocalTyconsAndReport cenv.tcSink cenv.g cenv.amap scopem tycons envForDecls else AddLocalTycons cenv.g cenv.amap scopem tycons envForDecls - let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) - let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem) + // Add the type definitions being defined + let envForDecls = (if report then AddLocalTyconsAndReport cenv.tcSink scopem else AddLocalTycons) cenv.g cenv.amap m tycons envForDecls + // Add the exception definitions being defined + let envForDecls = (envForDecls, exns) ||> List.fold (AddLocalExnDefnAndReport cenv.tcSink scopem) + // Add the modules again (but don't report them a second time) + let envForDecls = (envForDecls, mspecs) ||> List.fold (AddLocalSubModule cenv.g cenv.amap m) + // Add the module abbreviations let envForDecls = (envForDecls, moduleAbbrevs) ||> List.fold (TcModuleAbbrevDecl cenv scopem) + // Add the values and members let envForDecls = AddLocalVals cenv.tcSink scopem lets envForDecls envForDecls) - /// Check the members and 'let' definitions in a mutually recursive group of definitions. + /// Phase 2: Check the members and 'let' definitions in a mutually recursive group of definitions. let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRecPrelimWithReprs: TcEnv, mutRecDefns: MutRecDefnsPhase2Info) = let g = cenv.g let denv = envMutRecPrelimWithReprs.DisplayEnv - // Phase2A: create member prelimRecValues for "recursive" items, i.e. ctor val and member vals // Phase2A: also processes their arg patterns - collecting type assertions let (defnsAs, uncheckedRecBinds, tpenv) = TcMutRecBindings_Phase2A_CreateRecursiveValuesAndCheckArgumentPatterns cenv tpenv (envMutRecPrelimWithReprs, mutRecDefns) @@ -13204,11 +13234,33 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec let (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, _, _, newslotsOK, _)) = tyconMembersData let containerInfo = ContainerInfo(parent, Some(MemberOrValContainerInfo(tcref, Some(ity',implTySet), baseValOpt, safeInitInfo, declaredTyconTypars))) defn |> List.choose (fun mem -> - match mem with - | SynMemberDefn.Member(_,m) -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,mem,m)) - | SynMemberDefn.AutoProperty(_,_,_,_,_,_,_,_,_,_,m) -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,mem,m)) - | _ -> errorR(Error(FSComp.SR.tcMemberNotPermittedInInterfaceImplementation(),mem.Range)); None) - + match mem with + | SynMemberDefn.Member(_,m) -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,mem,m)) + | SynMemberDefn.AutoProperty(_,_,_,_,_,_,_,_,_,_,m) -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,mem,m)) + | _ -> errorR(Error(FSComp.SR.tcMemberNotPermittedInInterfaceImplementation(),mem.Range)); None) + + let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK, _)) = + let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) + members + |> List.choose (fun memb -> + match memb with + | SynMemberDefn.ImplicitCtor _ + | SynMemberDefn.ImplicitInherit _ + | SynMemberDefn.LetBindings _ + | SynMemberDefn.AutoProperty _ + | SynMemberDefn.Member _ + | SynMemberDefn.Open _ + -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,memb,memb.Range)) + + // Interfaces exist in the member list - handled above in interfaceMembersFromTypeDefn + | SynMemberDefn.Interface _ -> None + + // The following should have been List.unzip out already in SplitTyconDefn + | SynMemberDefn.AbstractSlot _ + | SynMemberDefn.ValField _ + | SynMemberDefn.Inherit _ -> error(InternalError("Unexpected declaration element",memb.Range)) + | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(),memb.Range))) + let tpenv = emptyUnscopedTyparEnv try @@ -13230,28 +13282,6 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec // The rest should have been removed by splitting, they belong to "core" (they are "shape" of type, not implementation) | _ -> error(Error(FSComp.SR.tcDeclarationElementNotPermittedInAugmentation(),mem.Range)))) - let tyconBindingsOfTypeDefn (MutRecDefnsPhase2DataForTycon(_, parent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, _, newslotsOK, _)) = - let containerInfo = ContainerInfo(parent,Some(MemberOrValContainerInfo(tcref, None, baseValOpt, safeInitInfo, declaredTyconTypars))) - members - |> List.choose (fun memb -> - match memb with - | SynMemberDefn.ImplicitCtor _ - | SynMemberDefn.ImplicitInherit _ - | SynMemberDefn.LetBindings _ - | SynMemberDefn.AutoProperty _ - | SynMemberDefn.Member _ - | SynMemberDefn.Open _ - -> Some(TyconBindingDefn(containerInfo,newslotsOK,declKind,memb,memb.Range)) - - // Interfaces exist in the member list - handled above in interfaceMembersFromTypeDefn - | SynMemberDefn.Interface _ -> None - - // The following should have been List.unzip out already in SplitTyconDefn - | SynMemberDefn.AbstractSlot _ - | SynMemberDefn.ValField _ - | SynMemberDefn.Inherit _ -> error(InternalError("Unexpected declaration element",memb.Range)) - | SynMemberDefn.NestedType _ -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(),memb.Range))) - let binds : MutRecDefnsPhase2Info = (envMutRec, mutRecDefns) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls tyconData -> @@ -13758,7 +13788,7 @@ module TcExceptionDeclarations = let TcExnDefn cenv envInitial parent (SynExceptionDefn(core,aug,m),scopem) = let binds1,exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots, (fun () -> ())))] let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) @@ -13769,7 +13799,7 @@ module TcExceptionDeclarations = let TcExnSignature cenv envInitial parent tpenv (SynExceptionSig(core,aug,_),scopem) = let binds,exnc = TcExnDefnCore cenv envInitial parent core - let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem exnc (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) + let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc let ecref = mkLocalEntityRef exnc let vals,_ = TcTyconMemberSpecs cenv envMutRec (ContainerInfo(parent,Some(MemberOrValContainerInfo(ecref,None,None,NoSafeInitInfo,[])))) ModuleOrMemberBinding tpenv aug binds,vals,ecref,envMutRec @@ -13896,12 +13926,36 @@ module EstablishTypeDefinitionCores = let ty',_ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty yield (ty',m) - //| SynTypeDefnSimpleRepr.Exception (SynExceptionDefnRepr(_,UnionCase(_,_,args,_,_,_),reprIdOpt,_,_,m)) = - // let structuralTypes = args' |> List.map (fun rf -> (rf.FormalType, rf.Range)) - | _ -> () ] + let ComputeModuleOrNamespaceKind g isModule attribs = + if not isModule then Namespace + elif ModuleNameIsMangled g attribs then FSharpModuleWithSuffix + else ModuleOrType + + let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm+FSharpModuleSuffix | _ -> nm) + + + let TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial parent compInfo = + let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo + let id = ComputeModuleName longPath + let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs + let modKind = ComputeModuleOrNamespaceKind cenv.g true modAttrs + let modName = AdjustModuleName modKind id.idText + + let vis,_ = ComputeAccessAndCompPath envInitial None id.idRange vis parent + + CheckForDuplicateModule envInitial id.idText id.idRange + let id = ident (modName, id.idRange) + CheckForDuplicateConcreteType envInitial id.idText im + CheckNamespaceModuleOrTypeName cenv.g id + + let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind + let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) + let innerParent = Parent (mkLocalModRef mspec) + MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, envForDecls) + /// Establish 'type C < T1... TN > = ...' including /// - computing the mangled name for C /// but @@ -14399,7 +14453,7 @@ module EstablishTypeDefinitionCores = try let id = tycon.Id let thisTyconRef = mkLocalTyconRef tycon - let innerParent = Parent(thisTyconRef) + let innerParent = Parent thisTyconRef let thisTyInst,thisTy = generalizeTyconRef thisTyconRef let hasAbstractAttr = HasFSharpAttribute cenv.g cenv.g.attrib_AbstractClassAttribute attrs @@ -14740,7 +14794,7 @@ module EstablishTypeDefinitionCores = None, NoSafeInitInfo /// Check that a set of type definitions is free of cycles in abbreviations - let private CheckForCyclicAbbreviations tycons = + let private TcTyconDefnCore_CheckForCyclicAbbreviations tycons = let edgesFrom (tycon:Tycon) = @@ -14805,7 +14859,7 @@ module EstablishTypeDefinitionCores = /// Check that a set of type definitions is free of inheritance cycles - let CheckForCyclicStructsAndInheritance cenv tycons = + let TcTyconDefnCore_CheckForCyclicStructsAndInheritance cenv tycons = // Overview: // Given several tycons now being defined (the "intial" tycons). // Look for cycles in inheritance and struct-field-containment. @@ -14926,37 +14980,6 @@ module EstablishTypeDefinitionCores = tycon.Data.entity_tycon_repr <- TNoRepr errorR(Error(FSComp.SR.tcTypeDefinitionIsCyclicThroughInheritance(),tycon.Range))) - let isAugmentationTyconDefnRepr x = - match x with - | (SynTypeDefnSimpleRepr.General(TyconAugmentation,_,_,_,_,_,_,_)) -> true - | _ -> false - - let ComputeModuleOrNamespaceKind g isModule attribs = - if not isModule then Namespace - elif ModuleNameIsMangled g attribs then FSharpModuleWithSuffix - else ModuleOrType - - let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm^FSharpModuleSuffix | _ -> nm) - - - let TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial parent compInfo = - let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo - let id = ComputeModuleName longPath - let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs - let modKind = ComputeModuleOrNamespaceKind cenv.g true modAttrs - - let vis,_ = ComputeAccessAndCompPath envInitial None id.idRange vis parent - - CheckForDuplicateModule envInitial id.idText id.idRange - let id = ident (AdjustModuleName modKind id.idText, id.idRange) - CheckForDuplicateConcreteType envInitial id.idText im - CheckNamespaceModuleOrTypeName cenv.g id - - let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind - let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) - let innerParent = Parent (mkLocalModRef mspec) - MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, envForDecls) - // Interlude between Phase1D and Phase1E - Check and publish the explicit constraints. let TcMutRecDefns_CheckExplicitConstraints cenv tpenv m checkCxs envMutRecPrelim withEnvs = @@ -14981,11 +15004,11 @@ module EstablishTypeDefinitionCores = typeDefCores |> MutRecShapes.mapWithParent (parent, envInitial) - // Do this for each module definition, building the initial Entity: - (fun (innerParent, envForDecls) modInfo -> - TcTyconDefnCore_Phase1A_BuildInitialModule cenv envForDecls innerParent modInfo) + // Build the initial entity for each module definition + (fun (innerParent, envForDecls) compInfo -> + TcTyconDefnCore_Phase1A_BuildInitialModule cenv envForDecls innerParent compInfo) - // Do this for each type definition, building the initial Tycon: + // Build the initial Tycon for each type definition (fun (innerParent, envForDecls) (typeDefCore,tyconMemberInfo) -> let (MutRecDefnsPhase1DataForTycon(_,_,_,_,_,isAtOriginalTyconDefn)) = typeDefCore let tyconOpt = @@ -14995,7 +15018,7 @@ module EstablishTypeDefinitionCores = None (typeDefCore, tyconMemberInfo, innerParent), tyconOpt) - // Do this for each 'let' definition (just package up the data, no processing) + // Bundle up the data for each 'val', 'member' or 'let' definition (just package up the data, no processing yet) (fun (innerParent,_) synBinds -> let containerInfo = ModuleOrNamespaceContainerInfo(match innerParent with Parent p -> p | _ -> failwith "unreachable") mkLetInfo containerInfo synBinds) @@ -15049,7 +15072,7 @@ module EstablishTypeDefinitionCores = // Check for cyclic abbreviations. If this succeeds we can start reducing abbreviations safely. let tycons = withEntities |> MutRecShapes.collectTycons |> List.choose snd - CheckForCyclicAbbreviations tycons + TcTyconDefnCore_CheckForCyclicAbbreviations tycons // Phase 1D. Establish the super type and interfaces (no constraint checking, because constraints not yet established) (envMutRecPrelim, withAttrs) |> TcTyconDefnCore_Phase1D_Phase1F_EstablishSuperTypesAndInterfaceTypes cenv tpenv inSig FirstPass @@ -15097,7 +15120,8 @@ module EstablishTypeDefinitionCores = (envMutRecPrelim, withAttrs) ||> MutRecShapes.extendEnvs (fun envForDecls decls -> let tycons = decls |> List.choose (function MutRecShape.Tycon (_, Some (tycon,_)) -> Some tycon | _ -> None) - let envForDecls = (envForDecls, tycons) ||> List.fold (fun env tycon -> if tycon.IsExceptionDecl then AddLocalExnDefnAndReport cenv.tcSink scopem tycon env else env) + let exns = tycons |> List.filter (fun tycon -> tycon.IsExceptionDecl) + let envForDecls = (envForDecls, exns) ||> List.fold (AddLocalExnDefnAndReport cenv.tcSink scopem) envForDecls) // Phase1G. Establish inheritance hierarchy @@ -15119,13 +15143,14 @@ module EstablishTypeDefinitionCores = // Now check for cyclic structs and inheritance. It's possible these should be checked as separate conditions. // REVIEW: checking for cyclic inheritance is happening too late. See note above. - CheckForCyclicStructsAndInheritance cenv tycons + TcTyconDefnCore_CheckForCyclicStructsAndInheritance cenv tycons (tycons, envMutRecPrelim, withBaseValsAndSafeInitInfos) -module TcDeclarations = begin +/// Bind declarations in implementation and signature files +module TcDeclarations = /// Given a type definition, compute whether its members form an extension of an existing type, and if so if it is an /// intrinsic or extrinsic extension @@ -15198,6 +15223,7 @@ module TcDeclarations = begin declKind, tcref, typars + let private isAugmentationTyconDefnRepr = function (SynTypeDefnSimpleRepr.General(TyconAugmentation,_,_,_,_,_,_,_)) -> true | _ -> false let private isAutoProperty = function SynMemberDefn.AutoProperty _ -> true | _ -> false let private isMember = function SynMemberDefn.Member _ -> true | _ -> false let private isImplicitCtor = function SynMemberDefn.ImplicitCtor _ -> true | _ -> false @@ -15266,15 +15292,12 @@ module TcDeclarations = begin | _ -> () - /// Parallels SplitTyconSignature/SplitTyconDefn] /// Separates the definition into core (shape) and body. + /// /// core = synTyconInfo,simpleRepr,interfaceTypes /// where simpleRepr can contain inherit type, declared fields and virtual slots. /// body = members /// where members contain methods/overrides, also implicit ctor, inheritCall and local definitions. - ///------ - /// The tinfos arg are the enclosing types when processing nested types... - /// The tinfos arg is not currently used... just stacked up. let rec private SplitTyconDefn (TypeDefn(synTyconInfo,trepr,extraMembers,_)) = let implements1 = List.choose (function SynMemberDefn.Interface (ty,_,_) -> Some(ty,ty.Range) | _ -> None) extraMembers match trepr with @@ -15420,14 +15443,14 @@ module TcDeclarations = begin | SynMemberDefn.ImplicitCtor (_,_,spats,_, _) -> isNil spats | _ -> false) let repr = SynTypeDefnSimpleRepr.General(kind,inherits,slotsigs,fields,isConcrete,isIncrClass,implicitCtorSynPats,m) - let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + let isAtOriginalTyconDefn = not (isAugmentationTyconDefnRepr repr) let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements2@implements1, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isAtOriginalTyconDefn) core, members @ extraMembers | SynTypeDefnRepr.Simple(repr,_) -> let members = [] - let isAtOriginalTyconDefn = not (EstablishTypeDefinitionCores.isAugmentationTyconDefnRepr repr) + let isAtOriginalTyconDefn = not (isAugmentationTyconDefnRepr repr) let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, repr, implements1, false, false, isAtOriginalTyconDefn) core, members @ extraMembers @@ -15436,36 +15459,33 @@ module TcDeclarations = begin let core = MutRecDefnsPhase1DataForTycon(synTyconInfo, SynTypeDefnSimpleRepr.Exception r, implements1, false, false, isAtOriginalTyconDefn) core, extraMembers - let SplitMutRecDefns mutRecDefns = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn - - let private PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, tyDeclRange) = - let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo - - let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls false tyDeclRange typars cs longPath - - let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) // NewSlotsOK only on fsobjs - - if nonNil members && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclRange)) - - MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs) - //------------------------------------------------------------------------- - // Bind type definitions - main - //------------------------------------------------------------------------- + /// Bind a collection of mutually recursive definitions in an implementation file let TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = - let inSig = false - let mutRecDefnsAfterSplit = SplitMutRecDefns mutRecDefns + + // Split the definitions into "core representations" and "members". The code to process core representations + // is shared between processing of signature files and implementation files. + let mutRecDefnsAfterSplit = mutRecDefns |> MutRecShapes.mapTycons SplitTyconDefn + + // Create the entities for each module and type definition, and process the core representation of each type definition. let tycons, envMutRecPrelim, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo synBinds -> [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) - cenv envInitial parent inSig tpenv (mutRecDefnsAfterSplit,m,scopem) + cenv envInitial parent false tpenv (mutRecDefnsAfterSplit,m,scopem) + // Package up the phase two information for processing members. let mutRecDefnsAfterPrep = (envMutRecPrelim,mutRecDefnsAfterCore) ||> MutRecShapes.mapTyconsWithEnv (fun envForDecls ((typeDefnCore, members, innerParent), tyconOpt, fixupFinalAttrs, (baseValOpt, safeInitInfo)) -> - let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore - PrepareTyconMemberDefns tyconOpt fixupFinalAttrs isAtOriginalTyconDefn cenv innerParent envForDecls (synTyconInfo, baseValOpt, safeInitInfo, members, synTyconInfo.Range)) + let (MutRecDefnsPhase1DataForTycon(synTyconInfo,_,_,_,_,isAtOriginalTyconDefn)) = typeDefnCore + let tyDeclRange = synTyconInfo.Range + let (ComponentInfo(_,typars, cs,longPath, _, _, _,_)) = synTyconInfo + let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls false tyDeclRange typars cs longPath + let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) + if nonNil members && tcref.IsTypeAbbrev then + errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclRange)) + MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs)) // By now we've established the full contents of type definitions apart from their // members and any fields determined by implicit construction. We know the kinds and @@ -15502,16 +15522,14 @@ module TcDeclarations = begin binds, binds3) // Check for cyclic structs and inheritance all over again, since we may have added some fields to the struct when generating the implicit construction syntax - EstablishTypeDefinitionCores.CheckForCyclicStructsAndInheritance cenv tycons + EstablishTypeDefinitionCores.TcTyconDefnCore_CheckForCyclicStructsAndInheritance cenv tycons withExtraBindings,envFinal //------------------------------------------------------------------------- - // Bind type specifications - //------------------------------------------------------------------------- - /// Parallels split_tycon[Spfn/Defn] + /// Separates the signature declaration into core (shape) and body. let rec private SplitTyconSignature (TypeDefnSig(synTyconInfo,trepr,extraMembers,_)) = let implements1 = extraMembers |> List.choose (function SynMemberSig.Interface (f,m) -> Some(f,m) | _ -> None) @@ -15569,7 +15587,6 @@ module TcDeclarations = begin let tyconCore = MutRecDefnsPhase1DataForTycon (synTyconInfo, r, implements1, false, false, isAtOriginalTyconDefn) tyconCore, (synTyconInfo,extraMembers) - let SplitMutRecSignatures mutRecSigs = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let private TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefns = (envMutRec,mutRecDefns) ||> MutRecShapes.mapWithEnv @@ -15593,9 +15610,10 @@ module TcDeclarations = begin env) - let TcMutRecSignatureDecls cenv env parent tpenv (tspecs:MutRecSigsInitialData,m,scopem) = - let mutRecDefnsAfterSplit = SplitMutRecSignatures tspecs - let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv env parent true tpenv (mutRecDefnsAfterSplit,m,scopem) + /// Bind a collection of mutually recursive declarations in a signature file + let TcMutRecSignatureDecls cenv env parent tpenv (mutRecSigs:MutRecSigsInitialData,m,scopem) = + let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv env parent true tpenv (mutRecSigsAfterSplit,m,scopem) // Updates the types of the modules to contain the inferred contents to far, which includes values and members mutRecDefnsAfterCore |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> @@ -15603,16 +15621,15 @@ module TcDeclarations = begin let _ = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefnsAfterCore envMutRec -end //------------------------------------------------------------------------- // Bind module types //------------------------------------------------------------------------- -let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) e : Eventually = +let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : Eventually = eventually { try - match e with + match synSigDecl with | SynModuleSigDecl.Exception (edef,m) -> let scopem = unionRanges m.EndRange endm let _,_,_,env = TcExceptionDeclarations.TcExnSignature cenv env parent emptyUnscopedTyparEnv (edef,scopem) @@ -15640,14 +15657,33 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) e : Eventually let env = List.foldBack (AddLocalVal cenv.tcSink scopem) idvs env return env - | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im),isRec,mdefs,m) -> - let id = ComputeModuleName longPath - let vis,_ = ComputeAccessAndCompPath env None im vis parent - let! (mspec,_) = TcModuleOrNamespaceSignature cenv env (id,isRec,true,mdefs,xml,attribs,vis,m) - let scopem = unionRanges m endm - PublishModuleDefn cenv env mspec; - let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec - return env + | SynModuleSigDecl.NestedModule(ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im) as compInfo,isRec,mdefs,m) -> + if isRec then + // Treat 'module rec M = ...' as a single mutully recursive definition group 'module M = ...' + let modDecl = SynModuleSigDecl.NestedModule(compInfo,false,mdefs,m) + return! TcSignatureElementsMutRec cenv parent endm env [modDecl] + else + let id = ComputeModuleName longPath + let vis,_ = ComputeAccessAndCompPath env None im vis parent + let attribs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs + CheckNamespaceModuleOrTypeName cenv.g id + let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g true attribs + let modName = EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText + CheckForDuplicateConcreteType env modName id.idRange + CheckForDuplicateModule env id.idText id.idRange + + // Now typecheck the signature, accumulating and then recording the submodule description. + let id = ident (modName, id.idRange) + + let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) attribs (notlazy (NewEmptyModuleOrNamespaceType modKind)) + + let! (mtyp,_) = TcModuleOrNamespaceSignatureElementsNonMutRec cenv (Parent (mkLocalModRef mspec)) env (id,modKind,mdefs,m,xml) + + mspec.Data.entity_modul_contents <- notlazy mtyp + let scopem = unionRanges m endm + PublishModuleDefn cenv env mspec + let env = AddLocalSubModuleAndReport cenv.tcSink scopem cenv.g cenv.amap m env mspec + return env | SynModuleSigDecl.ModuleAbbrev (id,p,m) -> let ad = env.eAccessRights @@ -15660,7 +15696,7 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) e : Eventually modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult) let env = - if modrefs.Length > 0 then AddModuleAbbreviation cenv.tcSink scopem id modrefs env + if modrefs.Length > 0 then AddModuleAbbreviationAndReport cenv.tcSink scopem id modrefs env else env return env @@ -15673,18 +15709,25 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) e : Eventually do for id in longId do CheckNamespaceModuleOrTypeName cenv.g id - let enclosingNamespacePath = if isModule then fst (List.frontAndBack longId) else longId - - let defs = + // Logically speaking, this changes + // module [rec] A.B.M + // ... + // to + // namespace [rec] A.B + // module M = ... + let enclosingNamespacePath, defs = if isModule then - [SynModuleSigDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,m)] + let nsp, modName = List.frontAndBack longId + let modDecl = [SynModuleSigDecl.NestedModule(ComponentInfo(attribs,[], [],[modName],xml,false,vis,m),false,defs,m)] + nsp, modDecl else - defs + longId, defs + let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml (if isModule then false else isRec) defs + let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml isRec defs let env = if isNil enclosingNamespacePath then envAtEnd @@ -15780,30 +15823,8 @@ and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDec } -and TcModuleOrNamespaceSignature cenv env (id:Ident,isRec,isModule,defs,xml,attribs,vis,m) = - eventually { - let attribs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs - CheckNamespaceModuleOrTypeName cenv.g id - let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule attribs - let modName = EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText - if isModule then CheckForDuplicateConcreteType env modName id.idRange - if isModule then CheckForDuplicateModule env id.idText id.idRange - - // Now typecheck the signature, accumulating and then recording the submodule description. - let id = ident (modName, id.idRange) - - let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) attribs (notlazy (NewEmptyModuleOrNamespaceType modKind)) - let innerParent = mkLocalModRef mspec - - let! (mtyp,envAtEnd) = TcModuleOrNamespaceSignatureElements cenv (Parent innerParent) env (id,isRec,modKind,defs,m,xml) - - mspec.Data.entity_modul_contents <- notlazy mtyp - - return (mspec, envAtEnd) - } - -and TcModuleOrNamespaceSignatureElements cenv parent env (id,isRec,modKind,defs,m:range,xml) = +and TcModuleOrNamespaceSignatureElementsNonMutRec cenv parent env (id,modKind,defs,m:range,xml) = eventually { let endm = m.EndRange // use end of range for errors @@ -15812,7 +15833,7 @@ and TcModuleOrNamespaceSignatureElements cenv parent env (id,isRec,modKind,defs, let envForModule,mtypeAcc = MakeInnerEnv env id modKind // Now typecheck the signature, using mutation to fill in the submodule description. - let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml isRec defs + let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml false defs // mtypeAcc has now accumulated the module type return !mtypeAcc, envAtEnd @@ -15864,14 +15885,14 @@ let CheckLetOrDoInNamespace binds m = error(NumberedError(FSComp.SR.tcNamespaceCannotContainValues(),binds.Head.RangeOfHeadPat)) /// The non-mutually recursive case for a declaration -let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = +let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDecl = eventually { cenv.synArgNameGenerator.Reset() let tpenv = emptyUnscopedTyparEnv //printfn "----------\nCHECKING, e = %+A\n------------------\n" e try - match ElimModuleDoBinding e with + match ElimModuleDoBinding synDecl with | SynModuleDecl.ModuleAbbrev (id,p,m) -> let env = MutRecBindingChecking.TcModuleAbbrevDecl cenv scopem env (id,p,m) @@ -15925,32 +15946,50 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = return ((fun e -> e), []), env, env | SynModuleDecl.NestedModule(compInfo, isRec, mdefs, isContinuingModule, m) -> - let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo - let id = ComputeModuleName longPath - - let modAttrs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs - let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g true modAttrs - CheckForDuplicateConcreteType env (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText) im - CheckForDuplicateModule env id.idText id.idRange - let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent + // Treat 'module rec M = ...' as a single mutully recursive definition group 'module M = ...' + if isRec then + let modDecl = SynModuleDecl.NestedModule(compInfo, false, mdefs, isContinuingModule, m) + return! TcModuleOrNamespaceElementsMutRec cenv parent m env [modDecl] + else + let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo + let id = ComputeModuleName longPath + + let modAttrs = TcAttributes cenv env AttributeTargets.ModuleDecl attribs + let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g true modAttrs + let modName = EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText + CheckForDuplicateConcreteType env modName im + CheckForDuplicateModule env id.idText id.idRange + let vis,_ = ComputeAccessAndCompPath env None id.idRange vis parent - let! (topAttrsNew, _,(mspecPriorToOuterOrExplicitSig,mexpr)),_,envAtEnd = - TcModuleOrNamespace cenv env (id,isRec,true,mdefs,xml,modAttrs,vis,m) + let endm = m.EndRange + let id = ident (modName, id.idRange) - let mspec = mspecPriorToOuterOrExplicitSig - let mdef = TMDefRec(false,[],[ModuleOrNamespaceBinding.Module(mspecPriorToOuterOrExplicitSig,mexpr)],m) - PublishModuleDefn cenv env mspec - let env = AddLocalSubModuleAndReport cenv.tcSink cenv.g cenv.amap m scopem env mspec + CheckNamespaceModuleOrTypeName cenv.g id + + let envForModule, mtypeAcc = MakeInnerEnv env id modKind + + // Create the new module specification to hold the accumulated results of the type of the module + // Also record this in the environment as the accumulator + let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) + + // Now typecheck. + let! mexpr, topAttrsNew, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModRef mspec)) endm envForModule xml false mdefs + + // Get the inferred type of the decls and record it in the mspec. + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc + let modDefn = TMDefRec(false,[],[ModuleOrNamespaceBinding.Module(mspec,mexpr)],m) + PublishModuleDefn cenv env mspec + let env = AddLocalSubModuleAndReport cenv.tcSink scopem cenv.g cenv.amap m env mspec - // isContinuingModule is true for all of the following - // - the implicit module of a script - // - the major 'module' declaration for a file stating with 'module X.Y' - // - an interactive entry for F# Interactive - // In this case the envAtEnd is the environment at the end of this module - let envAtEnd = (if isContinuingModule then envAtEnd else env) + // isContinuingModule is true for all of the following + // - the implicit module of a script + // - the major 'module' declaration for a file stating with 'module X.Y' + // - an interactive entry for F# Interactive + // In this case the envAtEnd is the environment at the end of this module + let envAtEnd = (if isContinuingModule then envAtEnd else env) - return ((fun e -> mdef :: e),topAttrsNew), env, envAtEnd + return ((fun modDefs -> modDefn :: modDefs),topAttrsNew), env, envAtEnd | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId,isRec,isModule,defs,xml,attribs,vis,m)) -> @@ -15961,16 +16000,24 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = do for id in longId do CheckNamespaceModuleOrTypeName cenv.g id - let enclosingNamespacePath = if isModule then fst (List.frontAndBack longId) else longId - let defs = + // Logically speaking, this changes + // module [rec] A.B.M + // ... + // to + // namespace [rec] A.B + // module M = ... + let enclosingNamespacePath, defs = if isModule then - [SynModuleDecl.NestedModule(ComponentInfo(attribs,[], [],[snd(List.frontAndBack longId)],xml,false,vis,m),isRec,defs,true,m)] + let nsp, modName = List.frontAndBack longId + let modDecl = [SynModuleDecl.NestedModule(ComponentInfo(attribs,[], [],[modName],xml,false,vis,m),false,defs,true,m)] + nsp, modDecl else - defs + longId, defs + let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! mexpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml (if isModule then false else isRec) defs + let! modExpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs let env = if isNil enclosingNamespacePath then @@ -15990,12 +16037,12 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env e = env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); modulTypeRoot] env - let mexprRoot = BuildRootModuleExpr enclosingNamespacePath envForNamespace.eCompPath mexpr + let modExprRoot = BuildRootModuleExpr enclosingNamespacePath envForNamespace.eCompPath modExpr - return ((fun e -> mexprRoot :: e),topAttrs), env, envAtEnd + return ((fun modExprs -> modExprRoot :: modExprs),topAttrs), env, envAtEnd with exn -> - errorRecovery exn e.Range + errorRecovery exn synDecl.Range return ((fun e -> e), []), env, env } @@ -16089,8 +16136,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e - //return List.rev defsSoFar,env, envAtEnd - return [(exprfWithEscapeCheck,attrs)],envAfter, envAfter + return (exprfWithEscapeCheck,attrs),envAfter, envAfter } @@ -16116,46 +16162,23 @@ and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - let! compiledDefs, env, envAtEnd = - if isRec then - TcModuleOrNamespaceElementsMutRec cenv parent endm env defs - else - TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs - - // Apply the functions for each declaration to build the overall expression-builder - let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) + if isRec then + let! (exprf, topAttrsNew), env, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + // Apply the functions for each declaration to build the overall expression-builder + let mexpr = TMDefs(exprf []) + return (mexpr, topAttrsNew, env, envAtEnd) - // Collect up the attributes that are global to the file - let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] - return (mexpr, topAttrsNew, env, envAtEnd) - } - -and TcModuleOrNamespace cenv env (id,isRec,isModule,defs,xml,modAttrs,vis,m:range) = - eventually { - let endm = m.EndRange - let modKind = EstablishTypeDefinitionCores.ComputeModuleOrNamespaceKind cenv.g isModule modAttrs - let id = ident (EstablishTypeDefinitionCores.AdjustModuleName modKind id.idText, id.idRange) + else + let! compiledDefs, env, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs - CheckNamespaceModuleOrTypeName cenv.g id + // Apply the functions for each declaration to build the overall expression-builder + let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) - let envForModule, mtypeAcc = MakeInnerEnv env id modKind + // Collect up the attributes that are global to the file + let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] + return (mexpr, topAttrsNew, env, envAtEnd) + } - // Create the new module specification to hold the accumulated results of the type of the module - // Also record this in the environment as the accumulator - let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) - - let innerParent = mkLocalModRef mspec - - // Now typecheck. - let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent innerParent) endm envForModule xml isRec defs - - // Get the inferred type of the decls. It's precisely the one we created before checking - // and mutated as we went. Record it in the mspec. - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc - - return (topAttrs,mspec,(mspec,mexpr)), env, envAtEnd - } - //-------------------------------------------------------------------------- // TypeCheckOneImplFile - Typecheck all the namespace fragments in a file. diff --git a/tests/fsharp/core/namespaces/test.fs b/tests/fsharp/core/namespaces/test.fs index d484cb78704..cbba80fe240 100644 --- a/tests/fsharp/core/namespaces/test.fs +++ b/tests/fsharp/core/namespaces/test.fs @@ -75,3 +75,48 @@ module Utils = begin System.IO.File.WriteAllText("test.ok","ok"); exit 0) end + + + +// Check recursive name resolution +namespace CheckRecursiveNameResolution1 + + module rec Test = + + module N = + let x = Test.M.C() + + module M = + type C() = + member x.P = M.C() + + +// Check recursive name resolution +namespace CheckRecursiveNameResolution2 + + module rec Test = + + open M + + module N = + let x = C() + + module M = + type C() = + member x.P = C() + + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution3 + + module Test = + + open M + + module N = + let x = C() + + module M = + type C() = + member x.P = C() + diff --git a/tests/fsharp/core/namespaces/test.fsi b/tests/fsharp/core/namespaces/test.fsi index 12388fce9f8..44cf9dd9547 100644 --- a/tests/fsharp/core/namespaces/test.fsi +++ b/tests/fsharp/core/namespaces/test.fsi @@ -24,3 +24,40 @@ module X = begin end + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution1 + + module Test = + + module N = + val x : Test.M.C + + module M = + type C + + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution2 + + module Test = + + module N = + val x : M.C + + module M = + type C + + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution3 + + module Test = + + open M + + module N = + val x : C + + module M = + type C From c2896f7113fe546d178f75a72cd7bc5e101f7060 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 1 Jun 2016 17:11:57 +0100 Subject: [PATCH 206/334] correct references to containing module --- src/fsharp/TypeChecker.fs | 75 +++++++++++++++------- tests/fsharp/core/namespaces/test.fs | 92 ++++++++++++++------------- tests/fsharp/core/namespaces/test2.fs | 13 ++++ 3 files changed, 112 insertions(+), 68 deletions(-) create mode 100644 tests/fsharp/core/namespaces/test2.fs diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 3e49b90612d..993b17d2b3e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -259,8 +259,11 @@ type TcEnv = ePath: Ident list eCompPath: CompilationPath eAccessPath: CompilationPath - eAccessRights: AccessorDomain // this field is computed from other fields, but we amortize the cost of computing it. - eInternalsVisibleCompPaths: CompilationPath list // internals under these should be accessible + /// This field is computed from other fields, but we amortize the cost of computing it. + eAccessRights: AccessorDomain + + /// Internals under these should be accessible + eInternalsVisibleCompPaths: CompilationPath list /// Mutable accumulator for the current module type eModuleOrNamespaceTypeAccumulator: ModuleOrNamespaceType ref @@ -13012,6 +13015,11 @@ module MutRecBindingChecking = env + /// Updates the types of the modules to contain the inferred contents to far, which includes values and members + let TcMutRecDefns_UpdateModuleContents defns = + defns |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + /// Compute the active environments within each nested module. let TcMutRecDefns_ComputeEnvs getTyconOpt getVals (cenv: cenv) report scopem m envInitial mutRecShape = (envInitial, mutRecShape) ||> MutRecShapes.computeEnvs @@ -13075,8 +13083,7 @@ module MutRecBindingChecking = fixupFinalAttrs()) // Updates the types of the modules to contain the inferred contents to far, which includes values and members - defnsAs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + TcMutRecDefns_UpdateModuleContents defnsAs // Updates the environments to include the values // We must open all modules from scratch again because there may be extension methods and/or AutoOpen @@ -15031,6 +15038,9 @@ module EstablishTypeDefinitionCores = MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove _ -> envAbove) + // Updates the types of the modules to contain the inferred contents to far, which includes nested modules and types + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs + // Publish tycons (envTmp, withEnvs) ||> MutRecShapes.iterTyconsWithEnv (fun envAbove (_, tyconOpt) -> @@ -15048,8 +15058,7 @@ module EstablishTypeDefinitionCores = let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs snd (fun _ -> []) cenv false scopem m // Updates the types of the modules to contain the inferred contents so far - withEnvs |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs // Phase 1B. Establish the kind of each type constructor @@ -15611,15 +15620,29 @@ module TcDeclarations = /// Bind a collection of mutually recursive declarations in a signature file - let TcMutRecSignatureDecls cenv env parent tpenv (mutRecSigs:MutRecSigsInitialData,m,scopem) = + let TcMutRecSignatureDecls cenv envInitial parent tpenv (mutRecSigs:MutRecSigsInitialData,m,scopem) = let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature - let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv env parent true tpenv (mutRecSigsAfterSplit,m,scopem) + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent true tpenv (mutRecSigsAfterSplit,m,scopem) // Updates the types of the modules to contain the inferred contents to far, which includes values and members - mutRecDefnsAfterCore |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecDefnsAfterCore - let _ = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRec mutRecDefnsAfterCore + // By now we've established the full contents of type definitions apart from their + // members and any fields determined by implicit construction. We know the kinds and + // representations of types and have established them as valid. + // + // We now reconstruct the active environments all over again - this will add the union cases and fields. + // + // Note: This environment reconstruction doesn't seem necessary. We're about to create Val's for all members, + // which does require type checking, but no more information than is already available. + let envMutRecPrelimWithReprs, withEnvs = + (envInitial, MutRecShapes.dropEnvs mutRecDefnsAfterCore) + ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs + (fun (_, tyconOpt, _, _) -> tyconOpt) + (fun _binds -> [ (* no values are available yet *) ]) + cenv true scopem m + + let _ = TcMutRecSignatureDecls_Phase2 cenv scopem envMutRecPrelimWithReprs withEnvs envMutRec //------------------------------------------------------------------------- @@ -15947,8 +15970,9 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec | SynModuleDecl.NestedModule(compInfo, isRec, mdefs, isContinuingModule, m) -> - // Treat 'module rec M = ...' as a single mutully recursive definition group 'module M = ...' + // Treat 'module rec M = ...' as a single mutully recursive definition group 'module M = ...' if isRec then + assert (not isContinuingModule) let modDecl = SynModuleDecl.NestedModule(compInfo, false, mdefs, isContinuingModule, m) return! TcModuleOrNamespaceElementsMutRec cenv parent m env [modDecl] else @@ -15974,7 +15998,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) // Now typecheck. - let! mexpr, topAttrsNew, env, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModRef mspec)) endm envForModule xml false mdefs + let! mexpr, topAttrsNew, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModRef mspec)) endm envForModule xml false mdefs // Get the inferred type of the decls and record it in the mspec. mspec.Data.entity_modul_contents <- notlazy !mtypeAcc @@ -15986,7 +16010,9 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec // - the implicit module of a script // - the major 'module' declaration for a file stating with 'module X.Y' // - an interactive entry for F# Interactive - // In this case the envAtEnd is the environment at the end of this module + // + // In this case the envAtEnd is the environment at the end of this module, which doesn't contain the module definition itself + // but does contain the results of all the 'open' declarations and so on. let envAtEnd = (if isContinuingModule then envAtEnd else env) return ((fun modDefs -> modDefn :: modDefs),topAttrsNew), env, envAtEnd @@ -16017,7 +16043,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - let! modExpr, topAttrs, _, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs + let! modExpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs let env = if isNil enclosingNamespacePath then @@ -16063,7 +16089,7 @@ and TcModuleOrNamespaceElementsNonMutRec cenv parent endm (defsSoFar, env, envAt // tail recursive return! TcModuleOrNamespaceElementsNonMutRec cenv parent endm ( (firstDef' :: defsSoFar), env', envAtEnd') otherDefs | [] -> - return List.rev defsSoFar,env, envAtEnd + return List.rev defsSoFar, envAtEnd } /// The mutually recursive case for a sequence of declarations (and nested modules) @@ -16131,10 +16157,11 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu // Check the assembly attributes let attrs, _ = TcAttributesWithPossibleTargets false cenv envAfter AttributeTargets.Top synAttrs - // Check the non-escaping condition as we build the expression on the way back up - let exprfWithEscapeCheck e = + // Check the non-escaping condition as we build the list of module expressions on the way back up + let exprfWithEscapeCheck modExprs = TcMutRecDefnsEscapeCheck mutRecDefnsChecked envInitial - TcMutRecDefsFinish cenv mutRecDefnsChecked m :: e + let modExpr = TcMutRecDefsFinish cenv mutRecDefnsChecked m + modExpr :: modExprs return (exprfWithEscapeCheck,attrs),envAfter, envAfter @@ -16163,20 +16190,20 @@ and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) if isRec then - let! (exprf, topAttrsNew), env, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + let! (exprf, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env defs // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(exprf []) - return (mexpr, topAttrsNew, env, envAtEnd) + return (mexpr, topAttrsNew, envAtEnd) else - let! compiledDefs, env, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs + let! compiledDefs, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(List.foldBack (fun (f,_) x -> f x) compiledDefs []) // Collect up the attributes that are global to the file let topAttrsNew = List.foldBack (fun (_,y) x -> y@x) compiledDefs [] - return (mexpr, topAttrsNew, env, envAtEnd) + return (mexpr, topAttrsNew, envAtEnd) } @@ -16360,7 +16387,7 @@ let TypeCheckOneImplFile let envinner, mtypeAcc = MakeInitialEnv env let defs = [ for x in implFileFrags -> SynModuleDecl.NamespaceFragment(x) ] - let! mexpr, topAttrs, env, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false defs + let! mexpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false defs let implFileTypePriorToSig = !mtypeAcc diff --git a/tests/fsharp/core/namespaces/test.fs b/tests/fsharp/core/namespaces/test.fs index cbba80fe240..200dfd68661 100644 --- a/tests/fsharp/core/namespaces/test.fs +++ b/tests/fsharp/core/namespaces/test.fs @@ -1,80 +1,80 @@ // #Conformance #Namespaces #SignatureFiles namespace Hello.Goodbye -type A = A | B | C + type A = A | B | C -module Utils = begin - let failures = ref false - let report_failure () = - stderr.WriteLine " NO"; failures := true - let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() -end + module Utils = begin + let failures = ref false + let report_failure () = + stderr.WriteLine " NO"; failures := true + let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() + end -module X = begin - let x = 1 + module X = begin + let x = 1 -end + end namespace Hello.Beatles -type Song = HeyJude | Yesterday + type Song = HeyJude | Yesterday -module X = begin - let x = 2 -end + module X = begin + let x = 2 + end namespace UseMe -open Hello.Goodbye + open Hello.Goodbye + + module Tests = begin + do Hello.Goodbye.Utils.test "test292jwe" (Hello.Goodbye.X.x + 1 = Hello.Beatles.X.x) + do Hello.Goodbye.Utils.test "test292jwe" (Hello.Beatles.HeyJude <> Hello.Beatles.Yesterday) -module Tests = begin - do Hello.Goodbye.Utils.test "test292jwe" (Hello.Goodbye.X.x + 1 = Hello.Beatles.X.x) - do Hello.Goodbye.Utils.test "test292jwe" (Hello.Beatles.HeyJude <> Hello.Beatles.Yesterday) + end -end + module MoreTests = begin + open global.Microsoft.FSharp.Core -module MoreTests = begin - open global.Microsoft.FSharp.Core + let arr1 = global.Microsoft.FSharp.Collections.Array.map (global.Microsoft.FSharp.Core.Operators.(+) 1) [| 1;2;3;4 |] - let arr1 = global.Microsoft.FSharp.Collections.Array.map (global.Microsoft.FSharp.Core.Operators.(+) 1) [| 1;2;3;4 |] + let ``global`` = 1 - let ``global`` = 1 + // THis should still resolve + let arr2 = global.Microsoft.FSharp.Collections.Array.map (global.Microsoft.FSharp.Core.Operators.(+) 1) [| 1;2;3;4 |] - // THis should still resolve - let arr2 = global.Microsoft.FSharp.Collections.Array.map (global.Microsoft.FSharp.Core.Operators.(+) 1) [| 1;2;3;4 |] + let test3 : global.Microsoft.FSharp.Core.int = 3 - let test3 : global.Microsoft.FSharp.Core.int = 3 + let test4 : global.Microsoft.FSharp.Collections.list = [3] - let test4 : global.Microsoft.FSharp.Collections.list = [3] - - let test5 x = - match x with - | global.Microsoft.FSharp.Core.None -> 1 - | global.Microsoft.FSharp.Core.Some _ -> 1 -end + let test5 x = + match x with + | global.Microsoft.FSharp.Core.None -> 1 + | global.Microsoft.FSharp.Core.Some _ -> 1 + end namespace global -type A = A | B | C + type A = A | B | C -module X = begin - let x = 1 + module X = begin + let x = 1 -end + end -module Utils = begin + module Utils = begin - let _ = - if !Hello.Goodbye.Utils.failures then (stdout.WriteLine "Test Failed"; exit 1) - else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); - exit 0) -end + let _ = + if !Hello.Goodbye.Utils.failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) + end @@ -87,6 +87,7 @@ namespace CheckRecursiveNameResolution1 let x = Test.M.C() module M = + [] type C() = member x.P = M.C() @@ -102,6 +103,7 @@ namespace CheckRecursiveNameResolution2 let x = C() module M = + [] type C() = member x.P = C() @@ -117,6 +119,8 @@ namespace rec CheckRecursiveNameResolution3 let x = C() module M = + [] type C() = member x.P = C() + diff --git a/tests/fsharp/core/namespaces/test2.fs b/tests/fsharp/core/namespaces/test2.fs new file mode 100644 index 00000000000..9836c9eb12d --- /dev/null +++ b/tests/fsharp/core/namespaces/test2.fs @@ -0,0 +1,13 @@ +// Check recursive name resolution +module rec Test2 + + open Test2.M // the name "Test2" should be in scope, and its nested modules should be accessible + + module N = + let x = C() + + module M = + [] + type C() = + member x.P = C() + From 8d31e9e2c392ecc663cb9760cff0f34b8db10a1e Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 1 Jun 2016 17:32:14 +0100 Subject: [PATCH 207/334] more tests --- tests/fsharp/core/namespaces/test.fs | 15 +++++++++++++++ tests/fsharp/core/namespaces/test.fsi | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/tests/fsharp/core/namespaces/test.fs b/tests/fsharp/core/namespaces/test.fs index 200dfd68661..7b346cf8ca8 100644 --- a/tests/fsharp/core/namespaces/test.fs +++ b/tests/fsharp/core/namespaces/test.fs @@ -124,3 +124,18 @@ namespace rec CheckRecursiveNameResolution3 member x.P = C() +namespace rec CheckRecursiveNameResolution4 + + module Test = + + open Test.M // The name Test should be in scope + + module N = + let x = C() + + module M = + [] + type C() = + member x.P = C() + + diff --git a/tests/fsharp/core/namespaces/test.fsi b/tests/fsharp/core/namespaces/test.fsi index 44cf9dd9547..8dfef78b9d0 100644 --- a/tests/fsharp/core/namespaces/test.fsi +++ b/tests/fsharp/core/namespaces/test.fsi @@ -61,3 +61,17 @@ namespace rec CheckRecursiveNameResolution3 module M = type C + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution4 + + module Test = + + open Test.M + + module N = + val x : C + + module M = + type C + From 95c18445d2bd1bb71f3b1f901fbd9c6490918a65 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 1 Jun 2016 20:26:24 +0100 Subject: [PATCH 208/334] fix test --- src/fsharp/TastOps.fs | 6 +++--- src/fsharp/TypeChecker.fs | 15 +++++++-------- tests/fsharp/core/namespaces/test.fs | 24 ++++++++---------------- tests/fsharp/core/namespaces/test2.fs | 22 +++++++++++++++------- tests/fsharp/core/namespaces/test2.fsi | 11 +++++++++++ 5 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 tests/fsharp/core/namespaces/test2.fsi diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index d955e6ee291..646561ef99a 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3447,12 +3447,12 @@ end let wrapModuleOrNamespaceType id cpath mtyp = NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (notlazy mtyp) -let wrapModuleOrNamespaceTypeInNamespace id cpath (mtyp:ModuleOrNamespaceType) = - let mspec = NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (notlazy mtyp) +let wrapModuleOrNamespaceTypeInNamespace id cpath mtyp = + let mspec = wrapModuleOrNamespaceType id cpath mtyp NewModuleOrNamespaceType Namespace [ mspec ] [] let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = - let mspec = NewModuleOrNamespace (Some cpath) taccessPublic id XmlDoc.Empty [] (notlazy (NewEmptyModuleOrNamespaceType Namespace)) + let mspec = wrapModuleOrNamespaceType id cpath (NewEmptyModuleOrNamespaceType Namespace) TMDefRec (false, [], [ModuleOrNamespaceBinding.Module(mspec, mexpr)], id.idRange) // cleanup: make this a property diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 993b17d2b3e..9e89740107e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -13015,7 +13015,7 @@ module MutRecBindingChecking = env - /// Updates the types of the modules to contain the inferred contents to far, which includes values and members + /// Updates the types of the modules to contain the contents so far let TcMutRecDefns_UpdateModuleContents defns = defns |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) @@ -13082,7 +13082,7 @@ module MutRecBindingChecking = mutRecDefns |> MutRecShapes.iterTycons (fun (MutRecDefnsPhase2InfoForTycon(_, _, _, _, _, fixupFinalAttrs)) -> fixupFinalAttrs()) - // Updates the types of the modules to contain the inferred contents to far, which includes values and members + // Updates the types of the modules to contain the contents so far, which now includes values and members TcMutRecDefns_UpdateModuleContents defnsAs // Updates the environments to include the values @@ -15038,7 +15038,7 @@ module EstablishTypeDefinitionCores = MakeInnerEnvWithAcc envAbove mspec.Id mtypeAcc mspec.ModuleOrNamespaceType.ModuleOrNamespaceKind) (fun envAbove _ -> envAbove) - // Updates the types of the modules to contain the inferred contents to far, which includes nested modules and types + // Updates the types of the modules to contain the contents so far, which now includes the nested modules and types MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs // Publish tycons @@ -15050,6 +15050,9 @@ module EstablishTypeDefinitionCores = CheckForDuplicateModule envAbove tycon.LogicalName tycon.Range PublishTypeDefn cenv envAbove tycon)) + // Updates the types of the modules to contain the contents so far + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs + // Phase1AB - Compute the active environments within each nested module. // // Add the types to the environment. This does not add the fields and union cases (because we haven't established them yet). @@ -15057,10 +15060,6 @@ module EstablishTypeDefinitionCores = // they are well-formed (e.g. free of abbreviation cycles) let envMutRecPrelim, withEnvs = (envInitial, withEntities) ||> MutRecBindingChecking.TcMutRecDefns_ComputeEnvs snd (fun _ -> []) cenv false scopem m - // Updates the types of the modules to contain the inferred contents so far - MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs - - // Phase 1B. Establish the kind of each type constructor // Here we run InferTyconKind and record partial information about the kind of the type constructor. // This means TyconObjModelKind is set, which means isSealedTy, isInterfaceTy etc. give accurate results. @@ -15624,7 +15623,7 @@ module TcDeclarations = let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent true tpenv (mutRecSigsAfterSplit,m,scopem) - // Updates the types of the modules to contain the inferred contents to far, which includes values and members + // Updates the types of the modules to contain the contents so far, which now includes values and members MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecDefnsAfterCore // By now we've established the full contents of type definitions apart from their diff --git a/tests/fsharp/core/namespaces/test.fs b/tests/fsharp/core/namespaces/test.fs index 7b346cf8ca8..88d2745e12a 100644 --- a/tests/fsharp/core/namespaces/test.fs +++ b/tests/fsharp/core/namespaces/test.fs @@ -30,11 +30,10 @@ namespace UseMe open Hello.Goodbye - module Tests = begin - do Hello.Goodbye.Utils.test "test292jwe" (Hello.Goodbye.X.x + 1 = Hello.Beatles.X.x) - do Hello.Goodbye.Utils.test "test292jwe" (Hello.Beatles.HeyJude <> Hello.Beatles.Yesterday) + module Tests = + Hello.Goodbye.Utils.test "test292jwe" (Hello.Goodbye.X.x + 1 = Hello.Beatles.X.x) + Hello.Goodbye.Utils.test "test292jwe" (Hello.Beatles.HeyJude <> Hello.Beatles.Yesterday) - end module MoreTests = begin open global.Microsoft.FSharp.Core @@ -67,15 +66,6 @@ namespace global end - module Utils = begin - - let _ = - if !Hello.Goodbye.Utils.failures then (stdout.WriteLine "Test Failed"; exit 1) - else (stdout.WriteLine "Test Passed"; - System.IO.File.WriteAllText("test.ok","ok"); - exit 0) - end - // Check recursive name resolution @@ -131,11 +121,13 @@ namespace rec CheckRecursiveNameResolution4 open Test.M // The name Test should be in scope module N = - let x = C() + let x = C(4) module M = [] - type C() = - member x.P = C() + type C(c:int) = + member x.P = C(0) + member x.V = c + do Hello.Goodbye.Utils.test "test292jwf" (Test.N.x.V = 4) diff --git a/tests/fsharp/core/namespaces/test2.fs b/tests/fsharp/core/namespaces/test2.fs index 9836c9eb12d..16f711afef9 100644 --- a/tests/fsharp/core/namespaces/test2.fs +++ b/tests/fsharp/core/namespaces/test2.fs @@ -1,13 +1,21 @@ // Check recursive name resolution module rec Test2 - open Test2.M // the name "Test2" should be in scope, and its nested modules should be accessible +open Test2.M // the name "Test2" should be in scope, and its nested modules should be accessible - module N = - let x = C() +module N = + let x = C() + +module M = + [] + type C() = + member x.P = C() + + +let _ = + if !Hello.Goodbye.Utils.failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test.ok","ok"); + exit 0) - module M = - [] - type C() = - member x.P = C() diff --git a/tests/fsharp/core/namespaces/test2.fsi b/tests/fsharp/core/namespaces/test2.fsi new file mode 100644 index 00000000000..08e4399fac5 --- /dev/null +++ b/tests/fsharp/core/namespaces/test2.fsi @@ -0,0 +1,11 @@ +// Check recursive name resolution +module rec Test2 + +open Test2.M + +module N = + val x : C + +module M = + type C + From 81b903ec31beed54c41e17ec2c77c5a1c85a823a Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 1 Jun 2016 21:41:43 +0200 Subject: [PATCH 209/334] Use IntrinsicFunctions.Dispose --- src/fsharp/FSharp.Core/control.fs | 2 +- src/fsharp/FSharp.Core/prim-types.fs | 5 ----- src/fsharp/FSharp.Core/prim-types.fsi | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/fsharp/FSharp.Core/control.fs b/src/fsharp/FSharp.Core/control.fs index cb10ea490ec..298da186887 100644 --- a/src/fsharp/FSharp.Core/control.fs +++ b/src/fsharp/FSharp.Core/control.fs @@ -909,7 +909,7 @@ namespace Microsoft.FSharp.Control /// Implement use/Dispose let usingA (r:'T :> IDisposable) (f:'T -> Async<'a>) : Async<'a> = - tryFinallyA (fun () -> if LanguagePrimitives.IsNonNull r then r.Dispose()) (callA f r) + tryFinallyA (fun () -> Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicFunctions.Dispose r) (callA f r) let ignoreA p = bindA p (fun _ -> doneA) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 65b521bccb9..747f0e9a0db 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -660,11 +660,6 @@ namespace Microsoft.FSharp.Core module LanguagePrimitives = - let inline IsNonNull (x: 'T) = - (# "ldnull cgt.un" x : bool #) - when ^T struct = true - - module (* internal *) ErrorStrings = // inline functions cannot call GetString, so we must make these bits public let AddressOpNotFirstClassString = SR.GetString(SR.addressOpNotFirstClass) diff --git a/src/fsharp/FSharp.Core/prim-types.fsi b/src/fsharp/FSharp.Core/prim-types.fsi index 76b57e57fe2..d3202b3aeee 100644 --- a/src/fsharp/FSharp.Core/prim-types.fsi +++ b/src/fsharp/FSharp.Core/prim-types.fsi @@ -766,11 +766,6 @@ namespace Microsoft.FSharp.Core /// Language primitives associated with the F# language module LanguagePrimitives = - /// Determines whether the given value is not null. - /// The value to check. - /// True when value is not null, false otherwise. - val inline IsNonNull : value:'T -> bool - /// Compare two values for equality using partial equivalence relation semantics ([nan] <> [nan]) /// The first value. /// The second value. From fe9d5bf1e75535c0296f1ce80659055778442b07 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 1 Jun 2016 15:19:02 -0700 Subject: [PATCH 210/334] Copy opt/sig data with building proto compiler --- src/FSharpSource.targets | 28 +++++++++++++++++++++------ src/fsharp/Fsc-proto/Fsc-proto.fsproj | 11 +++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 7d4a9918e17..f177a35fe24 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -743,7 +743,8 @@ ..\lkg\FSharp-$(LkgVersion)\bin\Microsoft.FSharp.Targets $(FSharpSourcesRoot)\..\lkg\bin\Debug\dnxcore50\win7-x64\publish - $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin\FSharp.Core.dll + $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin + $(FSLKGPath)\FSharp.Core.dll @@ -764,26 +765,41 @@ $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\4.1\Framework\v4.0\Microsoft.FSharp.Targets - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.4.1.0\FSharp.Core.dll + + + $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.4.1.0 + $(FSLKGPath)\FSharp.Core.dll $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\4.0\Framework\v4.0\Microsoft.FSharp.Targets - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.4.0.0\FSharp.Core.dll + + + $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.4.0.0 + $(FSLKGPath)\FSharp.Core.dll $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.1\Framework\v4.0\Microsoft.FSharp.Targets - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.1.0\FSharp.Core.dll + + + $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.1.0 + $(FSLKGPath)\FSharp.Core.dll $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll + + + $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0 + $(FSLKGPath)\FSharp.Core.dll + + + $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0 + $(FSLKGPath)\FSharp.Core.dll diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj index ad9ac498247..ba8f584f3db 100644 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ b/src/fsharp/Fsc-proto/Fsc-proto.fsproj @@ -44,4 +44,15 @@ + + + + + + + + + + + From 0abec1c56baf33bc2e067ea77b314e0ed2b4ce0f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 1 Jun 2016 17:53:47 -0700 Subject: [PATCH 211/334] Fix TargetFrameworkVersion for coreclr projects --- .../FSharp.Compiler.Server.Shared.fsproj | 2 +- src/fsharp/fsi/Fsi.fsproj | 2 +- src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj index a883a72b4a3..c1772607551 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj +++ b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj @@ -18,7 +18,7 @@ true true true - v4.6 + v4.6 diff --git a/src/fsharp/fsi/Fsi.fsproj b/src/fsharp/fsi/Fsi.fsproj index 901d38b9e9d..147cc5eb398 100644 --- a/src/fsharp/fsi/Fsi.fsproj +++ b/src/fsharp/fsi/Fsi.fsproj @@ -23,7 +23,7 @@ true $(OtherFlags) --warnon:1182 fsi.res - v4.6 + v4.6 $(OtherFlags) --targetprofile:netcore diff --git a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj index 997ec987782..e068793c28d 100644 --- a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj +++ b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj @@ -18,7 +18,7 @@ true $(OtherFlags) --warnon:1182 ..\fsi\fsi.res - v4.6 + v4.6 From f684adfd7a765cf3e198a9392949139006f70a9c Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Wed, 1 Jun 2016 22:36:56 -0500 Subject: [PATCH 212/334] Update TESTGUIDE.md Fix some typos --- TESTGUIDE.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/TESTGUIDE.md b/TESTGUIDE.md index de271db858c..c0c48b4d173 100644 --- a/TESTGUIDE.md +++ b/TESTGUIDE.md @@ -2,8 +2,8 @@ ## Prerequisites -In order to run the FSharpQA auite, you will need to install [Perl](http://www.perl.org/get.html) (ActiveState Perl 5.16.3 is known to work fine). -Perl must be included in the `%PATH%` for the below steps to work. It is also recommended that you run tests from an elevated command prompt, as there are a couple of test cases which require administrative privileges. +In order to run the FSharpQA suite, you will need to install [Perl](http://www.perl.org/get.html) (ActiveState Perl 5.16.3 is known to work fine). +Perl must be included in the `%PATH%` for the below steps to work. It is also recommended that you run tests from an elevated command prompt, as there are a couple of test cases which require administrative privileges. The Perl requirement is gradually being removed. @@ -19,7 +19,7 @@ To run tests, use variations such as the following, depending on which test suit build.cmd debug,ci build.cmd debug,all -Default is ``ci` +Default is `ci` * ``ci`` = the build and tests done by continuous integration * ``compiler`` = build the compiler @@ -33,7 +33,7 @@ Default is ``ci` The F# tests are split as follows: -* [FSharp Suite](tests\fsharp). Older suite with broad coverage of mainline compiler and runtime scenarios. +* [FSharp Suite](tests\fsharp) - Older suite with broad coverage of mainline compiler and runtime scenarios. * [FSharpQA Suite](tests\fsharpqa\source) - Broad and deep coverage of a variety of compiler, runtime, and syntax scenarios. @@ -49,15 +49,15 @@ The F# tests are split as follows: ### FSharp Suite -This is now compiled usinng [tests\fsharp\FSharp.Tests.fsproj] to a unit test DLL which acts as a driver script. +This is now compiled using [tests\fsharp\FSharp.Tests.fsproj] to a unit test DLL which acts as a driver script. -This compiles and execute the `test.fsx` file using some combination of compiler or fsi flags. +This compiles and executes the `test.fsx` file using some combination of compiler or FSI flags. If the compilation and execution encounter no errors, the test is considered to have passed. ### FSharpQA Suite These tests require use of the `RunAll.pl` framework to execute. -Test area directories in this suite will contain a number of source code files and a single `env.lst` file. The `env.lst` file defines a series of test cases, one per line. +Test area directories in this suite will contain a number of source code files and a single `env.lst` file. The `env.lst` file defines a series of test cases, one per line. Test cases will run an optional "pre command," compile some set of source files using some set of flags, optionally run the resulting binary, then optionally run a final "post command." If all of these steps complete without issue, the test is considered to have passed. @@ -71,7 +71,7 @@ using the '--x86' flag to `nunit3-console.exe` ### RunTests.cmd -The script `tests\RunTests.cmd` is used to execute the suites. It's used like this: +The script `tests\RunTests.cmd` is used to execute the suites. It's used like this: RunTests.cmd fsharp [tags to run] [tags not to run] RunTests.cmd fsharpqa [tags to run] [tags not to run] @@ -103,12 +103,11 @@ From a Powershell environment, make sure the double quotes are passed literally, `RunTests.cmd` is mostly just a simple wrapper over `tests\fsharpqa\testenv\bin\RunAll.pl`, which has capabilities not discussed here. More advanced test execution scenarios can be achieved by invoking `RunAll.pl` directly. Run `perl tests\fsharpqa\testenv\bin\RunAll.pl -?` to see a full list of flags and options. - ### Other Tips -* Run as admin, or a handful of tests will fail +* Run as Administrator, or a handful of tests will fail * Making the tests run faster - * NGen-ing the F# bits (fsc, fsi, FSharp.Core, etc) will result in tests executing much faster. Make sure you run `src\update.cmd` with the `-ngen` flag before running tests. - * The Fsharp and FsharpQA suites will run test cases in parallel by default. You can comment out the relevant line in `RunTests.cmd` (look for `PARALLEL_ARG`) to disable this. - * By default, tests from the FSharpQA suite are run using a persistent, hosted version of the compiler. This speeds up test execution, as there is no need for the `fsc.exe` process to spin up repeatedly. To disable this, uncomment the relevant line in `RunTests.cmd` (look for `HOSTED_COMPILER`). + * NGen-ing the F# bits (fsc, fsi, FSharp.Core, etc) will result in tests executing much faster. Make sure you run `src\update.cmd` with the `-ngen` flag before running tests. + * The FSharp and FSharpQA suites will run test cases in parallel by default. You can comment out the relevant line in `RunTests.cmd` (look for `PARALLEL_ARG`) to disable this. + * By default, tests from the FSharpQA suite are run using a persistent, hosted version of the compiler. This speeds up test execution, as there is no need for the `fsc.exe` process to spin up repeatedly. To disable this, uncomment the relevant line in `RunTests.cmd` (look for `HOSTED_COMPILER`). From 4d2563e3dadf1e0c34b25e3d5e74a949fc6b5fb9 Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Wed, 1 Jun 2016 23:16:06 -0500 Subject: [PATCH 213/334] Expand unit-type-expected compiler warning --- src/fsharp/FSStrings.resx | 2 +- .../LetBindings/Basic/W_DoBindingsNotUnit01.fs | 2 +- .../Expressions/BindingExpressions/Binding/in01.fs | 2 +- .../Expressions/BindingExpressions/Binding/in02.fs | 2 +- .../Expressions/BindingExpressions/Binding/in03.fs | 2 +- .../Expressions/BindingExpressions/Binding/in04.fs | 2 +- .../Expressions/BindingExpressions/Binding/in05.fs | 2 +- .../ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs | 2 +- .../QueryExpressions/E_WhereRequiresParens01.fs | 2 +- .../PatternMatching/Named/E_ActivePatternUnconstrained01.fs | 2 +- tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs | 2 +- tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs | 2 +- tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop01.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop02.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop03.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop04.fs | 2 +- tests/fsharpqa/Source/Misc/Parsing02.fs | 4 ++-- 18 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/fsharp/FSStrings.resx b/src/fsharp/FSStrings.resx index f95cf777b4a..f4c45a898f5 100644 --- a/src/fsharp/FSStrings.resx +++ b/src/fsharp/FSStrings.resx @@ -892,7 +892,7 @@ This expression is a function value, i.e. is missing arguments. Its type is {0}. - This expression should have type 'unit', but has type '{0}'. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name. + This expression has a value of type '{0}' that is implicitly ignored. Use the 'ignore' function to discard this value explicitly, e.g. 'expr |> ignore', or bind it to a name to refer to it later, e.g. 'let result = expr'. This expression should have type 'unit', but has type '{0}'. If assigning to a property use the syntax 'obj.Prop <- expr'. diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs index f527a126c76..f9ffa7970ce 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs @@ -2,7 +2,7 @@ #light // Verify warning when 'do-bindings' do not return unit. -//This expression should have type 'unit', but has type 'int' +//This expression has a value of type 'int' that is implicitly ignored let square x = x * x diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs index 1f96f9e14f8..d4d1116810e 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs @@ -5,7 +5,7 @@ // Eventually, we will deprecated them - and the specs will be updated. // //The value or constructor 'a' is not defined$ -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ module A = let a = 3 in a + 1 |> ignore;; a > 4;; diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs index d49ef5d5bff..9d1abe85d68 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ // module B = diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs index 41759f95d54..f36c08169f8 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ // module C = let a = 3 diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs index 5899d4bbbd2..a56dcd72f94 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ // module D = diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs index 183ff1a0e89..a6cf5359f82 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs @@ -5,7 +5,7 @@ // Eventually, we will deprecated them - and the specs will be updated. //The type 'int' does not match the type 'unit'$ //Type mismatch\. Expecting a. ''a -> 'b' .but given a. ''a -> unit' .The type 'int' does not match the type 'unit'$ -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ module E = let a = 3 in a + 1 |> ignore diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs b/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs index 516306e9269..dcfad64bdfb 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs @@ -2,7 +2,7 @@ #light // Verify warning if a finally block does not return 'unit' -//This expression should have type 'unit', but has type 'bool' +//This expression has a value of type 'bool' that is implicitly ignored let x : int = try diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs index d36c7227514..f69b652c4cd 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs @@ -1,7 +1,7 @@ // #Conformance #DataExpressions #Query // Where expressions require parenthesis //'where' is not used correctly\. This is a custom operation in this query or computation expression\.$ -//This expression should have type 'unit', but has type 'bool'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ let query = query { for i in [1..10] do diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs index 1f0a23ab75e..17ad18262e1 100644 --- a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs @@ -2,7 +2,7 @@ // Regression test for FSHARP1.0:5590 // This code used to compile, but fail peverification // Now, it just does not compile anymore telling the user to annotated it a bit. -//This expression should have type 'unit', but has type 'int'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'int' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ //Active pattern '\|A1\|A2\|A3\|' has a result type containing type variables that are not determined by the input\. The common cause is a when a result case is not mentioned, e\.g\. 'let \(\|A\|B\|\) \(x:int\) = A x'\. This can be fixed with a type constraint, e\.g\. 'let \(\|A\|B\|\) \(x:int\) : Choice = A x'$ let (|A1|A2|A3|) (inp:int) : Choice = printfn "hello" diff --git a/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs b/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs index cac6c4ad929..f6d624f2cc5 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3596 // Make sure that error spans correctly across multiple lines -//This expression should have type 'unit' +//This expression has a value of type 'int' that is implicitly ignored #nowarn "988" let f g x = g x diff --git a/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs b/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs index c402ba1b347..a78898e77d7 100644 --- a/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs +++ b/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:2391, FSHARP1.0:1479 -//This expression should have type 'unit', but has type 'seq.Quotations.Var.' +//This expression has a value of type 'seq.Quotations\.Var.' that is implicitly ignored #light "off" <@@ 1 @@>.GetFreeVars() diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs index 9e3adbb5d47..cefbf104a47 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 -//This expression should have type 'unit', but has type 'int'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'int' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ async { 1; return 2 } |> ignore diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs index 888b8f9e104..2e53ebcc6d0 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression should have type 'unit', but has type 'Async<'a>'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ let rec loop() = async { let x = 1 in loop() } diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs index af12902b2a6..f5ee4118eec 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression should have type 'unit', but has type 'Async<'a>'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ let rec loop() = async { loop() } diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs index e612c237631..821a452ef65 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression should have type 'unit', but has type 'Async<'a>'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ //This expression was expected to have type. 'Async<'a>' .but here has type. 'unit' let rec loop2() = async.Delay(fun () -> loop2(); ()); diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs index d12252d42c8..f433fb10b6b 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression should have type 'unit', but has type 'Async<'a>'\. Use 'ignore' to discard the result of the expression, or 'let' to bind the result to a name\.$ +//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ //This expression was expected to have type. 'Async<'a>' .but here has type. 'unit' // Note: interestingly, this looks much better if a method call is not used let delay x = async.Delay x diff --git a/tests/fsharpqa/Source/Misc/Parsing02.fs b/tests/fsharpqa/Source/Misc/Parsing02.fs index d4db9a719bc..67f9859ebef 100644 --- a/tests/fsharpqa/Source/Misc/Parsing02.fs +++ b/tests/fsharpqa/Source/Misc/Parsing02.fs @@ -1,8 +1,8 @@ // #Regression #Misc // Verify warnings associated with top level expressions getting discarded -//This expression should have type 'unit', but has type '\( \^a -> unit\) \* int' -//This expression should have type 'unit', but has type '\('a \[\] -> unit \[\]\) \* string \[\]' +//This expression has a value of type '\( \^a -> unit\) \* int' that is implicitly ignored +//This expression has a value of type '\('a \[\] -> unit \[\]\) \* string \[\]' that is implicitly ignored // Note the comma between printf "%A", this results in a tuple expr which probabaly wasn't intended. let arr = [|"Foo"; "Bar"|] From 5c913cac9db331cb098aaa8e536da00fd27a98ac Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 15:12:44 +0100 Subject: [PATCH 214/334] fix recursive references to namespace being defined --- src/fsharp/LexFilter.fs | 5 +- src/fsharp/TastOps.fs | 2 +- src/fsharp/TastOps.fsi | 2 +- src/fsharp/TypeChecker.fs | 141 ++++++++++++++++---------- tests/fsharp/core/namespaces/test.fs | 64 +++++++++--- tests/fsharp/core/namespaces/test.fsi | 31 ++++++ 6 files changed, 172 insertions(+), 73 deletions(-) diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 40683681901..e4ef817ca77 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -1316,10 +1316,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // Applied when a token other then a long identifier is seen | _, (CtxtNamespaceHead (namespaceTokenPos, prevToken) :: _) -> match prevToken, token with - | NAMESPACE, GLOBAL when namespaceTokenPos.Column < tokenStartPos.Column -> - replaceCtxt tokenTup (CtxtNamespaceHead (namespaceTokenPos, token)) - returnToken tokenLexbufState token - | (NAMESPACE | DOT | REC), (REC | IDENT _) when namespaceTokenPos.Column < tokenStartPos.Column -> + | (NAMESPACE | DOT | REC | GLOBAL), (REC | IDENT _ | GLOBAL) when namespaceTokenPos.Column < tokenStartPos.Column -> replaceCtxt tokenTup (CtxtNamespaceHead (namespaceTokenPos, token)) returnToken tokenLexbufState token | IDENT _, DOT when namespaceTokenPos.Column < tokenStartPos.Column -> diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 646561ef99a..c7068aec6bd 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3449,7 +3449,7 @@ let wrapModuleOrNamespaceType id cpath mtyp = let wrapModuleOrNamespaceTypeInNamespace id cpath mtyp = let mspec = wrapModuleOrNamespaceType id cpath mtyp - NewModuleOrNamespaceType Namespace [ mspec ] [] + NewModuleOrNamespaceType Namespace [ mspec ] [], mspec let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = let mspec = wrapModuleOrNamespaceType id cpath (NewEmptyModuleOrNamespaceType Namespace) diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index fd6c83d381b..e4719f1b86f 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -757,7 +757,7 @@ val ComputeHidingInfoAtAssemblyBoundary : ModuleOrNamespaceType -> SignatureHidi val mkRepackageRemapping : SignatureRepackageInfo -> Remap val wrapModuleOrNamespaceExprInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceExpr -> ModuleOrNamespaceExpr -val wrapModuleOrNamespaceTypeInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespaceType +val wrapModuleOrNamespaceTypeInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespaceType * ModuleOrNamespace val wrapModuleOrNamespaceType : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespace val SigTypeOfImplFile : TypedImplFile -> ModuleOrNamespaceType diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 9e89740107e..a2105426f6b 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -623,8 +623,10 @@ let LocateEnv ccu env enclosingNamespacePath = env let BuildRootModuleType enclosingNamespacePath (cpath:CompilationPath) mtyp = - (enclosingNamespacePath,(cpath, mtyp)) - ||> List.foldBack (fun id (cpath, mtyp) -> (cpath.ParentCompPath, wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp)) + (enclosingNamespacePath,(cpath, (mtyp, None))) + ||> List.foldBack (fun id (cpath, (mtyp, mspec)) -> + let a,b = wrapModuleOrNamespaceTypeInNamespace id cpath.ParentCompPath mtyp + cpath.ParentCompPath, (a, match mspec with Some _ -> mspec | None -> Some b)) |> snd let BuildRootModuleExpr enclosingNamespacePath (cpath:CompilationPath) mexpr = @@ -13015,10 +13017,19 @@ module MutRecBindingChecking = env + /// Update the contents accessible via the recursive namespace declaration, if any + let TcMutRecDefns_UpdateNSContents mutRecNSInfo = + match mutRecNSInfo with + | Some (Some (mspecNS: ModuleOrNamespace), mtypeAcc) -> + mspecNS.Data.entity_modul_contents <- notlazy !mtypeAcc + | _ -> () + /// Updates the types of the modules to contain the contents so far - let TcMutRecDefns_UpdateModuleContents defns = + let TcMutRecDefns_UpdateModuleContents mutRecNSInfo defns = defns |> MutRecShapes.iterModules (fun (MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), _) -> - mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + mspec.Data.entity_modul_contents <- notlazy !mtypeAcc) + + TcMutRecDefns_UpdateNSContents mutRecNSInfo /// Compute the active environments within each nested module. let TcMutRecDefns_ComputeEnvs getTyconOpt getVals (cenv: cenv) report scopem m envInitial mutRecShape = @@ -13070,7 +13081,7 @@ module MutRecBindingChecking = envForDecls) /// Phase 2: Check the members and 'let' definitions in a mutually recursive group of definitions. - let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRecPrelimWithReprs: TcEnv, mutRecDefns: MutRecDefnsPhase2Info) = + let TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem mutRecNSInfo (envMutRecPrelimWithReprs: TcEnv) (mutRecDefns: MutRecDefnsPhase2Info) = let g = cenv.g let denv = envMutRecPrelimWithReprs.DisplayEnv @@ -13083,7 +13094,7 @@ module MutRecBindingChecking = fixupFinalAttrs()) // Updates the types of the modules to contain the contents so far, which now includes values and members - TcMutRecDefns_UpdateModuleContents defnsAs + TcMutRecDefns_UpdateModuleContents mutRecNSInfo defnsAs // Updates the environments to include the values // We must open all modules from scratch again because there may be extension methods and/or AutoOpen @@ -13203,7 +13214,7 @@ module MutRecBindingChecking = defnsEs,envMutRec /// Check and generalize the interface implementations, members, 'let' definitions in a mutually recursive group of definitions. -let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRecDefns: MutRecDefnsPhase2Data) = +let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem mutRecNSInfo (envMutRec: TcEnv) (mutRecDefns: MutRecDefnsPhase2Data) = let interfacesFromTypeDefn envForTycon tyconMembersData = let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement(declKind) @@ -13300,7 +13311,7 @@ let TcMutRecDefns_Phase2 cenv envInitial bindsm scopem (envMutRec: TcEnv, mutRec (intfTypes, slotImplSets) ||> List.map2 (interfaceMembersFromTypeDefn tyconData) |> List.concat MutRecDefnsPhase2InfoForTycon(tyconOpt, tcref, declaredTyconTypars, declKind, obinds @ ibinds, fixupFinalAttrs)) - MutRecBindingChecking.TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem (envMutRec, binds) + MutRecBindingChecking.TcMutRecDefns_Phase2_Bindings cenv envInitial tpenv bindsm scopem mutRecNSInfo envMutRec binds with e -> errorRecovery e scopem; [], envMutRec @@ -13798,7 +13809,7 @@ module TcExceptionDeclarations = let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc let defns = [MutRecShape.Tycon(MutRecDefnsPhase2DataForTycon(Some exnc, parent, ModuleOrMemberBinding, mkLocalEntityRef exnc, None, NoSafeInitInfo, [], aug, m, NoNewSlots, (fun () -> ())))] - let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRec, defns) + let binds2,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem None envMutRec defns let binds2flat = binds2 |> MutRecShapes.collectTycons |> List.map snd |> List.concat // Augment types with references to values that implement the pre-baked semantics of the type let binds3 = AddAugmentationDeclarations.AddGenericEqualityBindings cenv envFinal exnc @@ -15003,7 +15014,7 @@ module EstablishTypeDefinitionCores = | _ -> ()) - let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent inSig tpenv (typeDefCores:MutRecShapes, m, scopem) = + let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent inSig tpenv m scopem mutRecNSInfo (typeDefCores:MutRecShapes) = // Phase1A - build Entity for type definitions, exception definitions and module definitions. // Also for abbreviations of any of these. Augmentations are skipped in this phase. @@ -15039,7 +15050,7 @@ module EstablishTypeDefinitionCores = (fun envAbove _ -> envAbove) // Updates the types of the modules to contain the contents so far, which now includes the nested modules and types - MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo withEnvs // Publish tycons (envTmp, withEnvs) ||> MutRecShapes.iterTyconsWithEnv @@ -15051,7 +15062,7 @@ module EstablishTypeDefinitionCores = PublishTypeDefn cenv envAbove tycon)) // Updates the types of the modules to contain the contents so far - MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents withEnvs + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo withEnvs // Phase1AB - Compute the active environments within each nested module. // @@ -15470,7 +15481,7 @@ module TcDeclarations = //------------------------------------------------------------------------- /// Bind a collection of mutually recursive definitions in an implementation file - let TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns: MutRecDefnsInitialData,m,scopem) = + let TcMutRecDefinitions cenv envInitial parent tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecDefnsInitialData) = // Split the definitions into "core representations" and "members". The code to process core representations // is shared between processing of signature files and implementation files. @@ -15480,7 +15491,7 @@ module TcDeclarations = let tycons, envMutRecPrelim, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo synBinds -> [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ]) - cenv envInitial parent false tpenv (mutRecDefnsAfterSplit,m,scopem) + cenv envInitial parent false tpenv m scopem mutRecNSInfo mutRecDefnsAfterSplit // Package up the phase two information for processing members. let mutRecDefnsAfterPrep = @@ -15511,7 +15522,7 @@ module TcDeclarations = cenv true scopem m // Check the members and decide on representations for types with implicit constructors. - let withBindings,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem (envMutRecPrelimWithReprs, withEnvs) + let withBindings,envFinal = TcMutRecDefns_Phase2 cenv envInitial m scopem mutRecNSInfo envMutRecPrelimWithReprs withEnvs // Generate the hash/compare/equality bindings for all tycons. // @@ -15619,12 +15630,12 @@ module TcDeclarations = /// Bind a collection of mutually recursive declarations in a signature file - let TcMutRecSignatureDecls cenv envInitial parent tpenv (mutRecSigs:MutRecSigsInitialData,m,scopem) = + let TcMutRecSignatureDecls cenv envInitial parent tpenv m scopem mutRecNSInfo (mutRecSigs:MutRecSigsInitialData) = let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature - let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent true tpenv (mutRecSigsAfterSplit,m,scopem) + let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent true tpenv m scopem mutRecNSInfo mutRecSigsAfterSplit // Updates the types of the modules to contain the contents so far, which now includes values and members - MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecDefnsAfterCore + MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo mutRecDefnsAfterCore // By now we've established the full contents of type definitions apart from their // members and any fields determined by implicit construction. We know the kinds and @@ -15660,7 +15671,7 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : E | SynModuleSigDecl.Types (typeSpecs,m) -> let scopem = unionRanges m endm let mutRecDefns = typeSpecs |> List.map MutRecShape.Tycon - let env = TcDeclarations.TcMutRecSignatureDecls cenv env parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) + let env = TcDeclarations.TcMutRecSignatureDecls cenv env parent emptyUnscopedTyparEnv m scopem None mutRecDefns return env | SynModuleSigDecl.Open (mp,m) -> @@ -15683,7 +15694,7 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : E if isRec then // Treat 'module rec M = ...' as a single mutully recursive definition group 'module M = ...' let modDecl = SynModuleSigDecl.NestedModule(compInfo,false,mdefs,m) - return! TcSignatureElementsMutRec cenv parent endm env [modDecl] + return! TcSignatureElementsMutRec cenv parent endm None env [modDecl] else let id = ComputeModuleName longPath let vis,_ = ComputeAccessAndCompPath env None im vis parent @@ -15745,18 +15756,27 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : E else longId, defs - let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath + let envNS = LocateEnv cenv.topCcu env enclosingNamespacePath + let envNS = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envNS + + // For 'namespace rec' and 'module rec' we add the thing being defined + let mtypNS = !(envNS.eModuleOrNamespaceTypeAccumulator) + let mtypRoot, mspecNSOpt = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + + // For 'namespace rec' and 'module rec' we add the thing being defined + let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m envNS mtypRoot else envNS + let nsInfo = Some (mspecNSOpt, envNS.eModuleOrNamespaceTypeAccumulator) + let mutRecNSInfo = if isRec then nsInfo else None + + let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envNS xml mutRecNSInfo defs + + MutRecBindingChecking.TcMutRecDefns_UpdateNSContents nsInfo - let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace - - let! envAtEnd = TcSignatureElements cenv ParentNone m.EndRange envForNamespace xml isRec defs let env = if isNil enclosingNamespacePath then envAtEnd else - let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envForNamespace.eCompPath !(envForNamespace.eModuleOrNamespaceTypeAccumulator) - - let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env modulTypeRoot + let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env mtypRoot // If the namespace is an interactive fragment e.g. FSI_0002, then open FSI_0002 in the subsequent environment. let env = @@ -15765,7 +15785,7 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : E | None -> env // Publish the combined module type - env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); modulTypeRoot] + env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); mtypRoot] env return env @@ -15776,24 +15796,25 @@ let rec TcSignatureElementNonMutRec cenv parent endm (env: TcEnv) synSigDecl : E } -and TcSignatureElements cenv parent endm env xml isRec defs = +and TcSignatureElements cenv parent endm env xml mutRecNSInfo defs = eventually { // Ensure the .Deref call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - if isRec then - return! TcSignatureElementsMutRec cenv parent endm env defs - else + match mutRecNSInfo with + | Some _ -> + return! TcSignatureElementsMutRec cenv parent endm mutRecNSInfo env defs + | None -> return! TcSignatureElementsNonMutRec cenv parent endm env defs } and TcSignatureElementsNonMutRec cenv parent endm env defs = eventually { - return! Eventually.fold (TcSignatureElementNonMutRec cenv parent endm) env defs + return! Eventually.fold (TcSignatureElementNonMutRec cenv parent endm ) env defs } -and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDecl list) = +and TcSignatureElementsMutRec cenv parent endm mutRecNSInfo envInitial (defs: SynModuleSigDecl list) = eventually { let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m) @@ -15841,7 +15862,7 @@ and TcSignatureElementsMutRec cenv parent endm envInitial (defs: SynModuleSigDec |> fst loop (match parent with ParentNone -> true | Parent _ -> false) defs - return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv (mutRecDefns,m,scopem) + return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv m scopem mutRecNSInfo mutRecDefns } @@ -15855,7 +15876,7 @@ and TcModuleOrNamespaceSignatureElementsNonMutRec cenv parent env (id,modKind,de let envForModule,mtypeAcc = MakeInnerEnv env id modKind // Now typecheck the signature, using mutation to fill in the submodule description. - let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml false defs + let! envAtEnd = TcSignatureElements cenv parent endm envForModule xml None defs // mtypeAcc has now accumulated the module type return !mtypeAcc, envAtEnd @@ -15927,7 +15948,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec | SynModuleDecl.Types (typeDefs,m) -> let scopem = unionRanges m scopem let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon - let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent tpenv (mutRecDefns, m, scopem) + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent tpenv m scopem None mutRecDefns // Check the non-escaping condition as we build the expression on the way back up let exprfWithEscapeCheck e = TcMutRecDefnsEscapeCheck mutRecDefnsChecked env @@ -15973,7 +15994,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec if isRec then assert (not isContinuingModule) let modDecl = SynModuleDecl.NestedModule(compInfo, false, mdefs, isContinuingModule, m) - return! TcModuleOrNamespaceElementsMutRec cenv parent m env [modDecl] + return! TcModuleOrNamespaceElementsMutRec cenv parent m env None [modDecl] else let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo let id = ComputeModuleName longPath @@ -15997,7 +16018,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec let mspec = NewModuleOrNamespace (Some env.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (notlazy (NewEmptyModuleOrNamespaceType modKind)) // Now typecheck. - let! mexpr, topAttrsNew, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModRef mspec)) endm envForModule xml false mdefs + let! mexpr, topAttrsNew, envAtEnd = TcModuleOrNamespaceElements cenv (Parent (mkLocalModRef mspec)) endm envForModule xml None mdefs // Get the inferred type of the decls and record it in the mspec. mspec.Data.entity_modul_contents <- notlazy !mtypeAcc @@ -16039,18 +16060,29 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec else longId, defs - let envForNamespace = LocateEnv cenv.topCcu env enclosingNamespacePath - let envForNamespace = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envForNamespace + let envNS = LocateEnv cenv.topCcu env enclosingNamespacePath + let envNS = ImplicitlyOpenOwnNamespace cenv.tcSink cenv.g cenv.amap m enclosingNamespacePath envNS + + let mtypNS = !(envNS.eModuleOrNamespaceTypeAccumulator) + let mtypRoot, mspecNSOpt = BuildRootModuleType enclosingNamespacePath envNS.eCompPath mtypNS + + // TODO: test 'namespace rec global' + + // For 'namespace rec' and 'module rec' we add the thing being defined + let envNS = if isRec then AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m envNS mtypRoot else envNS + let nsInfo = Some (mspecNSOpt, envNS.eModuleOrNamespaceTypeAccumulator) + let mutRecNSInfo = if isRec then nsInfo else None + + let! modExpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envNS xml mutRecNSInfo defs - let! modExpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv parent endm envForNamespace xml isRec defs + MutRecBindingChecking.TcMutRecDefns_UpdateNSContents nsInfo let env = if isNil enclosingNamespacePath then envAtEnd else - let modulTypeRoot = BuildRootModuleType enclosingNamespacePath envForNamespace.eCompPath !(envForNamespace.eModuleOrNamespaceTypeAccumulator) - let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env modulTypeRoot + let env = AddLocalRootModuleOrNamespace cenv.tcSink cenv.g cenv.amap m env mtypRoot // If the namespace is an interactive fragment e.g. FSI_0002, then open FSI_0002 in the subsequent environment let env = @@ -16059,10 +16091,10 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent scopem env synDec | None -> env // Publish the combined module type - env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); modulTypeRoot] + env.eModuleOrNamespaceTypeAccumulator := CombineCcuContentFragments m [!(env.eModuleOrNamespaceTypeAccumulator); mtypRoot] env - let modExprRoot = BuildRootModuleExpr enclosingNamespacePath envForNamespace.eCompPath modExpr + let modExprRoot = BuildRootModuleExpr enclosingNamespacePath envNS.eCompPath modExpr return ((fun modExprs -> modExprRoot :: modExprs),topAttrs), env, envAtEnd @@ -16092,7 +16124,7 @@ and TcModuleOrNamespaceElementsNonMutRec cenv parent endm (defsSoFar, env, envAt } /// The mutually recursive case for a sequence of declarations (and nested modules) -and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModuleDecl list) = +and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial mutRecNSInfo (defs: SynModuleDecl list) = eventually { let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges @@ -16151,7 +16183,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial (defs: SynModu loop (match parent with ParentNone -> true | Parent _ -> false) [] defs let tpenv = emptyUnscopedTyparEnv - let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv (mutRecDefns,m,scopem) + let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv m scopem mutRecNSInfo mutRecDefns // Check the assembly attributes let attrs, _ = TcAttributesWithPossibleTargets false cenv envAfter AttributeTargets.Top synAttrs @@ -16182,19 +16214,20 @@ and TcMutRecDefsFinish cenv defs m = TMDefRec(true,tycons,binds,m) -and TcModuleOrNamespaceElements cenv parent endm env xml isRec defs = +and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo defs = eventually { // Ensure the deref_nlpath call in UpdateAccModuleOrNamespaceType succeeds if cenv.compilingCanonicalFslibModuleType then ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc()) - if isRec then - let! (exprf, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env defs + match mutRecNSInfo with + | Some _ -> + let! (exprf, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env mutRecNSInfo defs // Apply the functions for each declaration to build the overall expression-builder let mexpr = TMDefs(exprf []) return (mexpr, topAttrsNew, envAtEnd) - else + | None -> let! compiledDefs, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent endm ([], env, env) defs // Apply the functions for each declaration to build the overall expression-builder @@ -16386,7 +16419,7 @@ let TypeCheckOneImplFile let envinner, mtypeAcc = MakeInitialEnv env let defs = [ for x in implFileFrags -> SynModuleDecl.NamespaceFragment(x) ] - let! mexpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false defs + let! mexpr, topAttrs, envAtEnd = TcModuleOrNamespaceElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty None defs let implFileTypePriorToSig = !mtypeAcc @@ -16464,7 +16497,7 @@ let TypeCheckOneSigFile (g,niceNameGen,amap,topCcu,checkForErrors,conditionalDe let envinner,mtypeAcc = MakeInitialEnv tcEnv let specs = [ for x in sigFileFrags -> SynModuleSigDecl.NamespaceFragment(x) ] - let! tcEnv = TcSignatureElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty false specs + let! tcEnv = TcSignatureElements cenv ParentNone qualNameOfFile.Range envinner PreXmlDocEmpty None specs let sigFileType = !mtypeAcc diff --git a/tests/fsharp/core/namespaces/test.fs b/tests/fsharp/core/namespaces/test.fs index 88d2745e12a..5cfea5bf1eb 100644 --- a/tests/fsharp/core/namespaces/test.fs +++ b/tests/fsharp/core/namespaces/test.fs @@ -3,27 +3,23 @@ namespace Hello.Goodbye type A = A | B | C - module Utils = begin + module Utils = let failures = ref false let report_failure () = stderr.WriteLine " NO"; failures := true let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure() - end - module X = begin + module X = let x = 1 - end - namespace Hello.Beatles type Song = HeyJude | Yesterday - module X = begin + module X = let x = 2 - end namespace UseMe @@ -35,7 +31,7 @@ namespace UseMe Hello.Goodbye.Utils.test "test292jwe" (Hello.Beatles.HeyJude <> Hello.Beatles.Yesterday) - module MoreTests = begin + module MoreTests = open global.Microsoft.FSharp.Core let arr1 = global.Microsoft.FSharp.Collections.Array.map (global.Microsoft.FSharp.Core.Operators.(+) 1) [| 1;2;3;4 |] @@ -53,19 +49,15 @@ namespace UseMe match x with | global.Microsoft.FSharp.Core.None -> 1 | global.Microsoft.FSharp.Core.Some _ -> 1 - end namespace global type A = A | B | C - module X = begin + module X = let x = 1 - end - - // Check recursive name resolution @@ -131,3 +123,49 @@ namespace rec CheckRecursiveNameResolution4 do Hello.Goodbye.Utils.test "test292jwf" (Test.N.x.V = 4) + + +namespace rec CheckRecursiveNameResolution5 + + module Test = + + open CheckRecursiveNameResolution5.Test.M // The name Test should be in scope + + module N = + let x = C(4) + + module M = + [] + type C(c:int) = + member x.P = C(0) + member x.V = c + + + do Hello.Goodbye.Utils.test "test292jwf" (Test.N.x.V = 4) + do Hello.Goodbye.Utils.test "test292jwf" (CheckRecursiveNameResolution5.Test.N.x.V = 4) + + +namespace rec global + + open Test.M // The name Test should be in scope + module Test = + + open Test.M // The name Test should be in scope + open M // The name M should be in scope + + module N = + let x = C(4) + let x2 = M.C(4) + let x3 = Test.M.C(4) + + module M = + [] + type C(c:int) = + member x.P = C(0) + member x.V = c + + + do Hello.Goodbye.Utils.test "test292jwf" (Test.N.x.V = 4) + do Hello.Goodbye.Utils.test "test292jwf" (N.x.V = 4) + + diff --git a/tests/fsharp/core/namespaces/test.fsi b/tests/fsharp/core/namespaces/test.fsi index 8dfef78b9d0..753d98ec6f0 100644 --- a/tests/fsharp/core/namespaces/test.fsi +++ b/tests/fsharp/core/namespaces/test.fsi @@ -75,3 +75,34 @@ namespace rec CheckRecursiveNameResolution4 module M = type C + +// Check recursive name resolution +namespace rec CheckRecursiveNameResolution5 + + module Test = + + open Test.M + + module N = + val x : C + + module M = + type C + +// Check recursive name resolution +namespace rec global + + open Test.M + module Test = + + open Test.M + open M + + module N = + val x : Test.M.C + val x2 : M.C + val x3 : C + + module M = + type C + From 4dabd407189f2d3a9c6a6265b03f9dacf28e4855 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 15:47:20 +0100 Subject: [PATCH 215/334] fix core portable tests --- src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 6b301d8113e..91c528d2964 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -9,6 +9,7 @@ open System.Runtime.InteropServices open NUnit.Framework open FsCheck open FsCheck.PropOperators +open FSharp.Reflection.FSharpReflectionExtensions type Record = { A: int From 6390519b25d5cc2f8f72ce2ccf5cc05617854ece Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 17:32:33 +0100 Subject: [PATCH 216/334] fix build --- src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 91c528d2964..75c109f8be2 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -303,7 +303,7 @@ let [] ``struct records order mutable field correctly with [] ``can properly construct a struct record using FSharpValue.MakeRecord, and we get the fields by FSharpValue.GetRecordFields`` () = - let structRecord = Microsoft.FSharp.Reflection.FSharpValue.MakeRecord (typeof, [|1234;999|]) + let structRecord = Microsoft.FSharp.Reflection.FSharpValue.MakeRecord (typeof, [|box 1234;box 999|]) Assert.IsTrue (structRecord.GetType().IsValueType) From 36cb0128648799d74c531d168049530288ac9cff Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 17:44:27 +0100 Subject: [PATCH 217/334] possible fix to heisen bug in test --- tests/fsharp/core/tests_core.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 583c4373df8..c64f5870f78 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -1060,11 +1060,11 @@ module ``Load-Script`` = // echo Test 12================================================= echo "Test 12=================================================" // "%FSC%" FlagCheck.fsx --nologo - do! fsc "--nologo" ["FlagCheck.fsx"] + do! fsc "-o FlagCheckScript.exe --nologo" ["FlagCheck.fsx"] // FlagCheck.exe - do! exec ("."/"FlagCheck.exe") "" + do! exec ("."/"FlagCheckScript.exe") "" // del FlagCheck.exe - del "FlagCheck.exe" + del "FlagCheckScript.exe" // echo Test 13================================================= echo "Test 13=================================================" // "%FSI%" load-FlagCheckFs.fsx From eb4d4e8f62e666dfcd669389e28c0dbf40c96945 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 19:50:30 +0100 Subject: [PATCH 218/334] fix build (2) --- .../FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 75c109f8be2..7f5125a3a08 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -2,6 +2,7 @@ module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes #nowarn "9" +#nowarn "44" // deprecation of some APIs on CoreCLR open System open System.Reflection @@ -9,8 +10,17 @@ open System.Runtime.InteropServices open NUnit.Framework open FsCheck open FsCheck.PropOperators + +#if FX_RESHAPED_REFLECTION open FSharp.Reflection.FSharpReflectionExtensions +[] +module PrimReflectionAdapters = + + type System.Type with + member this.IsValueType = this.GetTypeInfo().IsValueType +#endif + type Record = { A: int B: int From 6419c71ea370bc8b45e5d8c6c56bb329cd57d3e7 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 19:41:21 +0100 Subject: [PATCH 219/334] ILX cleanup (part 1) --- src/absil/il.fs | 18 +++------ src/absil/il.fsi | 1 - src/absil/ilprint.fs | 5 --- src/absil/ilx.fs | 39 ++++++++---------- src/absil/ilx.fsi | 11 +++-- src/fsharp/IlxGen.fs | 15 +++---- src/ilx/EraseClosures.fs | 85 ++++++++++++++------------------------- src/ilx/EraseClosures.fsi | 2 + src/ilx/EraseUnions.fs | 2 - 9 files changed, 68 insertions(+), 110 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 2df801a0c3c..e94fd0f68cb 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -1143,16 +1143,13 @@ and IlxExtensionInstr = Ext_instr of obj // -------------------------------------------------------------------- type internal_instr_extension = - { internalInstrExtIs: IlxExtensionInstr -> bool; - internalInstrExtDests: IlxExtensionInstr -> ILCodeLabel list; + { internalInstrExtDests: IlxExtensionInstr -> ILCodeLabel list; internalInstrExtFallthrough: IlxExtensionInstr -> ILCodeLabel option; - internalInstrExtIsTailcall: IlxExtensionInstr -> bool; internalInstrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> IlxExtensionInstr -> IlxExtensionInstr; } type ILInstrSetExtension<'T> = { instrExtDests: 'T -> ILCodeLabel list; instrExtFallthrough: 'T -> ILCodeLabel option; - instrExtIsTailcall: 'T -> bool; instrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> 'T -> 'T; } let instrExtensions = ref [] @@ -1163,10 +1160,8 @@ let RegisterInstructionSetExtension (ext: ILInstrSetExtension<'T>) = let test (Ext_instr _x) = true let dest (Ext_instr x) = (unbox x : 'T) instrExtensions := - { internalInstrExtIs=test; - internalInstrExtDests=(fun x -> ext.instrExtDests (dest x)); + { internalInstrExtDests=(fun x -> ext.instrExtDests (dest x)); internalInstrExtFallthrough=(fun x -> ext.instrExtFallthrough (dest x)); - internalInstrExtIsTailcall=(fun x -> ext.instrExtIsTailcall (dest x)); internalInstrExtRelabel=(fun f x -> mk (ext.instrExtRelabel f (dest x))); } :: !instrExtensions; mk,test,dest @@ -1194,7 +1189,7 @@ type ILBasicBlock = member x.Fallthrough = match x.LastInstruction with | I_br l | I_brcmp (_,_,l) | I_switch (_,l) -> Some l - | I_other e -> find_extension "instr" (fun ext -> if ext.internalInstrExtIs e then Some (ext.internalInstrExtFallthrough e) else None) !instrExtensions + | I_other e -> find_extension "instr" (fun ext -> Some (ext.internalInstrExtFallthrough e)) !instrExtensions | _ -> None @@ -2105,7 +2100,7 @@ let destinationsOfInstr i = | I_endfinally | I_endfilter | I_ret | I_throw | I_rethrow | I_call (Tailcall,_,_)| I_callvirt (Tailcall,_,_)| I_callconstraint (Tailcall,_,_,_) | I_calli (Tailcall,_,_) -> [] - | I_other e -> find_extension "instr" (fun ext -> if ext.internalInstrExtIs e then Some (ext.internalInstrExtDests e) else None) !instrExtensions + | I_other e -> find_extension "instr" (fun ext -> Some (ext.internalInstrExtDests e)) !instrExtensions | _ -> [] let destinationsOfBasicBlock (bblock:ILBasicBlock) = destinationsOfInstr bblock.LastInstruction @@ -2113,7 +2108,6 @@ let destinationsOfBasicBlock (bblock:ILBasicBlock) = destinationsOfInstr bblock. let instrIsTailcall i = match i with | I_call (Tailcall,_,_)| I_callvirt (Tailcall,_,_) | I_callconstraint (Tailcall,_,_,_) | I_calli (Tailcall,_,_) -> true - | I_other e -> find_extension "instr" (fun ext -> if ext.internalInstrExtIs e then Some (ext.internalInstrExtIsTailcall e) else None) !instrExtensions | _ -> false let instrIsBasicBlockEnd i = @@ -2121,7 +2115,7 @@ let instrIsBasicBlockEnd i = match i with | I_leave _ | I_br _ | I_brcmp _ | I_switch _ | I_endfinally | I_endfilter | I_ret | I_throw | I_rethrow -> true - | I_other e -> find_extension "instr" (fun ext -> if ext.internalInstrExtIs e then Some (nonNil (ext.internalInstrExtDests e)) else None) !instrExtensions + | I_other e -> find_extension "instr" (fun ext -> Some (nonNil (ext.internalInstrExtDests e))) !instrExtensions | _ -> false let checks = false @@ -3627,7 +3621,7 @@ type BasicBlockStartsToCodeLabelsMap(instrs,tryspecs,localspecs,lab2pc) = match i with | I_leave l -> I_leave(c.lab2cl l) | I_br l -> I_br (c.lab2cl l) - | I_other e -> I_other (find_extension "instr" (fun ext -> if ext.internalInstrExtIs e then Some (ext.internalInstrExtRelabel c.lab2cl e) else None) !instrExtensions) + | I_other e -> I_other (find_extension "instr" (fun ext -> Some (ext.internalInstrExtRelabel c.lab2cl e)) !instrExtensions) | I_brcmp (x,l1,l2) -> I_brcmp(x,c.lab2cl l1, c.lab2cl l2) | I_switch (ls,l) -> I_switch(List.map c.lab2cl ls, c.lab2cl l) | _ -> i diff --git a/src/absil/il.fsi b/src/absil/il.fsi index a913f085f77..558f3ebfa22 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -684,7 +684,6 @@ type ILInstr = type ILInstrSetExtension<'Extension> = { instrExtDests: ('Extension -> ILCodeLabel list); instrExtFallthrough: ('Extension -> ILCodeLabel option); - instrExtIsTailcall: ('Extension -> bool); instrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> 'Extension -> 'Extension; } val RegisterInstructionSetExtension: ILInstrSetExtension<'Extension> -> ('Extension -> IlxExtensionInstr) * (IlxExtensionInstr -> bool) * (IlxExtensionInstr -> 'Extension) diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 3742e230fd9..a24bc961a6a 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -805,11 +805,6 @@ let rec goutput_instr env os inst = goutput_cuspec env os ty; output_string os ","; output_parens (output_seq "," (fun os (x,y) -> output_int os x; output_string os ","; output_code_label os y)) os l - | (EI_callfunc (tl,cs)) -> - output_tailness os tl; - output_string os "callfunc "; - goutput_apps env os cs; - output_after_tailcall os tl; | _ -> output_string os "" diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index c1267ddde3b..d2feae914da 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -117,22 +117,19 @@ type IlxClosureSpec = type IlxInstr = // Discriminated unions - | EI_lddata of (* avoidHelpers: *) bool * IlxUnionSpec * int * int - | EI_isdata of (* avoidHelpers: *) bool * IlxUnionSpec * int - | EI_brisdata of (* avoidHelpers: *) bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel + | EI_lddata of avoidHelpers:bool * IlxUnionSpec * int * int + | EI_isdata of avoidHelpers:bool * IlxUnionSpec * int + | EI_brisdata of avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel | EI_castdata of bool * IlxUnionSpec * int | EI_stdata of IlxUnionSpec * int * int - | EI_datacase of (* avoidHelpers: *) bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel (* last label is fallthrough *) - | EI_lddatatag of (* avoidHelpers: *) bool * IlxUnionSpec + | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel + | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec | EI_newdata of IlxUnionSpec * int - // Closures - | EI_callfunc of ILTailcall * IlxClosureApps let destinations i = match i with | (EI_brisdata (_,_,_,l1,l2)) -> [l1; l2] - | (EI_callfunc (Tailcall,_)) -> [] | (EI_datacase (_,_,ls,l)) -> let hashSet = System.Collections.Generic.HashSet<_>(HashIdentity.Structural) [yield l @@ -147,11 +144,6 @@ let fallthrough i = | (EI_datacase (_,_,_,l)) -> Some l | _ -> None -let isTailcall i = - match i with - | (EI_callfunc (Tailcall,_)) -> true - | _ -> false - let remapIlxLabels lab2cl i = match i with | EI_brisdata (z,a,b,l1,l2) -> EI_brisdata (z,a,b,lab2cl l1,lab2cl l2) @@ -160,10 +152,9 @@ let remapIlxLabels lab2cl i = let (mkIlxExtInstr,isIlxExtInstr,destIlxExtInstr) = RegisterInstructionSetExtension - { instrExtDests=destinations; - instrExtFallthrough=fallthrough; - instrExtIsTailcall=isTailcall; - instrExtRelabel=remapIlxLabels; } + { instrExtDests=destinations + instrExtFallthrough=fallthrough + instrExtRelabel=remapIlxLabels } let mkIlxInstr i = I_other (mkIlxExtInstr i) @@ -175,14 +166,18 @@ type IlxClosureInfo = cloSource: ILSourceMarker option} and IlxUnionInfo = - { cudReprAccess: ILMemberAccess; (* is the representation public? *) - cudHelpersAccess: ILMemberAccess; (* are the representation public? *) - cudHasHelpers: IlxUnionHasHelpers; (* generate the helpers? *) - cudDebugProxies: bool; (* generate the helpers? *) + { /// is the representation public? + cudReprAccess: ILMemberAccess; + /// are the representation public? + cudHelpersAccess: ILMemberAccess; + /// generate the helpers? + cudHasHelpers: IlxUnionHasHelpers; + /// generate the helpers? + cudDebugProxies: bool; cudDebugDisplayAttributes: ILAttribute list; cudAlternatives: IlxUnionAlternative array; cudNullPermitted: bool; - (* debug info for generated code for classunions *) + /// debug info for generated code for classunions cudWhere: ILSourceMarker option; } type IlxTypeDefKind = diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index b29477a18da..38446be169e 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -91,15 +91,14 @@ type IlxClosureApps = /// ILX extensions to the instruction set. type IlxInstr = - | EI_lddata of (* avoidHelpers: *) bool * IlxUnionSpec * int * int - | EI_isdata of (* avoidHelpers: *) bool * IlxUnionSpec * int - | EI_brisdata of (* avoidHelpers: *) bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel + | EI_lddata of avoidHelpers:bool * IlxUnionSpec * int * int + | EI_isdata of avoidHelpers:bool * IlxUnionSpec * int + | EI_brisdata of avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel | EI_castdata of bool * IlxUnionSpec * int | EI_stdata of IlxUnionSpec * int * int - | EI_datacase of (* avoidHelpers: *) bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel (* last label is fallthrough *) - | EI_lddatatag of (* avoidHelpers: *) bool * IlxUnionSpec + | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel + | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec | EI_newdata of IlxUnionSpec * int - | EI_callfunc of ILTailcall * IlxClosureApps val mkIlxExtInstr: (IlxInstr -> IlxExtensionInstr) val isIlxExtInstr: (IlxExtensionInstr -> bool) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 5192b1e4600..9b6c6e6dfec 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -350,6 +350,8 @@ type TypeReprEnv(reprs : Map, count: int) = member tyenv.Add tps = (tyenv,tps) ||> List.fold (fun tyenv tp -> tyenv.AddOne tp) + member tyenv.Count = count + static member Empty = TypeReprEnv(count = 0, reprs = Map.empty) @@ -2616,10 +2618,9 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = let isTailCall = CanTailcall(false,None,eenv.withinSEH,hasByrefArg,false,false,false,false,sequel) CountCallFuncInstructions(); - // Generate an ILX callfunc instruction - // REVIEW: ILX-to-IL generation of callfunc is too complex. It would probably be better - // if we just got rid of callfunc and generated the IL code directly in ilxgen. - CG.EmitInstr cgbuf (pop (1+args.Length)) (Push [ilActualRetTy]) (mkIlxInstr (EI_callfunc(isTailCall,ilxClosureApps))); + // Generate the code code an ILX callfunc operation + let instrs = EraseClosures.instrsForCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps + CG.EmitInstrs cgbuf (pop (1+args.Length)) (Push [ilActualRetTy]) instrs; // Done compiling indirect call... GenSequel cenv eenv.cloc cgbuf sequel @@ -6264,15 +6265,15 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = mkMethodBody (true,emptyILLocals,2, nonBranchingInstrsToCode - [ // load the hardwired format string + ([ // load the hardwired format string I_ldstr "%+0.8A"; // make the printf format object mkNormalNewobj newFormatMethSpec; // call sprintf mkNormalCall sprintfMethSpec; // call the function returned by sprintf - mkLdarg0; - mkIlxInstr (EI_callfunc(Normalcall,Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String))) ], + mkLdarg0 ] @ + EraseClosures.instrsForCallFunc cenv.g.ilxPubCloEnv (fun _ -> 0us) eenv.tyenv.Count Normalcall (Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String))), None)) yield ilMethodDef |> AddSpecialNameFlag |> AddNonUserCompilerGeneratedAttribs cenv.g | None,_ -> diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index 19505c55fff..b1cb472c95e 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -173,11 +173,9 @@ let mkMethSpecForMultiApp cenv (argtys': ILType list,rty) = formalRetTy, inst.Tail.Tail)) -let mkCallBlockForMultiValueApp cenv doTailCall (args',rty') inplab outlab = +let mkCallBlockForMultiValueApp cenv doTailCall (args',rty') = let callvirt,mr = mkMethSpecForMultiApp cenv (args',rty') - let instrs = [ ( if callvirt then I_callvirt (doTailCall,mr, None) else I_call (doTailCall,mr, None) ) ] - if doTailCall = Tailcall then mkNonBranchingInstrs inplab instrs - else mkNonBranchingInstrsThenBr inplab instrs outlab + [ ( if callvirt then I_callvirt (doTailCall,mr, None) else I_call (doTailCall,mr, None) ) ] let mkMethSpecForClosureCall cenv (clospec: IlxClosureSpec) = let tyargsl,argtys,rstruct = stripSupportedAbstraction clospec.FormalLambdas @@ -196,19 +194,12 @@ let mkMethSpecForClosureCall cenv (clospec: IlxClosureSpec) = let mkLdFreeVar (clospec: IlxClosureSpec) (fv: IlxClosureFreeVar) = [ mkLdarg0; mkNormalLdfld (mkILFieldSpecInTy (clospec.ILType,fv.fvName,fv.fvType) ) ] -let rec convInstr cenv (tmps: ILLocalsAllocator, thisGenParams: ILGenericParameterDefs) inplab outlab instr = - match instr with - | I_other e when isIlxExtInstr e -> - match destIlxExtInstr e with - | i when (match i with EI_callfunc _ -> true | _ -> false) -> +let instrsForCallFunc cenv allocLocal numThisGenParams tl apps = + // "callfunc" and "callclo" instructions become a series of indirect // calls or a single direct call. - let varCount = thisGenParams.Length - let tl,apps = - match i with - | EI_callfunc (tl,apps) -> tl,apps - | _ -> failwith "Unexpected call instruction" + let varCount = numThisGenParams // Unwind the stack until the arguments given in the apps have // all been popped off. The apps given to this function is @@ -226,7 +217,7 @@ let rec convInstr cenv (tmps: ILLocalsAllocator, thisGenParams: ILGenericParamet | Apps_app (arg,rest) -> let storers, loaders = unwind rest let argStorers,argLoaders = - let locn = tmps.AllocLocal (mkILLocal arg None) + let locn = allocLocal arg [mkStloc locn], [mkLdloc locn] argStorers :: storers, argLoaders :: loaders | Apps_done _ -> @@ -239,7 +230,7 @@ let rec convInstr cenv (tmps: ILLocalsAllocator, thisGenParams: ILGenericParamet else stripUpTo n (function (_x::_y) -> true | _ -> false) (function (x::y) -> (x,y) | _ -> failwith "no!") loaders - let rec buildApp fst loaders apps inplab outlab = + let rec buildApp fst loaders apps = // Strip off one valid indirect call. [fst] indicates if this is the // first indirect call we're making. The code below makes use of the // fact that term and type applications are never currently mixed for @@ -258,21 +249,15 @@ let rec convInstr cenv (tmps: ILLocalsAllocator, thisGenParams: ILGenericParamet let doTailCall = andTailness tl false let instrs1 = precall @ - [ I_callvirt (doTailCall, - - (mkILInstanceMethSpecInTy (cenv.mkILTyFuncTy,"Specialize",[],cenv.ilg.typ_Object, instTyargs)), None) ] + [ I_callvirt (doTailCall, (mkILInstanceMethSpecInTy (cenv.mkILTyFuncTy,"Specialize",[],cenv.ilg.typ_Object, instTyargs)), None) ] let instrs1 = // TyFunc are represented as Specialize<_> methods returning an object. // For value types, recover result via unbox and load. // For reference types, recover via cast. let rtnTy = mkTyOfApps cenv rest' instrs1 @ [ I_unbox_any rtnTy] - if doTailCall = Tailcall then mkNonBranchingInstrs inplab instrs1 - else - let endOfCallBlock = generateCodeLabel () - let block1 = mkNonBranchingInstrsThenBr inplab instrs1 endOfCallBlock - let block2 = buildApp false loaders' rest' endOfCallBlock outlab - mkGroupBlock ([endOfCallBlock],[ block1; block2 ]) + if doTailCall = Tailcall then instrs1 + else instrs1 @ buildApp false loaders' rest' // Term applications | [],args,rest when nonNil args -> @@ -281,29 +266,20 @@ let rec convInstr cenv (tmps: ILLocalsAllocator, thisGenParams: ILGenericParamet let rty = mkTyOfApps cenv rest let doTailCall = andTailness tl isLast - let startOfCallBlock = generateCodeLabel () - let preCallBlock = mkNonBranchingInstrsThenBr inplab precall startOfCallBlock + let preCallBlock = precall if doTailCall = Tailcall then - let callBlock = mkCallBlockForMultiValueApp cenv doTailCall (args,rty) startOfCallBlock outlab - mkGroupBlock ([startOfCallBlock],[ preCallBlock; callBlock ]) + let callBlock = mkCallBlockForMultiValueApp cenv doTailCall (args,rty) + preCallBlock @ callBlock else - let endOfCallBlock = generateCodeLabel () - let callBlock = mkCallBlockForMultiValueApp cenv doTailCall (args,rty) startOfCallBlock endOfCallBlock - let restBlock = buildApp false loaders' rest endOfCallBlock outlab - mkGroupBlock ([startOfCallBlock; endOfCallBlock],[ preCallBlock; callBlock; restBlock ]) - - | [],[],Apps_done _rty -> - // "void" return values are allowed in function types - // but are translated to empty value classes. These - // values need to be popped. - mkNonBranchingInstrsThen inplab ([]) (if tl = Tailcall then I_ret else I_br outlab) + let callBlock = mkCallBlockForMultiValueApp cenv doTailCall (args,rty) + let restBlock = buildApp false loaders' rest + preCallBlock @ callBlock @ restBlock + + | [],[],Apps_done _rty -> [ ] | _ -> failwith "*** Error: internal error: unknown indirect calling convention returned by stripSupportedIndirectCall" - InstrMorph (buildApp true [] apps inplab outlab) - | _ -> InstrMorph [instr] - - | _ -> InstrMorph [instr] + buildApp true [] apps // Fix up I_ret instruction. Generalise to selected instr. let convReturnInstr ty _inplab _outlab instr = @@ -311,7 +287,7 @@ let convReturnInstr ty _inplab _outlab instr = | I_ret -> InstrMorph [I_box ty;I_ret] | _ -> InstrMorph [instr] -let convILMethodBody cenv (thisGenParams,thisClo,boxReturnTy) il = +let convILMethodBody (thisClo,boxReturnTy) il = let tmps = ILLocalsAllocator il.Locals.Length let locals = il.Locals // Add a local to keep the result value of a thunk while storing it @@ -321,7 +297,7 @@ let convILMethodBody cenv (thisGenParams,thisClo,boxReturnTy) il = match thisClo with | Some _ -> il.MaxStack+2 (* for calls *) | None -> il.MaxStack - let code' = morphExpandILInstrsInILCode (convInstr cenv (tmps,thisGenParams)) il.Code + let code' = il.Code let code' = match boxReturnTy with | None -> code' | Some ty -> (* box before returning? e.g. in the case of a TyFunc returning a struct, which compiles to a Specialise<_> method returning an object *) @@ -331,12 +307,12 @@ let convILMethodBody cenv (thisGenParams,thisClo,boxReturnTy) il = Code= code' ; Locals = ILList.ofList (ILList.toList locals @ tmps.Close()) } -let convMethodBody cenv (thisGenParams,thisClo) = function - | MethodBody.IL il -> MethodBody.IL (convILMethodBody cenv (thisGenParams,thisClo,None) il) +let convMethodBody thisClo = function + | MethodBody.IL il -> MethodBody.IL (convILMethodBody (thisClo,None) il) | x -> x -let convMethodDef cenv (thisGenParams,thisClo) (md: ILMethodDef) = - let b' = convMethodBody cenv ((thisGenParams @ md.GenericParams) ,thisClo) (md.mdBody.Contents) +let convMethodDef thisClo (md: ILMethodDef) = + let b' = convMethodBody thisClo (md.mdBody.Contents) {md with mdBody=mkMethBodyAux b'} // -------------------------------------------------------------------- @@ -495,8 +471,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = addedGenParams, (* method is generic over added ILGenericParameterDefs *) [], mkILReturn(cenv.ilg.typ_Object), - MethodBody.IL (convILMethodBody cenv (td.GenericParams@addedGenParams,Some nowCloSpec,boxReturnTy) - (Lazy.force clo.cloCode))) + MethodBody.IL (convILMethodBody (Some nowCloSpec,boxReturnTy) (Lazy.force clo.cloCode))) let ctorMethodDef = mkILStorageCtor (tagClo, @@ -592,7 +567,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = ("Invoke",ILMemberAccess.Public, nowParams, mkILReturn nowReturnTy, - MethodBody.IL (convILMethodBody cenv (td.GenericParams,Some nowCloSpec,None) (Lazy.force clo.cloCode))) + MethodBody.IL (convILMethodBody (Some nowCloSpec,None) (Lazy.force clo.cloCode))) let ctorMethodDef = mkILStorageCtor (tagClo, @@ -629,7 +604,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = let cloCode' = match td.Extends with | None -> (mkILNonGenericEmptyCtor tagClo cenv.ilg.typ_Object).MethodBody - | Some _ -> convILMethodBody cenv (td.GenericParams,Some nowCloSpec,None) (Lazy.force clo.cloCode) + | Some _ -> convILMethodBody (Some nowCloSpec,None) (Lazy.force clo.cloCode) let ctorMethodDef = let flds = (mkILCloFldSpecs cenv nowFields) @@ -654,7 +629,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = Extends= (match td.Extends with None -> Some cenv.ilg.typ_Object | Some x -> Some(x)); Name = td.Name; GenericParams= td.GenericParams; - Methods= mkILMethods (ctorMethodDef :: List.map (convMethodDef cenv ( td.GenericParams,Some nowCloSpec)) td.Methods.AsList); + Methods= mkILMethods (ctorMethodDef :: List.map (convMethodDef (Some nowCloSpec)) td.Methods.AsList); Fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList); tdKind = ILTypeDefKind.Class; } [cloTypeDef],[] @@ -677,7 +652,7 @@ let rec convTypeDef cenv mdefGen encl td = | _ -> [ {td with NestedTypes = convTypeDefs cenv mdefGen (encl@[td.Name]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef cenv (td.GenericParams,None)) td.Methods; } ] + Methods=morphILMethodDefs (convMethodDef None) td.Methods; } ] and convTypeDefs cenv mdefGen encl tdefs = morphExpandILTypeDefs (convTypeDef cenv mdefGen encl) tdefs diff --git a/src/ilx/EraseClosures.fsi b/src/ilx/EraseClosures.fsi index 9c268e84534..3a70b2230e7 100644 --- a/src/ilx/EraseClosures.fsi +++ b/src/ilx/EraseClosures.fsi @@ -11,6 +11,8 @@ open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef type cenv +val instrsForCallFunc : cenv -> allocLocal:(ILType -> uint16) -> numThisGenParams:int -> ILTailcall -> IlxClosureApps -> ILInstr list + val mkILFuncTy : cenv -> ILType -> ILType -> ILType val mkILTyFuncTy : cenv -> ILType val new_cenv : ILGlobals -> cenv diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index bf7431e0de4..b58207ed577 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -560,8 +560,6 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = | TailOrNull -> failwith "unexpected: switches on lists should have been eliminated to brisdata tests" - | _ -> InstrMorph [instr] - | _ -> InstrMorph [instr] From 195cd3b848d6b7136bba07938066c0c343a3b4a0 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 2 Jun 2016 20:04:47 +0100 Subject: [PATCH 220/334] ILX cleanup (part 2) --- src/fsharp/IlxGen.fs | 5 +++-- src/fsharp/TcGlobals.fs | 2 +- src/ilx/EraseClosures.fs | 6 +++--- src/ilx/EraseClosures.fsi | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 9b6c6e6dfec..6c51bd08931 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -2619,7 +2619,7 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = CountCallFuncInstructions(); // Generate the code code an ILX callfunc operation - let instrs = EraseClosures.instrsForCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps + let instrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps CG.EmitInstrs cgbuf (pop (1+args.Length)) (Push [ilActualRetTy]) instrs; // Done compiling indirect call... @@ -6260,6 +6260,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // Instantiate with our own type let sprintfMethSpec = mkILMethSpec(sprintfMethSpec.MethodRef,AsObject,[],[funcTy]) // Here's the body of the method. Call printf, then invoke the function it returns + let callInstrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun _ -> 0us) eenv.tyenv.Count Normalcall (Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String)) let ilMethodDef = mkILNonGenericInstanceMethod (debugDisplayMethodName,ILMemberAccess.Assembly,[], mkILReturn cenv.g.ilg.typ_Object, mkMethodBody @@ -6273,7 +6274,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = mkNormalCall sprintfMethSpec; // call the function returned by sprintf mkLdarg0 ] @ - EraseClosures.instrsForCallFunc cenv.g.ilxPubCloEnv (fun _ -> 0us) eenv.tyenv.Count Normalcall (Apps_app(ilThisTy, Apps_done cenv.g.ilg.typ_String))), + callInstrs), None)) yield ilMethodDef |> AddSpecialNameFlag |> AddNonUserCompilerGeneratedAttribs cenv.g | None,_ -> diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index b6d07bb3938..a02124d5e42 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -993,7 +993,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa { ilg=ilg #if NO_COMPILER_BACKEND #else - ilxPubCloEnv=EraseClosures.new_cenv(ilg) + ilxPubCloEnv=EraseClosures.newIlxPubCloEnv(ilg) #endif knownIntrinsics = knownIntrinsics knownFSharpCoreModules = knownFSharpCoreModules diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index b1cb472c95e..48075286ea0 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -125,7 +125,7 @@ type cenv = tref_Func: ILTypeRef[]; mkILTyFuncTy: ILType } -let new_cenv(ilg) = +let newIlxPubCloEnv(ilg) = { ilg=ilg; tref_Func= Array.init 10 (fun i -> mkFuncTypeRef(i+1)); mkILTyFuncTy=ILType.Boxed (mkILNonGenericTySpec (mkILTyRef (IlxSettings.ilxFsharpCoreLibScopeRef (), IlxSettings.ilxNamespace () ^ ".FSharpTypeFunc"))) } @@ -195,7 +195,7 @@ let mkLdFreeVar (clospec: IlxClosureSpec) (fv: IlxClosureFreeVar) = [ mkLdarg0; mkNormalLdfld (mkILFieldSpecInTy (clospec.ILType,fv.fvName,fv.fvType) ) ] -let instrsForCallFunc cenv allocLocal numThisGenParams tl apps = +let mkCallFunc cenv allocLocal numThisGenParams tl apps = // "callfunc" and "callclo" instructions become a series of indirect // calls or a single direct call. @@ -658,7 +658,7 @@ and convTypeDefs cenv mdefGen encl tdefs = morphExpandILTypeDefs (convTypeDef cenv mdefGen encl) tdefs let ConvModule ilg modul = - let cenv = new_cenv(ilg) + let cenv = newIlxPubCloEnv(ilg) let mdefGen = ref [] let newTypes = convTypeDefs cenv mdefGen [] modul.TypeDefs {modul with TypeDefs=newTypes} diff --git a/src/ilx/EraseClosures.fsi b/src/ilx/EraseClosures.fsi index 3a70b2230e7..dc4696bedf7 100644 --- a/src/ilx/EraseClosures.fsi +++ b/src/ilx/EraseClosures.fsi @@ -11,9 +11,9 @@ open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef type cenv -val instrsForCallFunc : cenv -> allocLocal:(ILType -> uint16) -> numThisGenParams:int -> ILTailcall -> IlxClosureApps -> ILInstr list +val mkCallFunc : cenv -> allocLocal:(ILType -> uint16) -> numThisGenParams:int -> ILTailcall -> IlxClosureApps -> ILInstr list val mkILFuncTy : cenv -> ILType -> ILType -> ILType val mkILTyFuncTy : cenv -> ILType -val new_cenv : ILGlobals -> cenv +val newIlxPubCloEnv : ILGlobals -> cenv val mkTyOfLambdas: cenv -> IlxClosureLambdas -> ILType From 6210660a364fb73fd5efa167bf91e51122323c80 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 2 Jun 2016 12:38:56 -0700 Subject: [PATCH 221/334] Ngen support for VisualFSharpVsix --- .../Desktop/Source.extension.vsixmanifest | 19 +++++++++++++++++++ .../Source.extension.vsixmanifest | 19 +++++++++++++++++++ .../Source.extension.vsixmanifest | 19 +++++++++++++++++++ .../Source.extension.vsixmanifest | 19 +++++++++++++++++++ 4 files changed, 76 insertions(+) diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest index 4445242d246..c6f51b034f6 100644 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest @@ -5,10 +5,29 @@ Visual F# Tools Deploy Visual F# Tools templates to Visual Studio + ..\CommonExtensions\Microsoft\FSharp + + + + + + + + + + + + + + + + + + diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest index c2ced20884b..2701f6f7c7a 100644 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest @@ -5,10 +5,29 @@ Visual F# Tools Deploy Visual F# Tools templates to Visual Studio + ..\CommonExtensions\Microsoft\FSharp + + + + + + + + + + + + + + + + + + diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest index 58b5919c245..60b92d7e94b 100644 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest @@ -5,10 +5,29 @@ Visual F# Tools Deploy Visual F# Tools templates to Visual Studio + ..\CommonExtensions\Microsoft\FSharp + + + + + + + + + + + + + + + + + + diff --git a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest index c2ced20884b..2701f6f7c7a 100644 --- a/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest +++ b/vsintegration/VisualFSharpVsix/Source.extension.vsixmanifest @@ -5,10 +5,29 @@ Visual F# Tools Deploy Visual F# Tools templates to Visual Studio + ..\CommonExtensions\Microsoft\FSharp + + + + + + + + + + + + + + + + + + From 4ce5de71a8d0bd65b1a5fdd19e822eaceace8c6f Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Thu, 2 Jun 2016 18:04:59 -0500 Subject: [PATCH 222/334] Fix test source links in TESTGUIDE.md --- TESTGUIDE.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/TESTGUIDE.md b/TESTGUIDE.md index c0c48b4d173..ec4446e54dd 100644 --- a/TESTGUIDE.md +++ b/TESTGUIDE.md @@ -33,18 +33,17 @@ Default is `ci` The F# tests are split as follows: -* [FSharp Suite](tests\fsharp) - Older suite with broad coverage of mainline compiler and runtime scenarios. +* [FSharp Suite](tests/fsharp) - Older suite with broad coverage of mainline compiler and runtime scenarios. -* [FSharpQA Suite](tests\fsharpqa\source) - Broad and deep coverage of a variety of compiler, runtime, and syntax scenarios. +* [FSharpQA Suite](tests/fsharpqa/Source) - Broad and deep coverage of a variety of compiler, runtime, and syntax scenarios. -* [FSharp.Core.Unittests](src\fsharp\FSharp.Core.Unittests) - Validation of the core F# types and the public surface area of `FSharp.Core.dll`. +* [FSharp.Core.Unittests](src/fsharp/FSharp.Core.Unittests) - Validation of the core F# types and the public surface area of `FSharp.Core.dll`. -* [FSharp.Compiler.Unittests](src\fsharp\FSharp.Compiler.Unittests) - Validation of compiler internals. +* [FSharp.Compiler.Unittests](src/fsharp/FSharp.Compiler.Unittests) - Validation of compiler internals. -* [VisualFSharp.UnitTests](vsintegration\src\unittests) - Visual F# Tools IDE Unit Test Suite +* [VisualFSharp.UnitTests](vsintegration/tests/unittests) - Visual F# Tools IDE Unit Test Suite This suite exercises a wide range of behaviors in the F# Visual Studio project system and language service. - ## More Details ### FSharp Suite From 978af308ad333992938d34aef876580319855fc2 Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Thu, 2 Jun 2016 22:23:55 -0500 Subject: [PATCH 223/334] Add failing test for issue #1126 --- tests/fsharp/core/load-script/IncludeNoWarn211.fsx | 2 ++ tests/fsharp/core/load-script/load-IncludeNoWarn211.fsx | 1 + tests/fsharp/core/load-script/out.stdout.bsl | 1 + tests/fsharp/core/load-script/script.bat | 2 ++ tests/fsharp/core/tests_core.fs | 4 ++++ 5 files changed, 10 insertions(+) create mode 100644 tests/fsharp/core/load-script/IncludeNoWarn211.fsx create mode 100644 tests/fsharp/core/load-script/load-IncludeNoWarn211.fsx diff --git a/tests/fsharp/core/load-script/IncludeNoWarn211.fsx b/tests/fsharp/core/load-script/IncludeNoWarn211.fsx new file mode 100644 index 00000000000..4848d5778e5 --- /dev/null +++ b/tests/fsharp/core/load-script/IncludeNoWarn211.fsx @@ -0,0 +1,2 @@ +#nowarn "211" +#I "totally-non-existent-folder" diff --git a/tests/fsharp/core/load-script/load-IncludeNoWarn211.fsx b/tests/fsharp/core/load-script/load-IncludeNoWarn211.fsx new file mode 100644 index 00000000000..0994c119cd5 --- /dev/null +++ b/tests/fsharp/core/load-script/load-IncludeNoWarn211.fsx @@ -0,0 +1 @@ +#load "IncludeNoWarn211.fsx" diff --git a/tests/fsharp/core/load-script/out.stdout.bsl b/tests/fsharp/core/load-script/out.stdout.bsl index 8c2c6981689..6e646189520 100644 --- a/tests/fsharp/core/load-script/out.stdout.bsl +++ b/tests/fsharp/core/load-script/out.stdout.bsl @@ -63,4 +63,5 @@ Type from referenced assembly = System.Web.Mobile.CookielessData Test 16================================================= Result = 99 Type from referenced assembly = System.Web.Mobile.CookielessData +Test 17================================================= Done ================================================== diff --git a/tests/fsharp/core/load-script/script.bat b/tests/fsharp/core/load-script/script.bat index e6932407ab9..5b52263b8a3 100644 --- a/tests/fsharp/core/load-script/script.bat +++ b/tests/fsharp/core/load-script/script.bat @@ -44,4 +44,6 @@ echo Test 16================================================= "%FSC%" ProjectDriver.fsx --nologo ProjectDriver.exe del ProjectDriver.exe +echo Test 17================================================= +"%FSI%" load-IncludeNoWarn211.fsx echo Done ================================================== diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 2075ef8f716..1de1c570d1c 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -1186,6 +1186,10 @@ module ``Load-Script`` = do! exec ("."/"ProjectDriver.exe") "" // del ProjectDriver.exe del "ProjectDriver.exe" + // echo Test 17================================================= + echo "Test 17=================================================" + // "%FSI%" load-IncludeNoWarn211.fsx + do! fsi "" ["load-IncludeNoWarn211.fsx"] // echo Done ================================================== echo "Done ==================================================" } From 0e50de156f573958371463e94bcee88b8f01ba9e Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Thu, 2 Jun 2016 22:35:16 -0500 Subject: [PATCH 224/334] Turn warnings off for #nowarn statements in EvalSourceFiles --- src/fsharp/fsi/fsi.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 8609e3e2eea..e4a836b0af8 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1072,6 +1072,8 @@ type internal FsiDynamicCompiler else fsiConsoleOutput.uprintnf " %s %s" (FSIstrings.SR.fsiLoadingFilesPrefixText()) sourceFile) fsiConsoleOutput.uprintfn "]" + closure.NoWarns |> Seq.map (fun (n,ms) -> ms |> Seq.map (fun m -> m,n)) |> Seq.concat |> Seq.iter tcConfigB.TurnWarningOff + // Play errors and warnings from closures of the surface (root) script files. closure.RootErrors |> List.iter errorSink closure.RootWarnings |> List.iter warnSink From 2329fc920945d98f3654ae7a001508cdf401f6f1 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 3 Jun 2016 15:49:51 +0300 Subject: [PATCH 225/334] implement Underscore Literals --- src/fsharp/FSharp.Core/prim-types.fs | 12 ++++++------ src/fsharp/lex.fsl | 14 ++++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 73df74a77d5..005a953a2ae 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2507,7 +2507,7 @@ namespace Microsoft.FSharp.Core let ParseUInt32 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Trim() + let s = s.Replace("_", "").Trim() let l = s.Length let mutable p = 0 let specifier = get0OXB s &p l @@ -2524,7 +2524,7 @@ namespace Microsoft.FSharp.Core let ParseInt32 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Trim() + let s = s.Replace("_", "").Trim() let l = s.Length let mutable p = 0 let sign = getSign32 s &p l @@ -2543,7 +2543,7 @@ namespace Microsoft.FSharp.Core let ParseInt64 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Trim() + let s = s.Replace("_", "").Trim() let l = s.Length let mutable p = 0 let sign = getSign64 s &p l @@ -2562,7 +2562,7 @@ namespace Microsoft.FSharp.Core let ParseUInt64 (s:string) : uint64 = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Trim() + let s = s.Replace("_", "").Trim() let l = s.Length let mutable p = 0 let specifier = get0OXB s &p l @@ -4144,8 +4144,8 @@ namespace Microsoft.FSharp.Core let inline ParseUInt16 (s:string) = (# "conv.ovf.u2" (ParseUInt32 s) : uint16 #) let inline ParseIntPtr (s:string) = (# "conv.ovf.i" (ParseInt64 s) : nativeint #) let inline ParseUIntPtr (s:string) = (# "conv.ovf.u" (ParseInt64 s) : unativeint #) - let inline ParseDouble (s:string) = Double.Parse(s,NumberStyles.Float, CultureInfo.InvariantCulture) - let inline ParseSingle (s:string) = Single.Parse(s,NumberStyles.Float, CultureInfo.InvariantCulture) + let inline ParseDouble (s:string) = Double.Parse(s.Replace("_", ""),NumberStyles.Float, CultureInfo.InvariantCulture) + let inline ParseSingle (s:string) = Single.Parse(s.Replace("_", ""),NumberStyles.Float, CultureInfo.InvariantCulture) [] diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 6532490338a..1d278f88fc3 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -83,6 +83,7 @@ let parseOctalUInt64 (s:string) p l = parse p 0UL let parseInt32 (s:string) = + let s = s.Replace("_", "") let l = s.Length let mutable p = 0 let sign = getSign32 s &p l @@ -175,11 +176,12 @@ let anychar = [^'\n''\r'] let anystring = anychar* let op_char = '!'|'$'|'%'|'&'|'*'|'+'|'-'|'.'|'/'|'<'|'='|'>'|'?'|'@'|'^'|'|'|'~'|':' let ignored_op_char = '.' | '$' | '?' +let seperator = '_' let xinteger = - ( '0' ('x'| 'X') hex + - | '0' ('o'| 'O') (['0'-'7']) + - | '0' ('b'| 'B') (['0'-'1']) + ) -let integer = digit+ + ( '0' ('x'| 'X') hex ((hex | seperator)* hex)? + | '0' ('o'| 'O') (['0'-'7']) (((['0'-'7']) | seperator)* (['0'-'7']))? + | '0' ('b'| 'B') (['0'-'1']) (((['0'-'1']) | seperator)* (['0'-'1']))?) +let integer = digit ((digit | seperator)* digit)? let int8 = integer 'y' let uint8 = (xinteger | integer) 'u' 'y' let int16 = integer 's' @@ -196,8 +198,8 @@ let xint8 = xinteger 'y' let xint16 = xinteger 's' let xint = xinteger let xint32 = xinteger 'l' -let floatp = digit+ '.' digit* -let floate = digit+ ('.' digit* )? ('e'| 'E') ['+' '-']? digit+ +let floatp = digit ((digit | seperator)* digit)? '.' (digit (digit | seperator)*)? +let floate = digit ((digit | seperator)* digit)? ('.' (digit (digit | seperator)*)? )? ('e'| 'E') ['+' '-']? digit (digit | seperator)* let float = floatp | floate let bignum = integer ('I' | 'N' | 'Z' | 'Q' | 'R' | 'G') let ieee64 = float From 430eec586f32bf3fe63119c09e5d4e7f3430c844 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 3 Jun 2016 16:36:50 +0300 Subject: [PATCH 226/334] positive tests for underscore literals --- .../Constants/BasicConstants.fs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs index 5ea1599afc6..397ffd31d49 100644 --- a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs +++ b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs @@ -40,4 +40,19 @@ let boolConst2 = false let unitConst = () +let creditCardNumber = 1234_5678_9012_3456L +let socialSecurityNumber = 999_99_9999L +let pi = 3.14_15F +let hexBytes = 0xFF_EC_DE_5E +let hexWords = 0xCAFE_BABE +let maxLong = 0x7fff_ffff_ffff_ffffL +let nybbles = 0b0010_0101 +let bytes = 0b11010010_01101001_10010100_10010010 +let x2 = 5_2 +let x4 = 5_______2 +let x7 = 0x5_2 +let x9 = 0_52 +let x10 = 05_2 +let x14 = 0o5_2 + exit 0 From ae68ba5cbed074d4149e381b908754398f8e3c82 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 3 Jun 2016 16:56:23 +0300 Subject: [PATCH 227/334] extract remove underscores to inline function --- src/fsharp/FSharp.Core/prim-types.fs | 15 +++++++++------ src/fsharp/lex.fsl | 5 ++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 005a953a2ae..7c35775c52a 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2504,10 +2504,13 @@ namespace Microsoft.FSharp.Core let rec parse n acc = if n < l then parse (n+1) (acc *.. 2UL +.. (match s.Chars(n) with '0' -> 0UL | '1' -> 1UL | _ -> formatError())) else acc in parse p 0UL + let inline removeUnderscores (s:string) = + s.Replace("_", "") + let ParseUInt32 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Replace("_", "").Trim() + let s = removeUnderscores (s.Trim()) let l = s.Length let mutable p = 0 let specifier = get0OXB s &p l @@ -2524,7 +2527,7 @@ namespace Microsoft.FSharp.Core let ParseInt32 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Replace("_", "").Trim() + let s = removeUnderscores (s.Trim()) let l = s.Length let mutable p = 0 let sign = getSign32 s &p l @@ -2543,7 +2546,7 @@ namespace Microsoft.FSharp.Core let ParseInt64 (s:string) = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Replace("_", "").Trim() + let s = removeUnderscores (s.Trim()) let l = s.Length let mutable p = 0 let sign = getSign64 s &p l @@ -2562,7 +2565,7 @@ namespace Microsoft.FSharp.Core let ParseUInt64 (s:string) : uint64 = if System.Object.ReferenceEquals(s,null) then raise( new System.ArgumentNullException("s") ) - let s = s.Replace("_", "").Trim() + let s = removeUnderscores (s.Trim()) let l = s.Length let mutable p = 0 let specifier = get0OXB s &p l @@ -4144,8 +4147,8 @@ namespace Microsoft.FSharp.Core let inline ParseUInt16 (s:string) = (# "conv.ovf.u2" (ParseUInt32 s) : uint16 #) let inline ParseIntPtr (s:string) = (# "conv.ovf.i" (ParseInt64 s) : nativeint #) let inline ParseUIntPtr (s:string) = (# "conv.ovf.u" (ParseInt64 s) : unativeint #) - let inline ParseDouble (s:string) = Double.Parse(s.Replace("_", ""),NumberStyles.Float, CultureInfo.InvariantCulture) - let inline ParseSingle (s:string) = Single.Parse(s.Replace("_", ""),NumberStyles.Float, CultureInfo.InvariantCulture) + let inline ParseDouble (s:string) = Double.Parse(removeUnderscores s,NumberStyles.Float, CultureInfo.InvariantCulture) + let inline ParseSingle (s:string) = Single.Parse(removeUnderscores s,NumberStyles.Float, CultureInfo.InvariantCulture) [] diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 1d278f88fc3..4d7a09f71fa 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -82,8 +82,11 @@ let parseOctalUInt64 (s:string) p l = let rec parse n acc = if n < l then parse (n+1) (acc * 8UL + (let c = s.[n] in if c >= '0' && c <= '7' then Convert.ToUInt64 c - Convert.ToUInt64 '0' else formatError())) else acc parse p 0UL +let inline removeUnderscores (s:string) = + s.Replace("_", "") + let parseInt32 (s:string) = - let s = s.Replace("_", "") + let s = removeUnderscores s let l = s.Length let mutable p = 0 let sign = getSign32 s &p l From 38571be12b9be458c87836aa8d32eb1726f5b467 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 3 Jun 2016 15:21:07 +0100 Subject: [PATCH 228/334] ILX cleanup Part 2 --- src/absil/ilprint.fs | 24 --- src/absil/ilx.fs | 8 - src/absil/ilx.fsi | 5 - src/fsharp/IlxGen.fs | 60 +++--- src/ilx/EraseUnions.fs | 454 ++++++++++++++++++++-------------------- src/ilx/EraseUnions.fsi | 5 + 6 files changed, 264 insertions(+), 292 deletions(-) diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index a24bc961a6a..ab88ff98d0e 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -763,11 +763,6 @@ let rec goutput_instr env os inst = goutput_cuspec env os ty; output_string os ","; output_int os n - | (EI_isdata (_,ty,n)) -> - output_string os "isdata "; - goutput_cuspec env os ty; - output_string os ","; - output_int os n | (EI_brisdata (_,ty,n,tg1,_)) -> output_string os "brisdata "; goutput_cuspec env os ty; @@ -777,28 +772,9 @@ let rec goutput_instr env os inst = output_string os ","; output_code_label os tg1; output_string os ")" - | (EI_lddata (_,ty,n,m)) -> - output_string os "lddata "; - goutput_cuspec env os ty; - output_string os ","; - output_int os n; - output_string os ","; - output_int os m | (EI_lddatatag (_,ty)) -> output_string os "lddatatag "; goutput_cuspec env os ty - | (EI_stdata (ty,n,m)) -> - output_string os "stdata "; - goutput_cuspec env os ty; - output_string os ","; - output_int os n; - output_string os ","; - output_int os m - | (EI_newdata (ty,n)) -> - output_string os "newdata "; - goutput_cuspec env os ty; - output_string os ","; - output_int os n | (EI_datacase (_,ty,l,_)) -> output_string os "datacase"; output_string os " "; diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index d2feae914da..35d17855b00 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -117,19 +117,13 @@ type IlxClosureSpec = type IlxInstr = // Discriminated unions - | EI_lddata of avoidHelpers:bool * IlxUnionSpec * int * int - | EI_isdata of avoidHelpers:bool * IlxUnionSpec * int - | EI_brisdata of avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel | EI_castdata of bool * IlxUnionSpec * int - | EI_stdata of IlxUnionSpec * int * int | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec - | EI_newdata of IlxUnionSpec * int let destinations i = match i with - | (EI_brisdata (_,_,_,l1,l2)) -> [l1; l2] | (EI_datacase (_,_,ls,l)) -> let hashSet = System.Collections.Generic.HashSet<_>(HashIdentity.Structural) [yield l @@ -140,13 +134,11 @@ let destinations i = let fallthrough i = match i with - | (EI_brisdata (_,_,_,_,l)) | (EI_datacase (_,_,_,l)) -> Some l | _ -> None let remapIlxLabels lab2cl i = match i with - | EI_brisdata (z,a,b,l1,l2) -> EI_brisdata (z,a,b,lab2cl l1,lab2cl l2) | EI_datacase (z,x,ls,l) -> EI_datacase (z,x,List.map (fun (y,l) -> (y,lab2cl l)) ls, lab2cl l) | _ -> i diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index 38446be169e..eaccf733fc5 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -91,14 +91,9 @@ type IlxClosureApps = /// ILX extensions to the instruction set. type IlxInstr = - | EI_lddata of avoidHelpers:bool * IlxUnionSpec * int * int - | EI_isdata of avoidHelpers:bool * IlxUnionSpec * int - | EI_brisdata of avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel | EI_castdata of bool * IlxUnionSpec * int - | EI_stdata of IlxUnionSpec * int * int | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec - | EI_newdata of IlxUnionSpec * int val mkIlxExtInstr: (IlxInstr -> IlxExtensionInstr) val isIlxExtInstr: (IlxExtensionInstr -> bool) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 6c51bd08931..60df8a3d205 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1513,7 +1513,7 @@ type sequel = | LeaveHandler of (bool (* finally? *) * int * Mark) /// Branch to the given mark | Br of Mark - | CmpThenBrOrContinue of Pops * ILInstr + | CmpThenBrOrContinue of Pops * ILInstr list /// Continue and leave the value on the IL computation stack | Continue /// The value then do something else @@ -1893,7 +1893,7 @@ and GenSequel cenv cloc cgbuf sequel = | ReturnVoid -> CG.EmitInstr cgbuf (pop 0) Push0 I_ret | CmpThenBrOrContinue(pops,bri) -> - CG.EmitInstr cgbuf pops Push0 bri + CG.EmitInstrs cgbuf pops Push0 bri | Return -> CG.EmitInstr cgbuf (pop 1) Push0 I_ret | EndLocalScope _ -> failwith "EndLocalScope unexpected" @@ -2026,7 +2026,7 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = GenExprs cenv cgbuf eenv args; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv c tyargs - CG.EmitInstr cgbuf (pop args.Length) (Push [cuspec.EnclosingType]) (mkIlxInstr (EI_newdata (cuspec,idx))); + CG.EmitInstrs cgbuf (pop args.Length) (Push [cuspec.EnclosingType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)); GenSequel cenv eenv.cloc cgbuf sequel and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = @@ -2180,7 +2180,7 @@ and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef - CG.EmitInstrs cgbuf (pop 1) (Push [fty]) [ mkIlxInstr (EI_lddata(avoidHelpers, cuspec,idx,n)) ]; + CG.EmitInstrs cgbuf (pop 1) (Push [fty]) (EraseUnions.mkLdData (avoidHelpers, cuspec, idx, n)); GenSequel cenv eenv.cloc cgbuf sequel and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = @@ -2195,7 +2195,7 @@ and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs CG.EmitInstr cgbuf (pop 1) (Push [cuspec.EnclosingType]) (mkIlxInstr (EI_castdata(false,cuspec,idx))); GenExpr cenv cgbuf eenv SPSuppress e2 Continue; - CG.EmitInstr cgbuf (pop 2) Push0 (mkIlxInstr (EI_stdata(cuspec,idx,n)) ); + CG.EmitInstrs cgbuf (pop 2) Push0 (EraseUnions.mkStData (cuspec, idx, n)); GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel and GenGetRecdFieldAddr cenv cgbuf eenv (e,f,tyargs,m) sequel = @@ -2844,7 +2844,7 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = CG.EmitSeqPoint cgbuf e2.Range; GenGetLocalVal cenv cgbuf eenvinner e2.Range v None; let cmp = match dir with FSharpForLoopUp | FSharpForLoopDown -> BI_bne_un | CSharpForLoopUp -> BI_blt - let e2Sequel = (CmpThenBrOrContinue (pop 2, I_brcmp(cmp,inner.CodeLabel,finish.CodeLabel))); + let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp,inner.CodeLabel,finish.CodeLabel) ])); if isFSharpStyle then EmitGetLocal cgbuf cenv.g.ilg.typ_int32 finishIdx @@ -2875,7 +2875,7 @@ and GenWhileLoop cenv cgbuf eenv (spWhile,e1,e2,m) sequel = | NoSequencePointAtWhileLoop -> () // SEQUENCE POINTS: Emit a sequence point to cover all of 'while e do' - GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, I_brcmp(BI_brfalse,finish.CodeLabel,inner.CodeLabel))); + GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, [ I_brcmp(BI_brfalse,finish.CodeLabel,inner.CodeLabel) ])); CG.SetMarkToHere cgbuf inner; GenExpr cenv cgbuf eenv SPAlways e2 (DiscardThen (Br startTest)); @@ -2977,11 +2977,11 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = // For these we can just generate the argument and change the test (from a brfalse to a brtrue and vice versa) | ([ AI_ceq ], [arg1; Expr.Const((Const.Bool false | Const.SByte 0y| Const.Int16 0s | Const.Int32 0 | Const.Int64 0L | Const.Byte 0uy| Const.UInt16 0us | Const.UInt32 0u | Const.UInt64 0UL),_,_) ], - CmpThenBrOrContinue(1,I_brcmp (((BI_brfalse | BI_brtrue) as bi) , label1,label2)), + CmpThenBrOrContinue(1, [I_brcmp (((BI_brfalse | BI_brtrue) as bi) , label1,label2) ]), _) -> let bi = match bi with BI_brtrue -> BI_brfalse | _ -> BI_brtrue - GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1,I_brcmp (bi, label1,label2))) + GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1, [ I_brcmp (bi, label1,label2) ])) // Query; when do we get a 'ret' in IL assembly code? | [ I_ret ], [arg1],sequel,[_ilRetTy] -> @@ -3033,28 +3033,28 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN - | [ AI_clt ], CmpThenBrOrContinue(1,I_brcmp (BI_brfalse, label1,label2)) when not (anyfpType (tyOfExpr g args.Head)) -> + | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge,label1,label2)); - | [ AI_cgt ], CmpThenBrOrContinue(1,I_brcmp (BI_brfalse, label1,label2)) when not (anyfpType (tyOfExpr g args.Head)) -> + | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble,label1, label2)); - | [ AI_clt_un ], CmpThenBrOrContinue(1,I_brcmp (BI_brfalse, label1,label2)) when not (anyfpType (tyOfExpr g args.Head)) -> + | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge_un,label1,label2)); - | [ AI_cgt_un ], CmpThenBrOrContinue(1,I_brcmp (BI_brfalse, label1,label2)) when not (anyfpType (tyOfExpr g args.Head)) -> + | [ AI_cgt_un ], CmpThenBrOrContinue(1, [I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble_un,label1, label2)); - | [ AI_ceq ], CmpThenBrOrContinue(1,I_brcmp (BI_brfalse, label1,label2)) when not (anyfpType (tyOfExpr g args.Head)) -> + | [ AI_ceq ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bne_un,label1, label2)); // THESE ARE VALID ON FP w.r.t. NaN - | [ AI_clt ], CmpThenBrOrContinue(1,I_brcmp (BI_brtrue, label1,label2)) -> + | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt,label1, label2)); - | [ AI_cgt ], CmpThenBrOrContinue(1,I_brcmp (BI_brtrue, label1,label2)) -> + | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt,label1, label2)); - | [ AI_clt_un ], CmpThenBrOrContinue(1,I_brcmp (BI_brtrue, label1,label2)) -> + | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt_un,label1, label2)); - | [ AI_cgt_un ], CmpThenBrOrContinue(1,I_brcmp (BI_brtrue, label1,label2)) -> + | [ AI_cgt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt_un,label1, label2)); - | [ AI_ceq ], CmpThenBrOrContinue(1,I_brcmp (BI_brtrue, label1,label2)) -> + | [ AI_ceq ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1,label2) ]) -> CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_beq,label1, label2)); | _ -> // Failing that, generate the real IL leaving value(s) on the stack @@ -4237,7 +4237,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT let cuspec = GenUnionSpec cenv.amap m cenv.g eenv.tyenv c.TyconRef tyargs let idx = c.Index let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib c.TyconRef - GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_bool],(mkIlxInstr (EI_isdata (avoidHelpers, cuspec, idx))))) eenv successTree failureTree targets repeatSP targetInfos sequel + GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel | _ -> let caseLabels = List.map (fun _ -> CG.GenerateDelayMark cgbuf "switch_case") cases @@ -4366,7 +4366,12 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree | TTarget(_,BoolExpr(b1),_),_ -> GenExpr cenv cgbuf eenv SPSuppress e Continue; - (match tester with Some (pops,push,i) -> CG.EmitInstr cgbuf pops push i; | _ -> ()); + match tester with + | Some (pops,pushes,i) -> + match i with + | Choice1Of2 (avoidHelpers,cuspec,idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) + | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i; + | _ -> (); if not b1 then CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_bool]) [mkLdcInt32 (0); ]; CG.EmitInstrs cgbuf (pop 1) Push0 [AI_ceq]; @@ -4381,16 +4386,17 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree (match tester with | None -> (* generate the expression, then test it for "false" *) - GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1,I_brcmp (BI_brfalse, failure.CodeLabel, success.CodeLabel))); + GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, [ I_brcmp (BI_brfalse, failure.CodeLabel, success.CodeLabel) ])); - (* Turn "EI_isdata" tests that branch into EI_brisdata tests *) - | Some (_,_,I_other i) when isIlxExtInstr i && (match destIlxExtInstr i with EI_isdata _ -> true | _ -> false) -> - let (avoidHelpers,cuspec,idx) = match destIlxExtInstr i with EI_isdata (avoidHelpers,cuspec,idx) -> (avoidHelpers,cuspec,idx) | _ -> failwith "??" - GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1,mkIlxInstr (EI_brisdata (avoidHelpers,cuspec, idx, success.CodeLabel, failure.CodeLabel)))); + (* Turn 'isdata' tests that branch into EI_brisdata tests *) + | Some (_,_,Choice1Of2 (avoidHelpers,cuspec,idx)) -> + GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, EraseUnions.mkBrIsData cenv.g.ilg (avoidHelpers,cuspec, idx, success.CodeLabel, failure.CodeLabel))); | Some (pops,pushes,i) -> GenExpr cenv cgbuf eenv SPSuppress e Continue; - CG.EmitInstr cgbuf pops pushes i; + match i with + | Choice1Of2 (avoidHelpers,cuspec,idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) + | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i; CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel, success.CodeLabel))); let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf success stackAtTargets eenv successTree targets repeatSP targetInfos sequel diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index b58207ed577..4291e6b81ce 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -25,9 +25,17 @@ let TagCons = 1 let ALT_NAME_CONS = "Cons" type DiscriminationTechnique = + /// Indicates a special representation for the F# list type where the "empty" value has a tail field of value null | TailOrNull + /// Indicates a type with either number of cases < 4, and not a single-class type with an integer tag (IntegerTag) | RuntimeTypes + /// Indicates a type with a single case, e.g. ``type X = ABC of string * int`` | SingleCase + /// Indicates a type with either cases >= 4, or a type like + // type X = A | B | C + // or type X = A | B | C of string + // where at most one case is non-nullary. These can be represented using a single + // class (no subclasses), but an integer tag is stored to discriminate between the objects. | IntegerTag // FLATTEN_SINGLE_NON_NULLARY_AND_ALWAYS_USE_TAGS looks like a useful representation @@ -152,6 +160,7 @@ let mkMakerName (cuspec: IlxUnionSpec) nm = | SpecialFSharpOptionHelpers -> nm // Leave 'Some', 'None', 'Cons', 'Empty' as is | AllHelpers | NoHelpers -> "New" + nm + let mkCasesTypeRef (cuspec: IlxUnionSpec) = cuspec.TypeRef let cuspecRepr = @@ -176,9 +185,6 @@ let cudefRepr = (fun ((_enc,_td,_cud),_nm) -> NoTypesGeneratedViaThisReprDecider)) -type cenv = - { ilg: ILGlobals } - let mkBasicBlock2 (a,b) = mkBasicBlock { Label=a; Instructions= Array.ofList b} @@ -227,25 +233,25 @@ let altOfUnionSpec (cuspec:IlxUnionSpec) cidx = let doesRuntimeTypeDiscriminateUseHelper avoidHelpers (cuspec: IlxUnionSpec) (alt: IlxUnionAlternative) = not avoidHelpers && alt.IsNullary && cuspec.HasHelpers = IlxUnionHasHelpers.AllHelpers -let mkRuntimeTypeDiscriminate cenv avoidHelpers cuspec alt altName altTy = +let mkRuntimeTypeDiscriminate ilg avoidHelpers cuspec alt altName altTy = let useHelper = doesRuntimeTypeDiscriminateUseHelper avoidHelpers cuspec alt if useHelper then let baseTy = baseTyOfUnionSpec cuspec - [ mkNormalCall (mkILNonGenericInstanceMethSpecInTy (baseTy, "get_" + mkTesterName altName, [], cenv.ilg.typ_Bool)) ] + [ mkNormalCall (mkILNonGenericInstanceMethSpecInTy (baseTy, "get_" + mkTesterName altName, [], ilg.typ_Bool)) ] else [ I_isinst altTy; AI_ldnull; AI_cgt_un ] -let mkRuntimeTypeDiscriminateThen cenv avoidHelpers cuspec alt altName altTy after = +let mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy after = let useHelper = doesRuntimeTypeDiscriminateUseHelper avoidHelpers cuspec alt match after with | I_brcmp (BI_brfalse,_,_) | I_brcmp (BI_brtrue,_,_) when not useHelper -> [ I_isinst altTy; after ] | _ -> - mkRuntimeTypeDiscriminate cenv avoidHelpers cuspec alt altName altTy @ [ after ] + mkRuntimeTypeDiscriminate ilg avoidHelpers cuspec alt altName altTy @ [ after ] -let mkGetTagFromField cenv cuspec baseTy = - [ mkNormalLdfld (refToFieldInTy baseTy (mkTagFieldId cenv.ilg cuspec)) ] +let mkGetTagFromField ilg cuspec baseTy = + [ mkNormalLdfld (refToFieldInTy baseTy (mkTagFieldId ilg cuspec)) ] let adjustFieldName hasHelpers nm = match hasHelpers, nm with @@ -253,30 +259,30 @@ let adjustFieldName hasHelpers nm = | SpecialFSharpListHelpers, "Tail" -> "TailOrNull" | _ -> nm -let mkLdData avoidHelpers cuspec cidx fidx = +let mkLdData (avoidHelpers, cuspec, cidx, fidx) = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let fieldDef = alt.FieldDef fidx if avoidHelpers then - mkNormalLdfld (mkILFieldSpecInTy(altTy,fieldDef.LowerName, fieldDef.Type)) + [ mkNormalLdfld (mkILFieldSpecInTy(altTy,fieldDef.LowerName, fieldDef.Type)) ] else - mkNormalCall (mkILNonGenericInstanceMethSpecInTy(altTy,"get_" + adjustFieldName cuspec.HasHelpers fieldDef.Name,[],fieldDef.Type)) + [ mkNormalCall (mkILNonGenericInstanceMethSpecInTy(altTy,"get_" + adjustFieldName cuspec.HasHelpers fieldDef.Name,[],fieldDef.Type)) ] let mkGetTailOrNull avoidHelpers cuspec = - mkLdData avoidHelpers cuspec 1 1 (* tail is in alternative 1, field number 1 *) + mkLdData (avoidHelpers, cuspec, 1, 1) (* tail is in alternative 1, field number 1 *) -let mkGetTagFromHelpers cenv (cuspec: IlxUnionSpec) = +let mkGetTagFromHelpers ilg (cuspec: IlxUnionSpec) = let baseTy = baseTyOfUnionSpec cuspec if cuspecRepr.OptimizingOneAlternativeToNull cuspec then - mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "Get" + tagPropertyName, [baseTy], mkTagFieldFormalType cenv.ilg cuspec)) + mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "Get" + tagPropertyName, [baseTy], mkTagFieldFormalType ilg cuspec)) else - mkNormalCall (mkILNonGenericInstanceMethSpecInTy(baseTy, "get_" + tagPropertyName, [], mkTagFieldFormalType cenv.ilg cuspec)) + mkNormalCall (mkILNonGenericInstanceMethSpecInTy(baseTy, "get_" + tagPropertyName, [], mkTagFieldFormalType ilg cuspec)) -let mkGetTag cenv (cuspec: IlxUnionSpec) = +let mkGetTag ilg (cuspec: IlxUnionSpec) = match cuspec.HasHelpers with - | AllHelpers -> [ mkGetTagFromHelpers cenv cuspec ] - | _hasHelpers -> mkGetTagFromField cenv cuspec (baseTyOfUnionSpec cuspec) + | AllHelpers -> [ mkGetTagFromHelpers ilg cuspec ] + | _hasHelpers -> mkGetTagFromField ilg cuspec (baseTyOfUnionSpec cuspec) let mkCeqThen after = match after with @@ -285,17 +291,17 @@ let mkCeqThen after = | _ -> [AI_ceq; after] -let mkTagDiscriminate cenv cuspec _baseTy cidx = - mkGetTag cenv cuspec - @ [ mkLdcInt32 (cidx); +let mkTagDiscriminate ilg cuspec _baseTy cidx = + mkGetTag ilg cuspec + @ [ mkLdcInt32 cidx; AI_ceq ] -let mkTagDiscriminateThen cenv cuspec cidx after = - mkGetTag cenv cuspec +let mkTagDiscriminateThen ilg cuspec cidx after = + mkGetTag ilg cuspec @ [ mkLdcInt32 cidx ] @ mkCeqThen after -let convNewDataInstrInternal cenv cuspec cidx = +let convNewDataInstrInternal ilg cuspec cidx = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let altName = alt.Name @@ -309,123 +315,156 @@ let convNewDataInstrInternal cenv cuspec cidx = let baseTy = baseTyOfUnionSpec cuspec let instrs, tagfields = match cuspecRepr.DiscriminationTechnique cuspec with - | IntegerTag -> [ mkLdcInt32 cidx ], [mkTagFieldType cenv.ilg cuspec] + | IntegerTag -> [ mkLdcInt32 cidx ], [mkTagFieldType ilg cuspec] | _ -> [], [] instrs @ [ mkNormalNewobj(mkILCtorMethSpecForTy (baseTy,(Array.toList alt.FieldTypes @ tagfields))) ] else [ mkNormalNewobj(mkILCtorMethSpecForTy (altTy,Array.toList alt.FieldTypes)) ] -let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = +// The stdata 'instruction' is only ever used for the F# "List" type within FSharp.Core.dll +let mkStData (cuspec, cidx, fidx) = + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let fieldDef = alt.FieldDef fidx + [ mkNormalStfld (mkILFieldSpecInTy(altTy,fieldDef.LowerName, fieldDef.Type)) ] + +let mkNewData ilg (cuspec, cidx) = + let alt = altOfUnionSpec cuspec cidx + let altName = alt.Name + let baseTy = baseTyOfUnionSpec cuspec + // If helpers exist, use them + match cuspec.HasHelpers with + | AllHelpers + | SpecialFSharpListHelpers + | SpecialFSharpOptionHelpers -> + if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + [ AI_ldnull ] + elif alt.IsNullary then + [ mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "get_" + altName, [], constFormalFieldTy baseTy)) ] + else + [ mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, mkMakerName cuspec altName, Array.toList alt.FieldTypes, constFormalFieldTy baseTy)) ] + + | NoHelpers -> + if cuspecRepr.MaintainPossiblyUniqueConstantFieldForAlternative (cuspec,alt) then + // This method is only available if not AllHelpers. It fetches the unique object for the alternative + // without exposing direct access to the underlying field + [ mkNormalCall (mkILNonGenericStaticMethSpecInTy(baseTy, "get_" + altName, [], constFormalFieldTy baseTy)) ] + else + convNewDataInstrInternal ilg cuspec cidx + +let mkIsData ilg (avoidHelpers, cuspec, cidx) = + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let altName = alt.Name + if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + [ AI_ldnull; AI_ceq ] + elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then + // in this case we can use a null test + [ AI_ldnull; AI_cgt_un ] + else + match cuspecRepr.DiscriminationTechnique cuspec with + | SingleCase -> [ mkLdcInt32 1 ] + | RuntimeTypes -> mkRuntimeTypeDiscriminate ilg avoidHelpers cuspec alt altName altTy + | IntegerTag -> mkTagDiscriminate ilg cuspec (baseTyOfUnionSpec cuspec) cidx + | TailOrNull -> + match cidx with + | TagNil -> mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_ceq ] + | TagCons -> mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_cgt_un ] + | _ -> failwith "unexpected" + +let mkBrIsData ilg (avoidHelpers, cuspec,cidx,tg,failLab) = + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let altName = alt.Name + if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + [ I_brcmp (BI_brtrue,failLab,tg) ] + elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then + // in this case we can use a null test + [ I_brcmp (BI_brfalse,failLab,tg) ] + else + match cuspecRepr.DiscriminationTechnique cuspec with + | SingleCase -> [ I_br tg ] + | RuntimeTypes -> mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy (I_brcmp (BI_brfalse,failLab,tg)) + | IntegerTag -> mkTagDiscriminateThen ilg cuspec cidx (I_brcmp (BI_brfalse,failLab,tg)) + | TailOrNull -> + match cidx with + | TagNil -> mkGetTailOrNull avoidHelpers cuspec @ [I_brcmp (BI_brtrue,failLab,tg)] + | TagCons -> mkGetTailOrNull avoidHelpers cuspec @ [ I_brcmp (BI_brfalse,failLab,tg)] + | _ -> failwith "unexpected" + + +let rec convInstr ilg (tmps: ILLocalsAllocator) inplab outlab instr = match instr with | I_other e when isIlxExtInstr e -> match (destIlxExtInstr e) with - | (EI_newdata (cuspec, cidx)) -> - - let alt = altOfUnionSpec cuspec cidx - let altName = alt.Name - let baseTy = baseTyOfUnionSpec cuspec - let i = - // If helpers exist, use them - match cuspec.HasHelpers with - | AllHelpers - | SpecialFSharpListHelpers - | SpecialFSharpOptionHelpers -> - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then - [ AI_ldnull ] - elif alt.IsNullary then - [ mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "get_" + altName, [], constFormalFieldTy baseTy)) ] - else - [ mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, mkMakerName cuspec altName, Array.toList alt.FieldTypes, constFormalFieldTy baseTy)) ] - - | NoHelpers -> - if cuspecRepr.MaintainPossiblyUniqueConstantFieldForAlternative (cuspec,alt) then - // This method is only available if not AllHelpers. It fetches the unique object for the alternative - // without exposing direct access to the underlying field - [ mkNormalCall (mkILNonGenericStaticMethSpecInTy(baseTy, "get_" + altName, [], constFormalFieldTy baseTy)) ] - else - convNewDataInstrInternal cenv cuspec cidx - - InstrMorph i - - | (EI_stdata (cuspec, cidx,fidx)) -> - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - let fieldDef = alt.FieldDef fidx - InstrMorph [ mkNormalStfld (mkILFieldSpecInTy(altTy,fieldDef.LowerName, fieldDef.Type)) ] - - | (EI_lddata (avoidHelpers, cuspec,cidx,fidx)) -> - // The stdata instruction is only ever used for the F# "List" type within FSharp.Core.dll - InstrMorph [ mkLdData avoidHelpers cuspec cidx fidx ] - - | (EI_lddatatag (avoidHelpers,cuspec)) -> + | EI_lddatatag (avoidHelpers,cuspec) -> // If helpers exist, use them match cuspec.HasHelpers with | SpecialFSharpListHelpers | AllHelpers - when not avoidHelpers -> InstrMorph [ mkGetTagFromHelpers cenv cuspec ] + when not avoidHelpers -> InstrMorph [ mkGetTagFromHelpers ilg cuspec ] | _ -> let alts = cuspec.Alternatives match cuspecRepr.DiscriminationTechnique cuspec with | TailOrNull -> // leaves 1 if cons, 0 if not - InstrMorph [ mkGetTailOrNull avoidHelpers cuspec; AI_ldnull; AI_cgt_un ] + InstrMorph (mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_cgt_un]) | IntegerTag -> let baseTy = baseTyOfUnionSpec cuspec - InstrMorph (mkGetTagFromField cenv cuspec baseTy) + InstrMorph (mkGetTagFromField ilg cuspec baseTy) | SingleCase -> - InstrMorph [ AI_pop; (AI_ldc (DT_I4, ILConst.I4 0)) ] + InstrMorph [ AI_pop; mkLdcInt32 0 ] | RuntimeTypes -> - let baseTy = baseTyOfUnionSpec cuspec - let locn = tmps.AllocLocal (mkILLocal baseTy None) - - let mkCase last inplab cidx failLab = - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - let altName = alt.Name - let internalLab = generateCodeLabel () - let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) - if last then - mkBasicBlock2 (inplab,[ (AI_ldc (DT_I4, ILConst.I4 cidx)); - I_br outlab ]) - else - let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),failLab,internalLab) - let test_block = - if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then - [ test ] - else - mkRuntimeTypeDiscriminateThen cenv avoidHelpers cuspec alt altName altTy test - mkGroupBlock - ([internalLab], - [ mkBasicBlock2 (inplab, mkLdloc locn ::test_block); - mkBasicBlock2 (internalLab,[(AI_ldc(DT_I4,ILConst.I4(cidx))); I_br outlab ]) ]) - - // Make the block for the last test. - let lastInpLab = generateCodeLabel () - let lastBlock = mkCase true lastInpLab 0 outlab - - // Make the blocks for the remaining tests. - let _, firstInpLab, overallBlock = - List.foldBack + let baseTy = baseTyOfUnionSpec cuspec + let locn = tmps.AllocLocal (mkILLocal baseTy None) + + let mkCase last inplab cidx failLab = + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let altName = alt.Name + let internalLab = generateCodeLabel () + let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) + if last then + mkBasicBlock2 (inplab,[ mkLdcInt32 cidx; I_br outlab ]) + else + let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),failLab,internalLab) + let test_block = + if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + [ test ] + else + mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy test + mkGroupBlock + ([internalLab], + [ mkBasicBlock2 (inplab, mkLdloc locn ::test_block); + mkBasicBlock2 (internalLab,[mkLdcInt32 cidx; I_br outlab ]) ]) + + // Make the block for the last test. + let lastInpLab = generateCodeLabel () + let lastBlock = mkCase true lastInpLab 0 outlab + + // Make the blocks for the remaining tests. + let _, firstInpLab, overallBlock = + List.foldBack (fun _ (n, continueInpLab, continueBlock) -> let newInpLab = generateCodeLabel () n+1, newInpLab, mkGroupBlock - ([continueInpLab], - [ mkCase false newInpLab n continueInpLab; + ([continueInpLab], + [ mkCase false newInpLab n continueInpLab; continueBlock ])) (List.tail alts) (1,lastInpLab, lastBlock) - // Add on a branch to the first input label. This gets optimized away by the printer/emitter. - InstrMorph - (mkGroupBlock - ([firstInpLab], - [ mkBasicBlock2 (inplab, [ mkStloc locn; I_br firstInpLab ]); - overallBlock ])) + // Add on a branch to the first input label. This gets optimized away by the printer/emitter. + InstrMorph + (mkGroupBlock + ([firstInpLab], + [ mkBasicBlock2 (inplab, [ mkStloc locn; I_br firstInpLab ]); + overallBlock ])) - | (EI_castdata (canfail,cuspec,cidx)) -> + | EI_castdata (canfail,cuspec,cidx) -> let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then @@ -438,7 +477,7 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = [ AI_dup; I_brcmp (BI_brfalse,outlab, internal1) ]); mkBasicBlock2 (internal1, - [ mkPrimaryAssemblyExnNewobj cenv.ilg "System.InvalidCastException"; + [ mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ]); ] )) else @@ -450,47 +489,8 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = else InstrMorph [ I_castclass altTy ] - | (EI_brisdata (avoidHelpers, cuspec,cidx,tg,failLab)) -> - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - let altName = alt.Name - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then - InstrMorph [ I_brcmp (BI_brtrue,failLab,tg) ] - elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then - // in this case we can use a null test - InstrMorph [ I_brcmp (BI_brfalse,failLab,tg) ] - else - match cuspecRepr.DiscriminationTechnique cuspec with - | SingleCase -> InstrMorph [ I_br tg ] - | RuntimeTypes -> InstrMorph (mkRuntimeTypeDiscriminateThen cenv avoidHelpers cuspec alt altName altTy (I_brcmp (BI_brfalse,failLab,tg))) - | IntegerTag -> InstrMorph (mkTagDiscriminateThen cenv cuspec cidx (I_brcmp (BI_brfalse,failLab,tg))) - | TailOrNull -> - match cidx with - | TagNil -> InstrMorph [ mkGetTailOrNull avoidHelpers cuspec; I_brcmp (BI_brtrue,failLab,tg) ] - | TagCons -> InstrMorph [ mkGetTailOrNull avoidHelpers cuspec; I_brcmp (BI_brfalse,failLab,tg) ] - | _ -> failwith "unexpected" - - | (EI_isdata (avoidHelpers, cuspec, cidx)) -> - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - let altName = alt.Name - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then - InstrMorph [ AI_ldnull; AI_ceq ] - elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then - // in this case we can use a null test - InstrMorph [ AI_ldnull; AI_cgt_un ] - else - match cuspecRepr.DiscriminationTechnique cuspec with - | SingleCase -> InstrMorph [ mkLdcInt32 1 ] - | RuntimeTypes -> InstrMorph (mkRuntimeTypeDiscriminate cenv avoidHelpers cuspec alt altName altTy) - | IntegerTag -> InstrMorph (mkTagDiscriminate cenv cuspec (baseTyOfUnionSpec cuspec) cidx) - | TailOrNull -> - match cidx with - | TagNil -> InstrMorph [ mkGetTailOrNull avoidHelpers cuspec; AI_ldnull; AI_ceq ] - | TagCons -> InstrMorph [ mkGetTailOrNull avoidHelpers cuspec; AI_ldnull; AI_cgt_un ] - | _ -> failwith "unexpected" - | (EI_datacase (avoidHelpers, cuspec, cases, cont)) -> + | EI_datacase (avoidHelpers, cuspec, cases, cont) -> let baseTy = baseTyOfUnionSpec cuspec match cuspecRepr.DiscriminationTechnique cuspec with @@ -510,7 +510,7 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = (if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then [ testInstr ] else - mkRuntimeTypeDiscriminateThen cenv avoidHelpers cuspec alt altName altTy testInstr) + mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy testInstr) mkBasicBlock2 (inplab, test) @@ -551,7 +551,7 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = if ok then res else cont let dests = List.mapi mkCase cuspec.Alternatives - InstrMorph (mkGetTag cenv cuspec @ [ I_switch (dests,cont) ]) + InstrMorph (mkGetTag ilg cuspec @ [ I_switch (dests,cont) ]) | SingleCase -> match cases with | [(0,tg)] -> InstrMorph [ AI_pop; I_br tg ] @@ -563,16 +563,16 @@ let rec convInstr cenv (tmps: ILLocalsAllocator) inplab outlab instr = | _ -> InstrMorph [instr] -let convILMethodBody cenv il = +let convILMethodBody ilg il = let tmps = ILLocalsAllocator il.Locals.Length - let code= morphExpandILInstrsInILCode (convInstr cenv tmps) il.Code + let code= morphExpandILInstrsInILCode (convInstr ilg tmps) il.Code {il with Locals = ILList.ofList (ILList.toList il.Locals @ tmps.Close()); Code=code; MaxStack=il.MaxStack+2 } -let convMethodDef cenv md = - {md with mdBody= morphILMethodBody (convILMethodBody cenv) md.mdBody } +let convMethodDef ilg md = + {md with mdBody= morphILMethodBody (convILMethodBody ilg) md.mdBody } let mkHiddenGeneratedInstanceFieldDef ilg (nm,ty,init,access) = mkILInstanceField (nm,ty,init,access) @@ -585,7 +585,7 @@ let mkHiddenGeneratedStaticFieldDef ilg (a,b,c,d,e) = |> addFieldGeneratedAttrs ilg -let mkMethodsAndPropertiesForFields cenv access attr hasHelpers (typ: ILType) (fields: IlxUnionField[]) = +let mkMethodsAndPropertiesForFields ilg access attr hasHelpers (typ: ILType) (fields: IlxUnionField[]) = let basicProps = fields |> Array.map (fun field -> @@ -599,7 +599,7 @@ let mkMethodsAndPropertiesForFields cenv access attr hasHelpers (typ: ILType) (f Init=None; Args=mkILTypes []; CustomAttrs= field.ILField.CustomAttrs; } - |> addPropertyGeneratedAttrs cenv.ilg + |> addPropertyGeneratedAttrs ilg ) |> Array.toList @@ -615,12 +615,12 @@ let mkMethodsAndPropertiesForFields cenv access attr hasHelpers (typ: ILType) (f nonBranchingInstrsToCode [ mkLdarg 0us; mkNormalLdfld fspec ], attr)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg ] + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg ] basicProps, basicMethods -let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (alt:IlxUnionAlternative) = +let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (alt:IlxUnionAlternative) = let attr = cud.cudWhere let altName = alt.Name let fields = alt.FieldDefs @@ -654,8 +654,8 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode [ I_ldsfld (Nonvolatile,mkConstFieldSpec altName baseTy) ], attr)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg [meth] else @@ -675,24 +675,23 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( [ mkILNonGenericInstanceMethod ("get_" + mkTesterName altName, cud.cudHelpersAccess,[], - mkILReturn cenv.ilg.typ_bool, + mkILReturn ilg.typ_bool, mkMethodBody(true,emptyILLocals,2,nonBranchingInstrsToCode - [ mkLdarg0; - (mkIlxInstr (EI_isdata (true,cuspec, num))) ], attr)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg ], + ([ mkLdarg0 ] @ mkIsData ilg (true, cuspec, num)), attr)) + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg ], [ { Name=mkTesterName altName; IsRTSpecialName=false; IsSpecialName=false; SetMethod=None; - GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Instance, "get_" + mkTesterName altName, 0, [], cenv.ilg.typ_bool)); + GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Instance, "get_" + mkTesterName altName, 0, [], ilg.typ_bool)); CallingConv=ILThisConvention.Instance; - Type=cenv.ilg.typ_bool; + Type=ilg.typ_bool; Init=None; Args=mkILTypes []; CustomAttrs=emptyILCustomAttrs; } - |> addPropertyGeneratedAttrs cenv.ilg - |> addPropertyNeverAttrs cenv.ilg ] + |> addPropertyGeneratedAttrs ilg + |> addPropertyNeverAttrs ilg ] @@ -704,9 +703,9 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( mkILNonGenericStaticMethod ("get_" + altName, cud.cudHelpersAccess, [], mkILReturn baseTy, - mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode (convNewDataInstrInternal cenv cuspec num), attr)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg + mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode (convNewDataInstrInternal ilg cuspec num), attr)) + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg |> addAltAttribs let nullaryProp = @@ -721,8 +720,8 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( Init=None; Args=mkILTypes []; CustomAttrs=emptyILCustomAttrs; } - |> addPropertyGeneratedAttrs cenv.ilg - |> addPropertyNeverAttrs cenv.ilg + |> addPropertyGeneratedAttrs ilg + |> addPropertyNeverAttrs ilg [nullaryMeth],[nullaryProp] @@ -736,9 +735,9 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode (Array.toList (Array.mapi (fun i _ -> mkLdarg (uint16 i)) fields) @ - (convNewDataInstrInternal cenv cuspec num)), attr)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg + (convNewDataInstrInternal ilg cuspec num)), attr)) + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg |> addAltAttribs [mdef],[] @@ -754,7 +753,7 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( else let altNullaryFields = if repr.MaintainPossiblyUniqueConstantFieldForAlternative(info,alt) then - let basic = mkHiddenGeneratedStaticFieldDef cenv.ilg (constFieldName altName, baseTy, None, None, ILMemberAccess.Assembly) + let basic = mkHiddenGeneratedStaticFieldDef ilg (constFieldName altName, baseTy, None, None, ILMemberAccess.Assembly) let uniqObjField = { basic with IsInitOnly=true } let inRootClass = cuspecRepr.OptimizeAlternativeToRootClass (cuspec,alt) @@ -774,7 +773,7 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( let debugProxyFieldName = "_obj" let debugProxyFields = - [ mkHiddenGeneratedInstanceFieldDef cenv.ilg (debugProxyFieldName,altTy, None, ILMemberAccess.Assembly) ] + [ mkHiddenGeneratedInstanceFieldDef ilg (debugProxyFieldName,altTy, None, ILMemberAccess.Assembly) ] let debugProxyCtor = mkILCtor(ILMemberAccess.Public (* must always be public - see jared parson blog entry on implementing debugger type proxy *), @@ -783,12 +782,12 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( (false,emptyILLocals,3, nonBranchingInstrsToCode [ yield mkLdarg0 - yield mkNormalCall (mkILCtorMethSpecForTy (cenv.ilg.typ_Object,[])) + yield mkNormalCall (mkILCtorMethSpecForTy (ilg.typ_Object,[])) yield mkLdarg0 yield mkLdarg 1us; yield mkNormalStfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)); ],None)) - |> addMethodGeneratedAttrs cenv.ilg + |> addMethodGeneratedAttrs ilg let debugProxyGetterMeths = fields @@ -803,8 +802,8 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( [ mkLdarg0; mkNormalLdfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)); mkNormalLdfld (mkILFieldSpecInTy(altTy,fldName,fldTy));],None)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg) + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg) |> Array.toList let debugProxyGetterProps = @@ -820,13 +819,13 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( Init=None; Args=mkILTypes []; CustomAttrs= fdef.ILField.CustomAttrs; } - |> addPropertyGeneratedAttrs cenv.ilg) + |> addPropertyGeneratedAttrs ilg) |> Array.toList let debugProxyTypeDef = mkILGenericClass (debugProxyTypeName, ILTypeDefAccess.Nested ILMemberAccess.Assembly, td.GenericParams, - cenv.ilg.typ_Object, [], + ilg.typ_Object, [], mkILMethods ([debugProxyCtor] @ debugProxyGetterMeths), mkILFields debugProxyFields, emptyILTypeDefs, @@ -835,19 +834,19 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( emptyILCustomAttrs, ILTypeInit.BeforeField) [ { debugProxyTypeDef with IsSpecialName=true } ], - ( [cenv.ilg.mkDebuggerTypeProxyAttribute debugProxyTy] @ cud.cudDebugDisplayAttributes) + ( [ilg.mkDebuggerTypeProxyAttribute debugProxyTy] @ cud.cudDebugDisplayAttributes) let altTypeDef = let basicFields = fields |> Array.map (fun field -> let fldName,fldTy = mkUnionCaseFieldId field - let fdef = mkHiddenGeneratedInstanceFieldDef cenv.ilg (fldName,fldTy, None, ILMemberAccess.Assembly) + let fdef = mkHiddenGeneratedInstanceFieldDef ilg (fldName,fldTy, None, ILMemberAccess.Assembly) { fdef with IsInitOnly=isTotallyImmutable }) |> Array.toList - let basicProps, basicMethods = mkMethodsAndPropertiesForFields cenv cud.cudReprAccess attr cud.cudHasHelpers altTy fields + let basicProps, basicMethods = mkMethodsAndPropertiesForFields ilg cud.cudReprAccess attr cud.cudHasHelpers altTy fields let basicCtorMeth = @@ -856,8 +855,8 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( [ yield mkLdarg0 match repr.DiscriminationTechnique info with | IntegerTag -> - yield (AI_ldc(DT_I4,ILConst.I4(num))) - yield mkNormalCall (mkILCtorMethSpecForTy (baseTy,[mkTagFieldType cenv.ilg cuspec])) + yield mkLdcInt32 num + yield mkNormalCall (mkILCtorMethSpecForTy (baseTy,[mkTagFieldType ilg cuspec])) | SingleCase | RuntimeTypes -> yield mkNormalCall (mkILCtorMethSpecForTy (baseTy,[])) @@ -866,7 +865,7 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( altTy, (basicFields |> List.map (fun fdef -> fdef.Name, fdef.Type) ), (if cuspec.HasHelpers = AllHelpers then ILMemberAccess.Assembly else cud.cudReprAccess)) - |> addMethodGeneratedAttrs cenv.ilg + |> addMethodGeneratedAttrs ilg let altTypeDef = mkILGenericClass (altTy.TypeSpec.Name, @@ -892,7 +891,7 @@ let convAlternativeDef cenv num (td:ILTypeDef) cud info cuspec (baseTy:ILType) ( baseMakerMeths, baseMakerProps, altUniqObjMeths, typeDefs, altDebugTypeDefs, altNullaryFields -let rec convClassUnionDef cenv enc td cud = +let rec convClassUnionDef ilg enc td cud = let baseTy = mkILFormalBoxedTy (mkRefForNestedILTypeDef ILScopeRef.Local (enc,td)) td.GenericParams let cuspec = IlxUnionSpec(IlxUnionRef(baseTy.TypeRef, cud.cudAlternatives, cud.cudNullPermitted, cud.cudHasHelpers), baseTy.GenericArgs) let info = (enc,td,cud) @@ -902,7 +901,7 @@ let rec convClassUnionDef cenv enc td cud = let results = cud.cudAlternatives |> List.ofArray - |> List.mapi (fun i alt -> convAlternativeDef cenv i td cud info cuspec baseTy alt) + |> List.mapi (fun i alt -> convAlternativeDef ilg i td cud info cuspec baseTy alt) let baseMethsFromAlt = results |> List.collect (fun (a,_,_,_,_,_) -> a) let basePropsFromAlt = results |> List.collect (fun (_,a,_,_,_,_) -> a) @@ -914,7 +913,7 @@ let rec convClassUnionDef cenv enc td cud = let tagFieldsInObject = match repr.DiscriminationTechnique info with | SingleCase | RuntimeTypes | TailOrNull -> [] - | IntegerTag -> [ mkTagFieldId cenv.ilg cuspec ] + | IntegerTag -> [ mkTagFieldId ilg cuspec ] let selfFields, selfMeths, selfProps, _ = match cud.cudAlternatives |> Array.toList |> List.findi 0 (fun alt -> repr.OptimizeSingleNonNullaryAlternativeToRootClass (info,alt)) with @@ -923,13 +922,13 @@ let rec convClassUnionDef cenv enc td cud = let ctor = mkILSimpleStorageCtor (cud.cudWhere, - (match td.Extends with None -> Some cenv.ilg.tspec_Object | Some typ -> Some typ.TypeSpec), + (match td.Extends with None -> Some ilg.tspec_Object | Some typ -> Some typ.TypeSpec), baseTy, (fields @ tagFieldsInObject), (if cuspec.HasHelpers = AllHelpers then ILMemberAccess.Assembly else cud.cudReprAccess)) - |> addMethodGeneratedAttrs cenv.ilg + |> addMethodGeneratedAttrs ilg - let props, meths = mkMethodsAndPropertiesForFields cenv cud.cudReprAccess cud.cudWhere cud.cudHasHelpers baseTy alt.FieldDefs + let props, meths = mkMethodsAndPropertiesForFields ilg cud.cudReprAccess cud.cudWhere cud.cudHasHelpers baseTy alt.FieldDefs fields,([ctor] @ meths),props,altNum | None -> @@ -937,7 +936,7 @@ let rec convClassUnionDef cenv enc td cud = let selfAndTagFields = [ for (fldName,fldTy) in (selfFields @ tagFieldsInObject) do - let fdef = mkHiddenGeneratedInstanceFieldDef cenv.ilg (fldName,fldTy, None, ILMemberAccess.Assembly) + let fdef = mkHiddenGeneratedInstanceFieldDef ilg (fldName,fldTy, None, ILMemberAccess.Assembly) yield { fdef with IsInitOnly=isTotallyImmutable } ] let ctorMeths = @@ -949,11 +948,11 @@ let rec convClassUnionDef cenv enc td cud = else [ mkILSimpleStorageCtor (cud.cudWhere, - (match td.Extends with None -> Some cenv.ilg.tspec_Object | Some typ -> Some typ.TypeSpec), + (match td.Extends with None -> Some ilg.tspec_Object | Some typ -> Some typ.TypeSpec), baseTy, tagFieldsInObject, ILMemberAccess.Assembly) // cud.cudReprAccess) - |> addMethodGeneratedAttrs cenv.ilg ] + |> addMethodGeneratedAttrs ilg ] // Now initialize the constant fields wherever they are stored... let addConstFieldInit cd = @@ -971,8 +970,8 @@ let rec convClassUnionDef cenv enc td cud = yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])); | IntegerTag -> if inRootClass then - yield (AI_ldc(DT_I4,ILConst.I4(fidx))); - yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[mkTagFieldType cenv.ilg cuspec] )) + yield mkLdcInt32 fidx + yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[mkTagFieldType ilg cuspec] )) else yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])); yield mkNormalStsfld constFieldSpec ] @@ -980,7 +979,7 @@ let rec convClassUnionDef cenv enc td cud = cd let tagMeths, tagProps, tagEnumFields = - let tagFieldType = mkTagFieldType cenv.ilg cuspec + let tagFieldType = mkTagFieldType ilg cuspec let tagEnumFields = cud.cudAlternatives |> Array.mapi (fun num alt -> mkILLiteralField (alt.Name, tagFieldType, ILFieldInit.Int32 num, None, ILMemberAccess.Public)) @@ -1000,8 +999,8 @@ let rec convClassUnionDef cenv enc td cud = [ mkLdarg0; (mkIlxInstr (EI_lddatatag (true, cuspec))) ], cud.cudWhere)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg ], + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg ], [] else @@ -1014,8 +1013,8 @@ let rec convClassUnionDef cenv enc td cud = [ mkLdarg0; (mkIlxInstr (EI_lddatatag (true, cuspec))) ], cud.cudWhere)) - |> convMethodDef cenv - |> addMethodGeneratedAttrs cenv.ilg ], + |> convMethodDef ilg + |> addMethodGeneratedAttrs ilg ], [ { Name=tagPropertyName; IsRTSpecialName=false; @@ -1027,8 +1026,8 @@ let rec convClassUnionDef cenv enc td cud = Init=None; Args=mkILTypes []; CustomAttrs=emptyILCustomAttrs; } - |> addPropertyGeneratedAttrs cenv.ilg - |> addPropertyNeverAttrs cenv.ilg ] + |> addPropertyGeneratedAttrs ilg + |> addPropertyNeverAttrs ilg ] tagMeths, tagProps, tagEnumFields @@ -1042,7 +1041,7 @@ let rec convClassUnionDef cenv enc td cud = |> List.filter (fun md -> not (cud.cudHasHelpers = SpecialFSharpListHelpers && (md.Name = "get_Empty" || md.Name = "Cons" || md.Name = "get_IsEmpty")) && not (cud.cudHasHelpers = SpecialFSharpOptionHelpers && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))) // Convert the user-defined methods - |> List.map (convMethodDef cenv) + |> List.map (convMethodDef ilg) let existingProps = td.Properties.AsList @@ -1069,7 +1068,7 @@ let rec convClassUnionDef cenv enc td cud = IsSpecialName=false; Encoding=ILDefaultPInvokeEncoding.Ansi; Implements = mkILTypes []; - Extends= Some cenv.ilg.typ_Object ; + Extends= Some ilg.typ_Object ; Methods= emptyILMethods; SecurityDecls=emptyILSecurityDecls; HasSecurity=false; @@ -1086,7 +1085,7 @@ let rec convClassUnionDef cenv enc td cud = NestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ - (convTypeDefs cenv (enc@[td]) td.NestedTypes).AsList); + (convTypeDefs ilg (enc@[td]) td.NestedTypes).AsList); GenericParams= td.GenericParams; Access = td.Access; IsAbstract = isAbstract; @@ -1097,7 +1096,7 @@ let rec convClassUnionDef cenv enc td cud = IsSpecialName=td.IsSpecialName; Encoding=td.Encoding ; Implements = td.Implements; - Extends= (match td.Extends with None -> Some cenv.ilg.typ_Object | _ -> td.Extends) ; + Extends= (match td.Extends with None -> Some ilg.typ_Object | _ -> td.Extends) ; Methods= mkILMethods (ctorMeths @ baseMethsFromAlt @ selfMeths @ @@ -1120,24 +1119,23 @@ let rec convClassUnionDef cenv enc td cud = baseTypeDef -and convTypeDef cenv enc td = +and convTypeDef ilg enc td = match td.tdKind with | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> begin match destIlxExtTypeDefKind e with | IlxTypeDefKind.Closure cloinfo -> - {td with NestedTypes = convTypeDefs cenv (enc@[td]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef cenv) td.Methods; - tdKind= mkIlxTypeDefKind(IlxTypeDefKind.Closure (morphIlxClosureInfo (convILMethodBody cenv) cloinfo)) } - | IlxTypeDefKind.Union cud -> convClassUnionDef cenv enc td cud + {td with NestedTypes = convTypeDefs ilg (enc@[td]) td.NestedTypes; + Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; + tdKind= mkIlxTypeDefKind(IlxTypeDefKind.Closure (morphIlxClosureInfo (convILMethodBody ilg) cloinfo)) } + | IlxTypeDefKind.Union cud -> convClassUnionDef ilg enc td cud end | _ -> - {td with NestedTypes = convTypeDefs cenv (enc@[td]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef cenv) td.Methods; } + {td with NestedTypes = convTypeDefs ilg (enc@[td]) td.NestedTypes; + Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; } -and convTypeDefs cenv enc tdefs : ILTypeDefs = - morphILTypeDefs (convTypeDef cenv enc) tdefs +and convTypeDefs ilg enc tdefs : ILTypeDefs = + morphILTypeDefs (convTypeDef ilg enc) tdefs let ConvModule ilg modul = - let cenv = { ilg=ilg; } - morphILTypeDefsInILModule (convTypeDefs cenv []) modul + morphILTypeDefsInILModule (convTypeDefs ilg []) modul diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index 96ed542478c..e9db0377858 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -9,5 +9,10 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.EraseUnions open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types +val mkNewData : ILGlobals -> IlxUnionSpec * int -> ILInstr list +val mkIsData : ILGlobals -> bool * IlxUnionSpec * int -> ILInstr list +val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list +val mkStData : IlxUnionSpec * int * int -> ILInstr list +val mkBrIsData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel -> ILInstr list val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef val GetILTypeForAlternative : IlxUnionSpec -> int -> ILType From 6044a10c5a785aeb6dbb240e07de7a8e88ee2f5c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 3 Jun 2016 15:22:55 +0100 Subject: [PATCH 229/334] ILX cleanup Part 2 (b) --- src/absil/ilprint.fs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index ab88ff98d0e..2c7843b04b1 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -763,15 +763,6 @@ let rec goutput_instr env os inst = goutput_cuspec env os ty; output_string os ","; output_int os n - | (EI_brisdata (_,ty,n,tg1,_)) -> - output_string os "brisdata "; - goutput_cuspec env os ty; - output_string os ","; - output_string os "("; - output_int os n; - output_string os ","; - output_code_label os tg1; - output_string os ")" | (EI_lddatatag (_,ty)) -> output_string os "lddatatag "; goutput_cuspec env os ty From 118cf7f83f13b53b2a7e8ef50412a04a02778fa2 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 3 Jun 2016 17:28:03 +0300 Subject: [PATCH 230/334] Check the value of the underscore literals are equals to rgular numeric literal --- .../Constants/BasicConstants.fs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs index 397ffd31d49..78303d2713e 100644 --- a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs +++ b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/BasicConstants.fs @@ -41,18 +41,59 @@ let boolConst2 = false let unitConst = () let creditCardNumber = 1234_5678_9012_3456L +if creditCardNumber <> 1234567890123456L then + failwith "Wrong parsing" + let socialSecurityNumber = 999_99_9999L +if socialSecurityNumber <> 999999999L then + failwith "Wrong parsing" + let pi = 3.14_15F +if pi <> 3.1415F then + failwith "Wrong parsing" + let hexBytes = 0xFF_EC_DE_5E +if hexBytes <> 0xFFECDE5E then + failwith "Wrong parsing" + let hexWords = 0xCAFE_BABE +if hexWords <> 0xCAFEBABE then + failwith "Wrong parsing" + let maxLong = 0x7fff_ffff_ffff_ffffL +if maxLong <> 0x7fffffffffffffffL then + failwith "Wrong parsing" + let nybbles = 0b0010_0101 +if nybbles <> 0b00100101 then + failwith "Wrong parsing" + let bytes = 0b11010010_01101001_10010100_10010010 +if bytes <> 0b11010010011010011001010010010010 then + failwith "Wrong parsing" + let x2 = 5_2 +if x2 <> 52 then + failwith "Wrong parsing" + let x4 = 5_______2 +if x4 <> 52 then + failwith "Wrong parsing" + let x7 = 0x5_2 +if x7 <> 0x52 then + failwith "Wrong parsing" + let x9 = 0_52 +if x9 <> 052 then + failwith "Wrong parsing" + let x10 = 05_2 +if x10 <> 052 then + failwith "Wrong parsing" + let x14 = 0o5_2 +if x14 <> 0o52 then + failwith "Wrong parsing" exit 0 From 4ef264cf09f9977038580265556b93e3d9f2d523 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Sat, 4 Jun 2016 22:22:19 +0300 Subject: [PATCH 231/334] fix test --- src/fsharp/FSharp.Core/prim-types.fs | 4 +++- src/fsharp/lex.fsl | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 7c35775c52a..05fa73cef3c 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2505,7 +2505,9 @@ namespace Microsoft.FSharp.Core parse p 0UL let inline removeUnderscores (s:string) = - s.Replace("_", "") + match s with + | null -> null + | s -> s.Replace("_", "") let ParseUInt32 (s:string) = if System.Object.ReferenceEquals(s,null) then diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 4d7a09f71fa..58694b81204 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -83,7 +83,9 @@ let parseOctalUInt64 (s:string) p l = parse p 0UL let inline removeUnderscores (s:string) = - s.Replace("_", "") + match s with + | null -> null + | s -> s.Replace("_", "") let parseInt32 (s:string) = let s = removeUnderscores s From 0cda1c37205ce0c0b6fd6e7f97bc5e0ef8e5e1fc Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Sat, 4 Jun 2016 23:45:54 +0300 Subject: [PATCH 232/334] fix test --- .../Imported/CallerInfo/W_CallerMemberName.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs index 49b9362c3e8..2ee25fac1b0 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs @@ -1,4 +1,4 @@ -//The CallerMemberNameAttribute applied to parameter 'name' will have no effect. It is overridden by the CallerFilePathAttribute. +//The CallerMemberNameAttribute applied to parameter 'name' will have no effect. It is overridden by the CallerFilePathAttribute. namespace Test open System.Runtime.CompilerServices From c0a18dada6eb13633ff65df3e6a86b84937b97c5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 5 Jun 2016 16:13:28 +0100 Subject: [PATCH 233/334] ILX cleanup: do union/closure typedef generation in IlxGen phase --- src/absil/il.fs | 35 ---- src/absil/il.fsi | 17 -- src/absil/ilmorph.fs | 30 +--- src/absil/ilmorph.fsi | 1 - src/absil/ilprint.fs | 46 +----- src/absil/ilreflect.fs | 1 - src/absil/ilx.fs | 9 - src/absil/ilx.fsi | 10 -- src/fsharp/IlxGen.fs | 236 +++++++++++++++------------ src/fsharp/NicePrint.fs | 24 ++- src/fsharp/PostInferenceChecks.fs | 6 +- src/fsharp/SignatureConformance.fs | 10 +- src/fsharp/TastOps.fs | 16 +- src/fsharp/TastPickle.fs | 10 +- src/fsharp/TypeChecker.fs | 22 +-- src/fsharp/tast.fs | 30 ++-- src/fsharp/vs/ServiceDeclarations.fs | 37 ++--- src/fsharp/vs/Symbols.fs | 2 +- src/ilx/EraseClosures.fs | 65 ++++---- src/ilx/EraseClosures.fsi | 3 + src/ilx/EraseUnions.fs | 100 ++++++------ src/ilx/EraseUnions.fsi | 1 + 22 files changed, 290 insertions(+), 421 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index e94fd0f68cb..0d1955ead1f 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -790,15 +790,6 @@ and [] member x.QualifiedNameWithNoShortPrimaryAssembly = x.AddQualifiedNameExtensionWithNoShortPrimaryAssembly(x.BasicQualifiedName) -and - [] - IlxExtensionType = - | Ext_typ of obj - member x.Value = (let (Ext_typ(v)) = x in v) - override x.Equals(yobj) = match yobj with :? IlxExtensionType as y -> Unchecked.equals x.Value y.Value | _ -> false - interface System.IComparable with - override x.CompareTo(yobj) = match yobj with :? IlxExtensionType as y -> Unchecked.compare x.Value y.Value | _ -> invalidOp "bad comparison" - and [] ILCallingSignature = { CallingConv: ILCallingConv; @@ -1688,12 +1679,6 @@ type ILTypeDefKind = | Interface | Enum | Delegate - | Other of IlxExtensionTypeKind - -and IlxExtensionTypeKind = Ext_type_def_kind of obj - -type internal_type_def_kind_extension = - { internalTypeDefKindExtIs: IlxExtensionTypeKind -> bool; } [] @@ -1936,22 +1921,6 @@ let mkILBoxedTyRaw tref tinst = mkILNamedTyRaw AsObject tref tinst let mkILNonGenericValueTy tref = mkILNamedTy AsValue tref [] let mkILNonGenericBoxedTy tref = mkILNamedTy AsObject tref [] - -type ILTypeDefKindExtension<'T> = - | TypeDefKindExtension - -let type_def_kind_extensions = ref [] - -let RegisterTypeDefKindExtension (TypeDefKindExtension : ILTypeDefKindExtension<'T>) = - if nonNil !type_def_kind_extensions then failwith "define_type_extension: only one extension currently allowed"; - let mk (x:'T) = Ext_type_def_kind (box x) - let test (Ext_type_def_kind _x) = true - let dest (Ext_type_def_kind x) = (unbox x: 'T) - type_def_kind_extensions := - { internalTypeDefKindExtIs=test;} - :: !type_def_kind_extensions; - mk,test,dest - // -------------------------------------------------------------------- // Making assembly, module and file references // -------------------------------------------------------------------- @@ -1962,10 +1931,6 @@ let mkSimpleAssRef n = let mkSimpleModRef n = ILModuleRef.Create(n, true, None) -let module_name_of_scoref = function - | ILScopeRef.Module(mref) -> mref.Name - | _ -> failwith "module_name_of_scoref" - // -------------------------------------------------------------------- // The toplevel class of a module is called "" // diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 558f3ebfa22..6c435acbfd4 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -98,15 +98,6 @@ type ILSourceMarker = member EndLine: int member EndColumn: int -/// Extensibility: ignore these unless you are generating ILX -/// structures directly. -[] -type IlxExtensionType = - interface System.IComparable - -/// Represents an extension to the algebra of type kinds -type IlxExtensionTypeKind - /// Represents an extension to the algebra of instructions type IlxExtensionInstr @@ -1408,8 +1399,6 @@ type ILTypeDefKind = | Interface | Enum | Delegate - (* FOR EXTENSIONS, e.g. MS-ILX *) - | Other of IlxExtensionTypeKind /// Tables of named type definitions. The types and table may contain on-demand /// (lazy) computations, e.g. the actual reading of some aspects @@ -2292,9 +2281,3 @@ type ILReferences = val computeILRefs: ILModuleDef -> ILReferences val emptyILRefs: ILReferences -// -------------------------------------------------------------------- -// The following functions are used to define an extension to the In reality the only extension is ILX - -type ILTypeDefKindExtension<'Extension> = TypeDefKindExtension - -val RegisterTypeDefKindExtension: ILTypeDefKindExtension<'Extension> -> ('Extension -> IlxExtensionTypeKind) * (IlxExtensionTypeKind -> bool) * (IlxExtensionTypeKind -> 'Extension) diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index 1549138a3d1..f1a1768bd59 100644 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -405,17 +405,6 @@ let mdefs_typ2typ_ilmbody2ilmbody ilg fs x = morphILMethodDefs (mdef_typ2typ_ilm let cuinfo_typ2typ ilg ftype cud = { cud with cudAlternatives = alts_typ2typ ilg ftype cud.cudAlternatives; } - -let cloinfo_typ2typ_ilmbody2ilmbody fs clo = - let (ftype,filmbody) = fs - let c' = filmbody None (Lazy.force clo.cloCode) - { clo with cloFreeVars = freevars_typ2typ ftype clo.cloFreeVars; - cloCode=notlazy c' } - -let morphIlxClosureInfo f clo = - let c' = f (Lazy.force clo.cloCode) - { clo with cloCode=notlazy c' } - let mimpl_typ2typ f e = { Overrides = ospec_typ2typ f e.Overrides; OverrideBy = mspec_typ2typ (f,(fun _ -> f)) e.OverrideBy; } @@ -443,7 +432,7 @@ let edefs_typ2typ ilg f (edefs: ILEventDefs) = mkILEvents (List.map (edef_typ2ty let mimpls_typ2typ f (mimpls : ILMethodImplDefs) = mkILMethodImpls (List.map (mimpl_typ2typ f) mimpls.AsList) let rec tdef_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg enc fs td = - let (ftype,filmbody,fmdefs) = fs + let (ftype,fmdefs) = fs let ftype' = ftype (Some (enc,td)) None let mdefs' = fmdefs (enc,td) td.Methods let fdefs' = fdefs_typ2typ ilg ftype' td.Fields @@ -457,13 +446,6 @@ let rec tdef_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg enc fs td = Events = edefs_typ2typ ilg ftype' td.Events; Properties = pdefs_typ2typ ilg ftype' td.Properties; CustomAttrs = cattrs_typ2typ ilg ftype' td.CustomAttrs; - tdKind = - match td.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure i -> mkIlxTypeDefKind (IlxTypeDefKind.Closure (cloinfo_typ2typ_ilmbody2ilmbody (ftype',filmbody (enc,td)) i)) - | IlxTypeDefKind.Union i -> mkIlxTypeDefKind (IlxTypeDefKind.Union (cuinfo_typ2typ ilg ftype' i)) - | _ -> td.tdKind } and tdefs_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg enc fs tdefs = @@ -478,13 +460,11 @@ let manifest_typ2typ ilg f (m : ILAssemblyManifest) = let morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg ((ftype: ILModuleDef -> (ILTypeDef list * ILTypeDef) option -> ILMethodDef option -> ILType -> ILType), - (filmbody: ILModuleDef -> ILTypeDef list * ILTypeDef -> ILMethodDef option -> ILMethodBody -> ILMethodBody), fmdefs) m = let ftdefs = tdefs_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg [] (ftype m, - filmbody m, fmdefs m) { m with TypeDefs=ftdefs m.TypeDefs; @@ -493,13 +473,9 @@ let morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg let module_bblock2code_typ2typ_maxstack2maxstack ilg fs x = let (fbblock,ftype,fmaxstack) = fs - let filmbody modCtxt tdefCtxt mdefCtxt = - ilmbody_bblock2code_typ2typ_maxstack2maxstack - (fbblock modCtxt tdefCtxt mdefCtxt, - ftype modCtxt (Some tdefCtxt) mdefCtxt, - fmaxstack modCtxt tdefCtxt mdefCtxt) + let filmbody modCtxt tdefCtxt mdefCtxt = ilmbody_bblock2code_typ2typ_maxstack2maxstack (fbblock modCtxt tdefCtxt mdefCtxt, ftype modCtxt (Some tdefCtxt) mdefCtxt, fmaxstack modCtxt tdefCtxt mdefCtxt) let fmdefs modCtxt tdefCtxt = mdefs_typ2typ_ilmbody2ilmbody ilg (ftype modCtxt (Some tdefCtxt), filmbody modCtxt tdefCtxt) - morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg (ftype, filmbody, fmdefs) x + morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg (ftype, fmdefs) x let module_bblock2code_typ2typ ilg (f1,f2) x = module_bblock2code_typ2typ_maxstack2maxstack ilg (f1, f2, (fun _modCtxt _tdefCtxt _mdefCtxt x -> x)) x diff --git a/src/absil/ilmorph.fsi b/src/absil/ilmorph.fsi index 2753040c20a..8c387883e99 100644 --- a/src/absil/ilmorph.fsi +++ b/src/absil/ilmorph.fsi @@ -34,7 +34,6 @@ val morphILTypeRefsInILModuleMemoized: ILGlobals -> ILTypeRef morph -> ILModul val morphILScopeRefsInILModuleMemoized: ILGlobals -> ILScopeRef morph -> ILModuleDef -> ILModuleDef val morphILMethodBody: ILMethodBody morph -> ILLazyMethodBody -> ILLazyMethodBody -val morphIlxClosureInfo: ILMethodBody morph -> IlxClosureInfo -> IlxClosureInfo val morphILInstrsInILCode: (ILInstr -> ILInstr list) -> ILCode -> ILCode [] diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 2c7843b04b1..86c13094cd7 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -985,30 +985,10 @@ let rec goutput_tdef (enc) env contents os cd = goutput_fdefs tref env os cd.Fields; goutput_pdefs env os cd.Properties; else - let isclo = - match cd.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure _ -> true - | _ -> false - | _ -> false - let isclassunion = - match cd.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Union _ -> true - | _ -> false - | _ -> false - if not (isclo || isclassunion) || contents then output_string os "\n"; match cd.tdKind with | ILTypeDefKind.Class | ILTypeDefKind.Enum | ILTypeDefKind.Delegate | ILTypeDefKind.ValueType -> output_string os ".class " | ILTypeDefKind.Interface -> output_string os ".class interface " - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure _ -> output_string os ".closure " - | IlxTypeDefKind.Union _ -> output_string os ".classunion " - | ILTypeDefKind.Other _ -> failwith "unknown extension" output_init_semantics os cd.InitSemantics; output_string os " "; output_type_access os cd.Access; @@ -1024,17 +1004,8 @@ let rec goutput_tdef (enc) env contents os cd = output_sqstring os cd.Name ; goutput_gparams env os cd.GenericParams; output_string os "\n\t"; - if isclo then - match cd.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure _cloinfo -> - () //goutput_freevars env os cloinfo.cloFreeVars - | _ -> () - | _ -> () - else - goutput_superclass env os cd.Extends; - output_string os "\n\t"; + goutput_superclass env os cd.Extends; + output_string os "\n\t"; goutput_implements env os cd.Implements; output_string os "\n{\n "; if contents then @@ -1044,19 +1015,6 @@ let rec goutput_tdef (enc) env contents os cd = pp_layout_decls os (); goutput_fdefs tref env os cd.Fields; goutput_mdefs env os cd.Methods; - match cd.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure x -> - output_string os "\n.apply "; - (goutput_lambdas env) os x.cloStructure; - output_string os "\n { "; - (goutput_ilmbody env) os (Lazy.force x.cloCode); - output_string os "}\n"; - | IlxTypeDefKind.Union x -> - Array.iter (fun x -> output_string os " .alternative "; - goutput_alternative_ref env os x) x.cudAlternatives; - | _ -> () goutput_tdefs contents (enc@[cd.Name]) env os cd.NestedTypes; output_string os "\n}"; diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index faadf72edc2..684b1f32db3 100644 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -1680,7 +1680,6 @@ let typeAttrbutesOfTypeDefKind x = | ILTypeDefKind.Interface -> TypeAttributes.Interface | ILTypeDefKind.Enum -> TypeAttributes.Class | ILTypeDefKind.Delegate -> TypeAttributes.Class - | ILTypeDefKind.Other _xtdk -> failwith "typeAttributes of other external" let typeAttrbutesOfTypeAccess x = match x with diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index 35d17855b00..9f5cc1f35fb 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -172,15 +172,6 @@ and IlxUnionInfo = /// debug info for generated code for classunions cudWhere: ILSourceMarker option; } -type IlxTypeDefKind = - | Closure of IlxClosureInfo - | Union of IlxUnionInfo - -let (mkIlxExtTypeDefKind,isIlxExtTypeDefKind,destIlxExtTypeDefKind) = - (RegisterTypeDefKindExtension TypeDefKindExtension : (IlxTypeDefKind -> IlxExtensionTypeKind) * (IlxExtensionTypeKind -> bool) * (IlxExtensionTypeKind -> IlxTypeDefKind) ) - -let mkIlxTypeDefKind i = ILTypeDefKind.Other (mkIlxExtTypeDefKind i) - // -------------------------------------------------------------------- // Define these as extensions of the IL types // -------------------------------------------------------------------- diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index eaccf733fc5..93522ff8e16 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -126,16 +126,6 @@ and IlxUnionInfo = cudWhere: ILSourceMarker option; } -type IlxTypeDefKind = - | Closure of IlxClosureInfo - | Union of IlxUnionInfo - -val mkIlxExtTypeDefKind: (IlxTypeDefKind -> IlxExtensionTypeKind) -val isIlxExtTypeDefKind: (IlxExtensionTypeKind -> bool) -val destIlxExtTypeDefKind: (IlxExtensionTypeKind -> IlxTypeDefKind) - -val mkIlxTypeDefKind: IlxTypeDefKind -> ILTypeDefKind - // -------------------------------------------------------------------- // MS-ILX constructs: Closures, thunks, classunions // -------------------------------------------------------------------- diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 6acff89e885..a4af0b385fe 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1076,7 +1076,7 @@ let MergePropertyDefs m ilPropertyDefs = //-------------------------------------------------------------------------- /// Information collected imperatively for each type definition -type TypeDefBuilder(tdef) = +type TypeDefBuilder(tdef, tdefDiscards) = let gmethods = new ResizeArray(0) let gfields = new ResizeArray(0) let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) @@ -1094,13 +1094,25 @@ type TypeDefBuilder(tdef) = member b.AddEventDef(edef) = gevents.Add edef member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef - member b.AddMethodDef(ilMethodDef) = gmethods.Add ilMethodDef + member b.AddMethodDef(ilMethodDef) = + let discard = + match tdefDiscards with + | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef + | None -> false + if not discard then + gmethods.Add ilMethodDef member b.NestedTypeDefs = gnested member b.GetCurrentFields() = gfields |> Seq.readonly /// Merge Get and Set property nodes, which we generate independently for F# code /// when we come across their corresponding methods. - member b.AddOrMergePropertyDef(pdef,m) = AddPropertyDefToHash m gproperties pdef + member b.AddOrMergePropertyDef(pdef,m) = + let discard = + match tdefDiscards with + | Some (_, pdefDiscard) -> pdefDiscard pdef + | None -> false + if not discard then + AddPropertyDefToHash m gproperties pdef member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = match ResizeArray.tryFindIndex cond gmethods with @@ -1138,9 +1150,9 @@ and TypeDefsBuilder() = member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) - member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd) = + member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count - tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef), eliminateIfEmpty))) + tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) /// Assembly generation buffers type AssemblyBuilder(cenv:cenv) as mgbuf = @@ -1157,7 +1169,7 @@ type AssemblyBuilder(cenv:cenv) as mgbuf = let vtref = NestedTypeRefForCompLoc cloc vtdef.Name let vtspec = mkILTySpec(vtref,[]) let vtdef = {vtdef with Access= ComputeTypeAccess vtref true} - mgbuf.AddTypeDef(vtref, vtdef, false, true); + mgbuf.AddTypeDef(vtref, vtdef, false, true, None); vtspec), keyComparer=HashIdentity.Structural) @@ -1189,8 +1201,8 @@ type AssemblyBuilder(cenv:cenv) as mgbuf = let cloc = CompLocForPrivateImplementationDetails cloc vtgenerator.Apply((cloc,size)) - member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd) = - gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd) + member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) member mgbuf.GetCurrentFields(tref:ILTypeRef) = gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields(); @@ -3450,9 +3462,10 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let attrs = GenAttrs cenv eenvinner cloAttribs let super = (if isInterfaceTy cenv.g baseType then cenv.g.ilg.typ_Object else ilCloRetTy) let interfaceTys = interfaceTys @ (if isInterfaceTy cenv.g baseType then [ilCloRetTy] else []) - let cloTypeDef = GenClosureTypeDef cenv (ilCloTypeRef,ilCloGenericFormals,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,mdefs,mimpls,super,interfaceTys) + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,ilCloGenericFormals,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,mdefs,mimpls,super,interfaceTys) - cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false); + for cloTypeDef in cloTypeDefs do + cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None); CountClosure(); GenGetLocalVals cenv cgbuf eenvouter m cloFreeVars; CG.EmitInstr cgbuf (pop ilCloFreeVars.Length) (Push [ EraseClosures.mkTyOfLambdas cenv.g.ilxPubCloEnv ilCloLambdas]) (I_newobj (ilxCloSpec.Constructor,None)); @@ -3533,8 +3546,9 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V mkILSimpleStorageCtor(None, Some ilCloBaseTy.TypeSpec, ilCloTyInner, [], ILMemberAccess.Assembly).MethodBody let attrs = GenAttrs cenv eenvinner cloAttribs - let clo = GenClosureTypeDef cenv (ilCloTypeRef,ilCloGenericParams,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[generateNextMethod;closeMethod;checkCloseMethod;lastGeneratedMethod;getFreshMethod],[],ilCloBaseTy,[]) - cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, clo, false, false); + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,ilCloGenericParams,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[generateNextMethod;closeMethod;checkCloseMethod;lastGeneratedMethod;getFreshMethod],[],ilCloBaseTy,[]) + for cloTypeDef in cloTypeDefs do + cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None); CountClosure(); for fv in cloFreeVars do @@ -3550,8 +3564,15 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V /// Generate the class for a closure type definition -and GenClosureTypeDef cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls,ext, ilIntfTys) = +and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, ilCloLambdas, ilCtorBody, mdefs, mimpls,ext, ilIntfTys) = + let cloInfo = + { cloSource=None + cloFreeVars=ilCloFreeVars + cloStructure=ilCloLambdas + cloCode=notlazy ilCtorBody } + + let td = { Name = tref.Name; Layout = ILTypeDefLayout.Auto; Access = ComputeTypeAccess tref true; @@ -3561,10 +3582,7 @@ and GenClosureTypeDef cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, i InitSemantics=ILTypeInit.BeforeField; IsSealed=true; IsAbstract=false; - tdKind=mkIlxTypeDefKind (IlxTypeDefKind.Closure { cloSource=None; - cloFreeVars=ilCloFreeVars; - cloStructure=ilCloLambdas; - cloCode=notlazy ilCtorBody }); + tdKind=ILTypeDefKind.Class; Events= emptyILEvents; Properties = emptyILProperties; Methods= mkILMethods mdefs; @@ -3579,6 +3597,8 @@ and GenClosureTypeDef cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, i SecurityDecls= emptyILSecurityDecls; HasSecurity=false; } + let tdefs = EraseClosures.convIlxClosureDef cenv.g.ilxPubCloEnv tref.Enclosing td cloInfo + tdefs and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) and GenGenericArgs m (tyenv:TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c,m])) @@ -3597,7 +3617,7 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr | _ -> [] let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,entryPointInfo,cloinfo.cloName,eenvinner,1,0,body,Return) let ilCloTypeRef = cloinfo.cloSpec.TypeRef - let clo = + let cloTypeDefs = if isLocalTypeFunc then // Work out the contract type and generate a class with an abstract method for this type @@ -3632,17 +3652,18 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr Extends= Some cenv.g.ilg.typ_Object; SecurityDecls= emptyILSecurityDecls; HasSecurity=false; } - cgbuf.mgbuf.AddTypeDef(ilContractTypeRef, ilContractTypeDef, false, false); + cgbuf.mgbuf.AddTypeDef(ilContractTypeRef, ilContractTypeDef, false, false, None); let ilCtorBody = mkILMethodBody (true,emptyILLocals,8,nonBranchingInstrsToCode (mkCallBaseConstructor(ilContractTy,[])), None ) let cloMethods = [ mkILGenericVirtualMethod("DirectInvoke",ILMemberAccess.Assembly,cloinfo.localTypeFuncDirectILGenericParams,[],mkILReturn (cloinfo.cloILFormalRetTy), MethodBody.IL ilCloBody) ] - let cloTypeDef = GenClosureTypeDef cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCtorBody,cloMethods,[],ilContractTy,[]) - cloTypeDef + let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCtorBody,cloMethods,[],ilContractTy,[]) + cloTypeDefs else - GenClosureTypeDef cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCloBody,[],[],cenv.g.ilg.typ_Object,[]) + GenClosureTypeDefs cenv (ilCloTypeRef,cloinfo.cloILGenericParams,[],cloinfo.cloILFreeVars,cloinfo.ilCloLambdas,ilCloBody,[],[],cenv.g.ilg.typ_Object,[]) CountClosure(); - cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, clo, false, false); + for cloTypeDef in cloTypeDefs do + cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None); cloinfo,m | _ -> failwith "GenLambda: not a lambda" @@ -3976,8 +3997,9 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega let ilCloLambdas = Lambdas_return ilCtxtDelTy let ilAttribs = GenAttrs cenv eenvinner cloAttribs - let clo = GenClosureTypeDef cenv (ilDelegeeTypeRef,ilDelegeeGenericParams,ilAttribs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[delegeeInvokeMeth],[],cenv.g.ilg.typ_Object,[]) - cgbuf.mgbuf.AddTypeDef(ilDelegeeTypeRef, clo, false, false); + let cloTypeDefs = GenClosureTypeDefs cenv (ilDelegeeTypeRef,ilDelegeeGenericParams,ilAttribs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[delegeeInvokeMeth],[],cenv.g.ilg.typ_Object,[]) + for cloTypeDef in cloTypeDefs do + cgbuf.mgbuf.AddTypeDef(ilDelegeeTypeRef, cloTypeDef, false, false, None); CountClosure(); let ctxtGenericArgsForDelegee = GenGenericArgs m eenvouter.tyenv cloFreeTyvars @@ -5630,7 +5652,7 @@ and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attr else [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Module)])), initTrigger) let tdef = { tdef with IsSealed=true; IsAbstract=true } - mgbuf.AddTypeDef(tref, tdef, eliminateIfEmpty, addAtEnd) + mgbuf.AddTypeDef(tref, tdef, eliminateIfEmpty, addAtEnd, None) and GenModuleExpr cenv cgbuf qname lazyInitInfo eenv x = @@ -5969,8 +5991,8 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TProvidedTypeExtensionPoint _ -> () #endif | TNoRepr -> () - | TAsmRepr _ | TILObjModelRepr _ | TMeasureableRepr _ -> () - | TFsObjModelRepr _ | TRecdRepr _ | TFiniteUnionRepr _ -> + | TAsmRepr _ | TILObjectRepr _ | TMeasureableRepr _ -> () + | TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> let eenvinner = ReplaceTyenv (TypeReprEnv.ForTycon tycon) eenv let thisTy = generalizedTyconRef tcref @@ -5984,16 +6006,16 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let hiddenRepr = hidden || IsHiddenTyconRepr eenv.sigToImplRemapInfo tycon let access = ComputeTypeAccess tref hidden + // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals + // So we do it here. + // + // Note you only have to implement 'System.IComparable' to customize structural comparison AND equality on F# types + // See also FinalTypeDefinitionChecksAtEndOfInferenceScope in tc.fs + // + // Generate an Equals method implemented via IComparable if the type EXPLICITLY implements IComparable. + // HOWEVER, if the type doesn't override Object.Equals already. let augmentOverrideMethodDefs = - // The implicit augmentation doesn't actually create CompareTo(object) or Object.Equals - // So we do it here. - let specialCompareMethod = - // Note you only have to implement 'System.IComparable' to customize structural comparison AND equality on F# types - // See also FinalTypeDefinitionChecksAtEndOfInferenceScope in tc.fs - - // Generate an Equals method implemented via IComparable if the type EXPLICITLY implements IComparable. - // HOWEVER, if the type doesn't override Object.Equals already. (if isNone tycon.GeneratedCompareToValues && isNone tycon.GeneratedHashAndEqualsValues && tycon.HasInterface cenv.g cenv.g.mk_IComparable_ty && @@ -6003,11 +6025,6 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = [ GenEqualsOverrideCallingIComparable cenv (tcref,ilThisTy,ilThisTy) ] else []) - specialCompareMethod - // We can't reduce the accessibility because these implement virtual slots - (* |> List.map (fun md -> { md with Access=memberAccess }) *) - - // Generate the interface slots and abstract slots. let abstractMethodDefs,abstractPropDefs, abstractEventDefs = if tycon.IsFSharpDelegateTycon then @@ -6053,6 +6070,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | _ -> () ] + // Try to add a DefaultMemberAttribute for the 'Item' property let defaultMemberAttrs = // REVIEW: this should be based off tcaug_adhoc_list, which is in declaration order tycon.MembersOfFSharpTyconSorted @@ -6085,7 +6103,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield cenv.g.ilg.mkDebuggerDisplayAttribute ("{" + debugDisplayMethodName + "(),nq}") ] - let CustomAttrs = + let ilCustomAttrs = [ yield! defaultMemberAttrs yield! normalAttrs |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute >> not) @@ -6097,7 +6115,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let ilTypeDefKind = match tyconRepr with - | TFsObjModelRepr o -> + | TFSharpObjectRepr o -> match o.fsobjmodel_kind with | TTyconClass -> ILTypeDefKind.Class | TTyconStruct -> ILTypeDefKind.ValueType @@ -6320,7 +6338,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = if not isStructRecord && (isCLIMutable || (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_ComVisibleAttribute tycon.Attribs = Some true)) then yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.tspec_Object, ilThisTy, [], reprAccess) - | TFsObjModelRepr r when tycon.IsFSharpDelegateTycon -> + | TFSharpObjectRepr r when tycon.IsFSharpDelegateTycon -> // Build all the methods that go with a delegate type match r.fsobjmodel_kind with @@ -6346,24 +6364,24 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let ilEvents = mkILEvents abstractEventDefs let ilFields = mkILFields ilFieldDefs - let tdef = - let IsSerializable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_AutoSerializableAttribute tycon.Attribs <> Some(false)) + let tdef, tdefDiscards = + let isSerializable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_AutoSerializableAttribute tycon.Attribs <> Some(false)) && cenv.opts.netFxHasSerializableAttribute match tycon.TypeReprInfo with - | TILObjModelRepr (_,_,td) -> - {td with Access = access; - CustomAttrs = mkILCustomAttrs CustomAttrs; - GenericParams = ilGenParams; } + | TILObjectRepr (_,_,td) -> + {td with Access = access + CustomAttrs = mkILCustomAttrs ilCustomAttrs + GenericParams = ilGenParams }, None - | TRecdRepr _ | TFsObjModelRepr _ as tyconRepr -> + | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> let super = superOfTycon cenv.g tycon let ilBaseTy = GenType cenv.amap m cenv.g eenvinner.tyenv super // Build a basic type definition - let isObjectType = (match tyconRepr with TFsObjModelRepr _ -> true | _ -> false) + let isObjectType = (match tyconRepr with TFSharpObjectRepr _ -> true | _ -> false) let ilAttrs = - CustomAttrs @ + ilCustomAttrs @ [mkCompilationMappingAttr cenv.g (int (if isObjectType then SourceConstructFlags.ObjectType @@ -6395,7 +6413,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let isTheSealedAttribute = tyconRefEq cenv.g tcref cenv.g.attrib_SealedAttribute.TyconRef let tdef = { tdef with IsSealed = isSealedTy cenv.g thisTy || isTheSealedAttribute; - IsSerializable = IsSerializable; + IsSerializable = isSerializable; MethodImpls=mkILMethodImpls methodImpls; IsAbstract=isAbstract; IsComInterop=isComInteropTy cenv.g thisTy } @@ -6463,58 +6481,74 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let tdef = { tdef with tdKind = ilTypeDefKind; Layout=tdLayout; Encoding=tdEncoding } let tdef = match ilTypeDefKind with ILTypeDefKind.Interface -> { tdef with Extends = None; IsAbstract=true } | _ -> tdef - tdef + tdef, None - | TFiniteUnionRepr _ -> + | TUnionRepr _ -> let alternatives = tycon.UnionCasesArray |> Array.mapi (fun i ucspec -> { altName=ucspec.CompiledName; altFields=GenUnionCaseRef cenv.amap m cenv.g eenvinner.tyenv i ucspec.RecdFieldsArray; altCustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv ucspec.Attribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.UnionCase) i]) }) + let cuinfo = + { cudReprAccess=reprAccess; + cudNullPermitted=IsUnionTypeWithNullAsTrueValue cenv.g tycon; + cudHelpersAccess=reprAccess; + cudHasHelpers=ComputeUnionHasHelpers cenv.g tcref; + cudDebugProxies= generateDebugProxies; + cudDebugDisplayAttributes= ilDebugDisplayAttributes; + cudAlternatives= alternatives; + cudWhere = None}; + let tdef = + { Name = ilTypeName; + Layout = ILTypeDefLayout.Auto; + Access = access; + GenericParams = ilGenParams; + CustomAttrs = + mkILCustomAttrs (ilCustomAttrs @ + [mkCompilationMappingAttr cenv.g + (int (if hiddenRepr + then SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation + else SourceConstructFlags.SumType)) ]); + InitSemantics=ILTypeInit.BeforeField; + IsSealed=true; + IsAbstract=false; + tdKind= ILTypeDefKind.Class + Fields = ilFields; + Events= ilEvents; + Properties = ilProperties; + Methods= mkILMethods ilMethods; + MethodImpls= mkILMethodImpls methodImpls; + IsComInterop=false; + IsSerializable= isSerializable; + IsSpecialName= false; + NestedTypes=emptyILTypeDefs; + Encoding= ILDefaultPInvokeEncoding.Auto; + Implements= mkILTypes ilIntfTys; + Extends= Some cenv.g.ilg.typ_Object; + SecurityDecls= emptyILSecurityDecls; + HasSecurity=false } + let tdef2 = EraseUnions.mkClassUnionDef cenv.g.ilg tref tdef cuinfo + + // Discard the user-supplied (i.e. prim-type.fs) implementations of the get_Empty, get_IsEmpty, get_Value and get_None and Some methods. + // This is because we will replace their implementations by ones that load the unique + // private static field for lists etc. + // + // Also discard the F#-compiler supplied implementation of the Empty, IsEmpty, Value and None properties. + let tdefDiscards = + Some ((fun (md: ILMethodDef) -> + (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (md.Name = "get_Empty" || md.Name = "Cons" || md.Name = "get_IsEmpty")) || + (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))), + + (fun (pd: ILPropertyDef) -> + (cuinfo.cudHasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty" )) || + (cuinfo.cudHasHelpers = SpecialFSharpOptionHelpers && (pd.Name = "Value" || pd.Name = "None")))) - { Name = ilTypeName; - Layout = ILTypeDefLayout.Auto; - Access = access; - GenericParams = ilGenParams; - CustomAttrs = - mkILCustomAttrs (CustomAttrs @ - [mkCompilationMappingAttr cenv.g - (int (if hiddenRepr - then SourceConstructFlags.SumType ||| SourceConstructFlags.NonPublicRepresentation - else SourceConstructFlags.SumType)) ]); - InitSemantics=ILTypeInit.BeforeField; - IsSealed=true; - IsAbstract=false; - tdKind= - mkIlxTypeDefKind - (IlxTypeDefKind.Union - { cudReprAccess=reprAccess; - cudNullPermitted=IsUnionTypeWithNullAsTrueValue cenv.g tycon; - cudHelpersAccess=reprAccess; - cudHasHelpers=ComputeUnionHasHelpers cenv.g tcref; - cudDebugProxies= generateDebugProxies; - cudDebugDisplayAttributes= ilDebugDisplayAttributes; - cudAlternatives= alternatives; - cudWhere = None}); - Fields = ilFields; - Events= ilEvents; - Properties = ilProperties; - Methods= mkILMethods ilMethods; - MethodImpls= mkILMethodImpls methodImpls; - IsComInterop=false; - IsSerializable= IsSerializable; - IsSpecialName= false; - NestedTypes=emptyILTypeDefs; - Encoding= ILDefaultPInvokeEncoding.Auto; - Implements= mkILTypes ilIntfTys; - Extends= Some cenv.g.ilg.typ_Object; - SecurityDecls= emptyILSecurityDecls; - HasSecurity=false } + tdef2, tdefDiscards | _ -> failwith "??" let tdef = {tdef with SecurityDecls= secDecls; HasSecurity=securityAttrs.Length > 0} - mgbuf.AddTypeDef(tref, tdef, false, false); + mgbuf.AddTypeDef(tref, tdef, false, false, tdefDiscards); // If a non-generic type is written with "static let" and "static do" (i.e. it has a ".cctor") // then the code for the .cctor is placed into .cctor for the backing static class for the file. @@ -6637,7 +6671,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = mkILCustomAttrs [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Exception)], ILTypeInit.BeforeField) let tdef = { tdef with IsSerializable = cenv.opts.netFxHasSerializableAttribute } - mgbuf.AddTypeDef(tref, tdef, false, false) + mgbuf.AddTypeDef(tref, tdef, false, false, None) let CodegenAssembly cenv eenv mgbuf fileImpls = @@ -6722,16 +6756,6 @@ let GenerateCode (cenv, eenv, TAssembly fileImpls, assemAttribs, moduleAttribs) let defnsResourceBytes = defns |> QuotationPickler.PickleDefns -(* - let ilFieldName = CompilerGeneratedName ("field" + string(newUnique())) - let ilFieldTy = mkILArr1DTy cenv.g.ilg.typ_Type - let ilFieldDef = mkILStaticField (ilFieldName,ilFieldTy, None, None, ILMemberAccess.Assembly) - let ilFieldDef = { ilFieldDef with CustomAttrs = mkILCustomAttrs [ cenv.g.ilg.mkDebuggerBrowsableNeverAttribute() ] } - let fspec = mkILFieldSpecInTy (mkILTyForCompLoc (CompLocForPrivateImplementationDetails env.cloc),ilFieldName, ilFieldTy) - CountStaticFieldDef(); - cgbuf.mgbuf.AddFieldDef(fspec.EnclosingTypeRef,ilFieldDef); -*) - [ (referencedTypeDefs, defnsResourceBytes) ] let ilNetModuleAttrs = GenAttrs cenv eenv moduleAttribs diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index bd2902fcc3c..e71e23c1142 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -516,8 +516,6 @@ module private PrintIL = | m :: _ -> layoutILCallingSignature denv ilTyparSubst None m.CallingSignature | _ -> comment "`Invoke` method could not be found" wordL "delegate" ^^ wordL "of" ^^ rhs - - | ILTypeDefKind.Other _ -> comment "cannot show type" and layoutILNestedClassDef (denv: DisplayEnv) (typeDef : ILTypeDef) = let name = adjustILName typeDef.Name @@ -1383,11 +1381,11 @@ module private TastDefinitionPrinting = /// When repn is class or datatype constructors (not single one). let breakTypeDefnEqn repr = match repr with - | TFsObjModelRepr _ -> true - | TFiniteUnionRepr r -> r.CasesTable.UnionCasesAsList.Length > 1 + | TFSharpObjectRepr _ -> true + | TUnionRepr r -> r.CasesTable.UnionCasesAsList.Length > 1 | TRecdRepr _ -> true | TAsmRepr _ - | TILObjModelRepr _ + | TILObjectRepr _ | TMeasureableRepr _ #if EXTENSIONTYPING | TProvidedTypeExtensionPoint _ @@ -1594,7 +1592,7 @@ module private TastDefinitionPrinting = let adhoc = adhoc |> List.sortBy sortKey let iimpls = match tycon.TypeReprInfo with - | TFsObjModelRepr r when (match r.fsobjmodel_kind with TTyconInterface -> true | _ -> false) -> [] + | TFSharpObjectRepr r when (match r.fsobjmodel_kind with TTyconInterface -> true | _ -> false) -> [] | _ -> tycon.ImmediateInterfacesOfFSharpTycon let iimpls = iimpls |> List.filter (fun (_,compgen,_) -> not compgen) // if TTyconInterface, the iimpls should be printed as inherited interfaces @@ -1613,11 +1611,11 @@ module private TastDefinitionPrinting = let repr = tycon.TypeReprInfo match repr with | TRecdRepr _ - | TFiniteUnionRepr _ - | TFsObjModelRepr _ + | TUnionRepr _ + | TFSharpObjectRepr _ | TAsmRepr _ | TMeasureableRepr _ - | TILObjModelRepr _ -> + | TILObjectRepr _ -> let brk = nonNil memberLs || breakTypeDefnEqn repr let rhsL = let addReprAccessL l = layoutAccessibility denv tycon.TypeReprAccessibility l @@ -1628,7 +1626,7 @@ module private TastDefinitionPrinting = let recdL = tycon.TrueFieldsAsList |> List.map recdFieldRefL |> applyMaxMembers denv.maxMembers |> aboveListL |> braceL Some (addMembersAsWithEnd (addReprAccessL recdL)) - | TFsObjModelRepr r -> + | TFSharpObjectRepr r -> match r.fsobjmodel_kind with | TTyconDelegate (TSlotSig(_,_, _,_,paraml, rty)) -> let rty = GetFSharpViewOfReturnType denv.g rty @@ -1675,18 +1673,18 @@ module private TastDefinitionPrinting = let declsL = aboveListL alldecls let declsL = match start with Some s -> (wordL s @@-- declsL) @@ wordL "end" | None -> declsL Some declsL - | TFiniteUnionRepr _ -> + | TUnionRepr _ -> let layoutUnionCases = tycon.UnionCasesAsList |> layoutUnionCases denv |> applyMaxMembers denv.maxMembers |> aboveListL Some (addMembersAsWithEnd (addReprAccessL layoutUnionCases)) | TAsmRepr _ -> Some (wordL "(# \"\" #)") | TMeasureableRepr ty -> Some (layoutType denv ty) - | TILObjModelRepr (_,_,td) -> + | TILObjectRepr (_,_,td) -> Some (PrintIL.layoutILTypeDef denv td) | _ -> None - let brk = match tycon.TypeReprInfo with | TILObjModelRepr _ -> true | _ -> brk + let brk = match tycon.TypeReprInfo with | TILObjectRepr _ -> true | _ -> brk match rhsL with | None -> lhsL | Some rhsL -> diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index bfb70df80cc..275ffbe2137 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1407,8 +1407,8 @@ let CheckEntityDefn cenv env (tycon:Entity) = end; - // Considers TFsObjModelRepr, TRecdRepr and TFiniteUnionRepr. - // [Review] are all cases covered: TILObjModelRepr,TAsmRepr. [Yes - these are FSharp.Core.dll only] + // Considers TFSharpObjectRepr, TRecdRepr and TUnionRepr. + // [Review] are all cases covered: TILObjectRepr,TAsmRepr. [Yes - these are FSharp.Core.dll only] tycon.AllFieldsArray |> Array.iter (CheckRecdField false cenv env tycon); abstractSlotValsOfTycons [tycon] |> List.iter (typeOfVal >> CheckTypePermitByrefs cenv env m); (* check vslots = abstract slots *) tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.iter (CheckTypePermitByrefs cenv env m); (* check implemented interface types *) @@ -1427,7 +1427,7 @@ let CheckEntityDefn cenv env (tycon:Entity) = //implements_of_tycon cenv.g tycon |> List.iter visitType if tycon.IsFSharpDelegateTycon then match tycon.TypeReprInfo with - | TFsObjModelRepr r -> + | TFSharpObjectRepr r -> match r.fsobjmodel_kind with | TTyconDelegate ss -> //ss.ClassTypars diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index 28db41d7146..3d8a863faa5 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -442,14 +442,14 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = match implTypeRepr,sigTypeRepr with | (TRecdRepr _ - | TFiniteUnionRepr _ - | TILObjModelRepr _ + | TUnionRepr _ + | TILObjectRepr _ #if EXTENSIONTYPING | TProvidedTypeExtensionPoint _ | TProvidedNamespaceExtensionPoint _ #endif ), TNoRepr -> true - | (TFsObjModelRepr r), TNoRepr -> + | (TFSharpObjectRepr r), TNoRepr -> match r.fsobjmodel_kind with | TTyconStruct | TTyconEnum -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplDefinesStruct); false) @@ -459,7 +459,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden); false) | (TMeasureableRepr _), TNoRepr -> (errorR (err FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypeIsHidden); false) - | (TFiniteUnionRepr r1), (TFiniteUnionRepr r2) -> + | (TUnionRepr r1), (TUnionRepr r2) -> let ucases1 = r1.UnionCasesAsList let ucases2 = r2.UnionCasesAsList if ucases1.Length <> ucases2.Length then @@ -468,7 +468,7 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = else List.forall2 (checkUnionCase aenv) ucases1 ucases2 | (TRecdRepr implFields), (TRecdRepr sigFields) -> checkRecordFields g amap denv err aenv implFields sigFields - | (TFsObjModelRepr r1), (TFsObjModelRepr r2) -> + | (TFSharpObjectRepr r1), (TFSharpObjectRepr r2) -> if not (match r1.fsobjmodel_kind,r2.fsobjmodel_kind with | TTyconClass,TTyconClass -> true | TTyconInterface,TTyconInterface -> true diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index b3720c57d7d..d82e0671bf7 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3126,7 +3126,7 @@ module DebugPrint = begin |> List.filter (fun v -> isNil (Option.get v.MemberInfo).ImplementedSlotSigs) let iimpls = match tycon.TypeReprInfo with - | TFsObjModelRepr r when (match r.fsobjmodel_kind with TTyconInterface -> true | _ -> false) -> [] + | TFSharpObjectRepr r when (match r.fsobjmodel_kind with TTyconInterface -> true | _ -> false) -> [] | _ -> tycon.ImmediateInterfacesOfFSharpTycon let iimpls = iimpls |> List.filter (fun (_,compgen,_) -> not compgen) // if TTyconInterface, the iimpls should be printed as inheritted interfaces @@ -3158,7 +3158,7 @@ module DebugPrint = begin match repr with | TRecdRepr _ -> tycon.TrueFieldsAsList |> List.map (fun fld -> layoutRecdField fld ^^ rightL ";") |> aboveListL - | TFsObjModelRepr r -> + | TFSharpObjectRepr r -> match r.fsobjmodel_kind with | TTyconDelegate _ -> wordL "delegate ..." @@ -3186,10 +3186,10 @@ module DebugPrint = begin let alldecls = inherits @ vsprs @ vals let emptyMeasure = match tycon.TypeOrMeasureKind with TyparKind.Measure -> isNil alldecls | _ -> false if emptyMeasure then emptyL else (wordL start @@-- aboveListL alldecls) @@ wordL "end" - | TFiniteUnionRepr _ -> tycon.UnionCasesAsList |> layoutUnionCases |> aboveListL + | TUnionRepr _ -> tycon.UnionCasesAsList |> layoutUnionCases |> aboveListL | TAsmRepr _ -> wordL "(# ... #)" | TMeasureableRepr ty -> typeL ty - | TILObjModelRepr (_,_,td) -> wordL td.Name + | TILObjectRepr (_,_,td) -> wordL td.Name | _ -> failwith "unreachable" let reprL = match tycon.TypeReprInfo with @@ -3980,7 +3980,7 @@ and accLocalTyconRepr opts b fvs = else { fvs with FreeLocalTyconReprs = Zset.add b fvs.FreeLocalTyconReprs } and accUsedRecdOrUnionTyconRepr opts (tc:Tycon) fvs = - if match tc.TypeReprInfo with TFsObjModelRepr _ | TRecdRepr _ | TFiniteUnionRepr _ -> true | _ -> false + if match tc.TypeReprInfo with TFSharpObjectRepr _ | TRecdRepr _ | TUnionRepr _ -> true | _ -> false then accLocalTyconRepr opts tc fvs else fvs @@ -4712,10 +4712,10 @@ and remapFsObjData g tmenv x = and remapTyconRepr g tmenv repr = match repr with - | TFsObjModelRepr x -> TFsObjModelRepr (remapFsObjData g tmenv x) + | TFSharpObjectRepr x -> TFSharpObjectRepr (remapFsObjData g tmenv x) | TRecdRepr x -> TRecdRepr (remapRecdFields g tmenv x) - | TFiniteUnionRepr x -> TFiniteUnionRepr (remapUnionCases g tmenv x) - | TILObjModelRepr _ -> failwith "cannot remap IL type definitions" + | TUnionRepr x -> TUnionRepr (remapUnionCases g tmenv x) + | TILObjectRepr _ -> failwith "cannot remap IL type definitions" #if EXTENSIONTYPING | TProvidedNamespaceExtensionPoint _ -> repr | TProvidedTypeExtensionPoint info -> diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 57d5badbdf1..2b68fbb7c57 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -1671,9 +1671,9 @@ and p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. match x with | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false - | TFiniteUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false + | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false - | TFsObjModelRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false + | TFSharpObjectRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_typ ty st; false | TNoRepr -> p_byte 0 st; false #if EXTENSIONTYPING @@ -1686,7 +1686,7 @@ and p_tycon_repr x st = p_byte 1 st; p_byte 2 st; p_ILType (mkILBoxedType(ILTypeSpec.Create(ExtensionTyping.GetILTypeRefOfProvidedType(info.ProvidedType ,range0),emptyILGenericArgs))) st; true | TProvidedNamespaceExtensionPoint _ -> p_byte 0 st; false #endif - | TILObjModelRepr (_,_,td) -> error (Failure("Unexpected IL type definition"+td.Name)) + | TILObjectRepr (_,_,td) -> error (Failure("Unexpected IL type definition"+td.Name)) and p_tycon_objmodel_data x st = p_tup3 p_tycon_objmodel_kind (p_vrefs "vslots") p_rfield_table @@ -1897,7 +1897,7 @@ and u_tycon_repr st = | h::t -> let nestedTypeDef = tdefs.FindByName h find (tdefs.FindByName h :: acc) t nestedTypeDef.NestedTypes let nestedILTypeDefs,ilTypeDef = find [] iltref.Enclosing iILModule.TypeDefs - TILObjModelRepr(st.iilscope,nestedILTypeDefs,ilTypeDef) + TILObjectRepr(st.iilscope,nestedILTypeDefs,ilTypeDef) with _ -> System.Diagnostics.Debug.Assert(false, sprintf "failed to find IL backing metadata for cross-assembly generated type %s" iltref.FullName) TNoRepr @@ -1905,7 +1905,7 @@ and u_tycon_repr st = TAsmRepr v) | 3 -> let v = u_tycon_objmodel_data st - (fun _flagBit -> TFsObjModelRepr v) + (fun _flagBit -> TFSharpObjectRepr v) | 4 -> let v = u_typ st (fun _flagBit -> TMeasureableRepr v) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 1657e328656..5df8b030df1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -11779,7 +11779,7 @@ module IncrClassChecking = begin let recdFields = MakeRecdFieldsTable (rfspecs @ tcref.AllFieldsAsList) // Mutate the entity_tycon_repr to publish the fields - tcref.Deref.Data.entity_tycon_repr <- TFsObjModelRepr { tcref.FSharpObjectModelTypeInfo with fsobjmodel_rfields = recdFields} + tcref.Deref.Data.entity_tycon_repr <- TFSharpObjectRepr { tcref.FSharpObjectModelTypeInfo with fsobjmodel_rfields = recdFields} /// Given localRep saying how locals have been represented, e.g. as fields. @@ -13712,9 +13712,9 @@ module EstablishTypeDefinitionCores = begin if not inSig && not hasMeasureAttr then errorR(Error(FSComp.SR.tcTypeRequiresDefinition(),m)) if hasMeasureAttr then - TFsObjModelRepr { fsobjmodel_kind=TTyconClass - fsobjmodel_vslots=[] - fsobjmodel_rfields=MakeRecdFieldsTable [] } + TFSharpObjectRepr { fsobjmodel_kind=TTyconClass + fsobjmodel_vslots=[] + fsobjmodel_rfields=MakeRecdFieldsTable [] } else TNoRepr @@ -13758,14 +13758,14 @@ module EstablishTypeDefinitionCores = begin let repr = { fsobjmodel_kind=kind fsobjmodel_vslots=[] fsobjmodel_rfields=MakeRecdFieldsTable [] } - TFsObjModelRepr repr + TFSharpObjectRepr repr | SynTypeDefnSimpleRepr.Enum _ -> let kind = TTyconEnum let repr = { fsobjmodel_kind=kind fsobjmodel_vslots=[] fsobjmodel_rfields=MakeRecdFieldsTable [] } - TFsObjModelRepr repr + TFSharpObjectRepr repr // OK, now fill in the (partially computed) type representation tycon.Data.entity_tycon_repr <- repr @@ -14239,9 +14239,9 @@ module EstablishTypeDefinitionCores = begin hiddenReprChecks(false) noAllowNullLiteralAttributeCheck() if hasMeasureAttr then - let repr = TFsObjModelRepr { fsobjmodel_kind=TTyconClass - fsobjmodel_vslots=[] - fsobjmodel_rfields= MakeRecdFieldsTable [] } + let repr = TFSharpObjectRepr { fsobjmodel_kind=TTyconClass + fsobjmodel_vslots=[] + fsobjmodel_rfields= MakeRecdFieldsTable [] } repr, None, NoSafeInitInfo else TNoRepr, None, NoSafeInitInfo @@ -14424,7 +14424,7 @@ module EstablishTypeDefinitionCores = begin let safeInitFields = match safeInitInfo with SafeInitField (_, fld) -> [fld] | NoSafeInitInfo -> [] let repr = - TFsObjModelRepr + TFSharpObjectRepr { fsobjmodel_kind=kind fsobjmodel_vslots= abstractSlots fsobjmodel_rfields=MakeRecdFieldsTable (userFields @ implicitStructFields @ safeInitFields) } @@ -14444,7 +14444,7 @@ module EstablishTypeDefinitionCores = begin writeFakeRecordFieldsToSink fields' let repr = - TFsObjModelRepr + TFSharpObjectRepr { fsobjmodel_kind=kind fsobjmodel_vslots=[] fsobjmodel_rfields= MakeRecdFieldsTable (vfld :: fields') } diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 8fa79433de0..962181713ab 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -681,7 +681,7 @@ type Entity = /// static fields, 'val' declarations and hidden fields from the compilation of implicit class constructions. member x.AllFieldTable = match x.TypeReprInfo with - | TRecdRepr x | TFsObjModelRepr {fsobjmodel_rfields=x} -> x + | TRecdRepr x | TFSharpObjectRepr {fsobjmodel_rfields=x} -> x | _ -> match x.ExceptionInfo with | TExnFresh x -> x @@ -717,12 +717,12 @@ type Entity = member x.GetFieldByName n = x.AllFieldTable.FieldByName n /// Indicate if this is a type whose r.h.s. is known to be a union type definition. - member x.IsUnionTycon = match x.TypeReprInfo with | TFiniteUnionRepr _ -> true | _ -> false + member x.IsUnionTycon = match x.TypeReprInfo with | TUnionRepr _ -> true | _ -> false /// Get the union cases and other union-type information for a type, if any member x.UnionTypeInfo = match x.TypeReprInfo with - | TFiniteUnionRepr x -> Some x + | TUnionRepr x -> Some x | _ -> None /// Get the union cases for a type, if any @@ -759,15 +759,15 @@ type Entity = /// Get the blob of information associated with an F# object-model type definition, i.e. class, interface, struct etc. member x.FSharpObjectModelTypeInfo = match x.TypeReprInfo with - | TFsObjModelRepr x -> x + | TFSharpObjectRepr x -> x | _ -> assert false; failwith "not an F# object model type definition" /// Indicate if this is a type definition backed by Abstract IL metadata. - member x.IsILTycon = match x.TypeReprInfo with | TILObjModelRepr _ -> true | _ -> false + member x.IsILTycon = match x.TypeReprInfo with | TILObjectRepr _ -> true | _ -> false /// Get the Abstract IL scope, nesting and metadata for this /// type definition, assuming it is backed by Abstract IL metadata. - member x.ILTyconInfo = match x.TypeReprInfo with | TILObjModelRepr (a,b,c) -> (a,b,c) | _ -> assert false; failwith "not a .NET type definition" + member x.ILTyconInfo = match x.TypeReprInfo with | TILObjectRepr (a,b,c) -> (a,b,c) | _ -> assert false; failwith "not a .NET type definition" /// Get the Abstract IL metadata for this type definition, assuming it is backed by Abstract IL metadata. member x.ILTyconRawMetadata = let _,_,td = x.ILTyconInfo in td @@ -779,7 +779,7 @@ type Entity = member x.IsStructRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> x.Data.entity_flags.IsStructRecordType | _ -> false /// Indicates if this is an F# type definition whose r.h.s. is known to be some kind of F# object model definition - member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFsObjModelRepr _ -> true | _ -> false + member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFSharpObjectRepr _ -> true | _ -> false /// Indicates if this is an F# type definition which is one of the special types in FSharp.Core.dll which uses /// an assembly-code representation for the type, e.g. the primitive array type constructor. @@ -823,7 +823,7 @@ type Entity = member x.IsFSharpStructOrEnumTycon = match x.TypeReprInfo with | TRecdRepr _ -> x.IsStructRecordTycon - | TFsObjModelRepr info -> + | TFSharpObjectRepr info -> match info.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> false | TTyconStruct | TTyconEnum -> true @@ -938,7 +938,7 @@ type Entity = let boxity = if x.IsStructOrEnumTycon then AsValue else AsObject let ilTypeRef = match x.TypeReprInfo with - | TILObjModelRepr (ilScopeRef,ilEnclosingTypeDefs,ilTypeDef) -> IL.mkRefForNestedILTypeDef ilScopeRef (ilEnclosingTypeDefs, ilTypeDef) + | TILObjectRepr (ilScopeRef,ilEnclosingTypeDefs,ilTypeDef) -> IL.mkRefForNestedILTypeDef ilScopeRef (ilEnclosingTypeDefs, ilTypeDef) | _ -> ilTypeRefForCompilationPath x.CompilationPath x.CompiledName // Pre-allocate a ILType for monomorphic types, to reduce memory usage from Abstract IL nodes let ilTypeOpt = @@ -1125,18 +1125,18 @@ and TyconRepresentation = /// Indicates the type is a class, struct, enum, delegate or interface - | TFsObjModelRepr of TyconObjModelData + | TFSharpObjectRepr of TyconObjModelData /// Indicates the type is a record | TRecdRepr of TyconRecdFields /// Indicates the type is a discriminated union - | TFiniteUnionRepr of TyconUnionData + | TUnionRepr of TyconUnionData - /// TILObjModelRepr(scope, nesting, definition) + /// TILObjectRepr(scope, nesting, definition) /// /// Indicates the type is a type from a .NET assembly without F# metadata. - | TILObjModelRepr of ILScopeRef * ILTypeDef list * ILTypeDef + | TILObjectRepr of ILScopeRef * ILTypeDef list * ILTypeDef /// Indicates the type is implemented as IL assembly code using the given closed Abstract IL type | TAsmRepr of ILType @@ -4516,7 +4516,7 @@ let MakeUnionCases ucs : TyconUnionData = { CasesTable=MakeUnionCasesTable ucs CompiledRepresentation=newCache() } -let MakeUnionRepr ucs = TFiniteUnionRepr (MakeUnionCases ucs) +let MakeUnionRepr ucs = TUnionRepr (MakeUnionCases ucs) let NewTypar (kind,rigid,Typar(id,staticReq,isCompGen),isFromError,dynamicReq,attribs,eqDep,compDep) = Typar.New @@ -4619,7 +4619,7 @@ let NewILTycon nlpath (nm,m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = let hasSelfReferentialCtor = tdef.IsClass && (not scoref.IsAssemblyRef && scoref.AssemblyRef.Name = "mscorlib") let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, false, mtyp) - tycon.Data.entity_tycon_repr <- TILObjModelRepr (scoref,enc,tdef) + tycon.Data.entity_tycon_repr <- TILObjectRepr (scoref,enc,tdef) tycon.TypeContents.tcaug_closed <- true tycon diff --git a/src/fsharp/vs/ServiceDeclarations.fs b/src/fsharp/vs/ServiceDeclarations.fs index 13eff5bcb83..354a2577ce2 100644 --- a/src/fsharp/vs/ServiceDeclarations.fs +++ b/src/fsharp/vs/ServiceDeclarations.fs @@ -78,6 +78,7 @@ type FSharpToolTipText = | FSharpToolTipText of FSharpToolTipElement list +[] module internal ItemDescriptionsImpl = let isFunction g typ = @@ -1127,9 +1128,9 @@ module internal ItemDescriptionsImpl = let GlyphOfItem(denv,d) = /// Find the glyph for the given representation. - let ReprToGlyph(repr) = + let reprToGlyph repr = match repr with - | TFsObjModelRepr om -> + | TFSharpObjectRepr om -> match om.fsobjmodel_kind with | TTyconClass -> iIconGroupClass | TTyconInterface -> iIconGroupInterface @@ -1137,28 +1138,27 @@ module internal ItemDescriptionsImpl = | TTyconDelegate _ -> iIconGroupDelegate | TTyconEnum _ -> iIconGroupEnum | TRecdRepr _ -> iIconGroupType - | TFiniteUnionRepr _ -> iIconGroupUnion - | TILObjModelRepr(_,_,{tdKind=kind}) -> - match kind with + | TUnionRepr _ -> iIconGroupUnion + | TILObjectRepr(_,_,td) -> + match td.tdKind with | ILTypeDefKind.Class -> iIconGroupClass | ILTypeDefKind.ValueType -> iIconGroupStruct | ILTypeDefKind.Interface -> iIconGroupInterface | ILTypeDefKind.Enum -> iIconGroupEnum | ILTypeDefKind.Delegate -> iIconGroupDelegate - | ILTypeDefKind.Other _ -> iIconGroupTypedef | TAsmRepr _ -> iIconGroupTypedef - | TMeasureableRepr _-> iIconGroupTypedef // $$$$ TODO: glyph for units-of-measure + | TMeasureableRepr _-> iIconGroupTypedef #if EXTENSIONTYPING | TProvidedTypeExtensionPoint _-> iIconGroupTypedef | TProvidedNamespaceExtensionPoint _-> iIconGroupTypedef #endif - | TNoRepr -> iIconGroupClass // $$$$ TODO: glyph for abstract (no-representation) types + | TNoRepr -> iIconGroupClass /// Find the glyph for the given type representation. - let rec TypToGlyph(typ) = + let typeToGlyph typ = if isAppTy denv.g typ then let tcref = tcrefOfAppTy denv.g typ - tcref.TypeReprInfo |> ReprToGlyph + tcref.TypeReprInfo |> reprToGlyph elif isTupleTy denv.g typ then iIconGroupStruct elif isFunction denv.g typ then iIconGroupDelegate elif isTyparTy denv.g typ then iIconGroupStruct @@ -1166,19 +1166,19 @@ module internal ItemDescriptionsImpl = /// Find the glyph for the given value representation. - let ValueToGlyph(typ) = + let ValueToGlyph typ = if isFunction denv.g typ then iIconGroupMethod else iIconGroupConstant /// Find the major glyph of the given named item. - let NamedItemToMajorGlyph item = + let namedItemToMajorGlyph item = // This may explore assemblies that are not in the reference set, // e.g. for type abbreviations to types not in the reference set. // In this case just use iIconGroupClass. protectAssemblyExploration iIconGroupClass (fun () -> match item with | Item.Value(vref) | Item.CustomBuilder (_,vref) -> ValueToGlyph(vref.Type) - | Item.Types(_,typ::_) -> TypToGlyph(stripTyEqns denv.g typ) + | Item.Types(_,typ::_) -> typeToGlyph (stripTyEqns denv.g typ) | Item.UnionCase _ | Item.ActivePatternCase _ -> iIconGroupEnumMember | Item.ExnCase _ -> iIconGroupException @@ -1200,7 +1200,7 @@ module internal ItemDescriptionsImpl = | _ -> iIconGroupError) /// Find the minor glyph of the given named item. - let NamedItemToMinorGlyph item = + let namedItemToMinorGlyph item = // This may explore assemblies that are not in the reference set, // e.g. for type abbreviations to types not in the reference set. // In this case just use iIconItemNormal. @@ -1209,16 +1209,9 @@ module internal ItemDescriptionsImpl = | Item.Value(vref) when isFunction denv.g vref.Type -> iIconItemSpecial | _ -> iIconItemNormal) - (6 * NamedItemToMajorGlyph(d)) + NamedItemToMinorGlyph(d) + (6 * namedItemToMajorGlyph d) + namedItemToMinorGlyph d - let string_is_prefix_of m n = String.length n >= String.length m && String.sub n 0 (String.length m) = m - - - -open ItemDescriptionsImpl - - /// An intellisense declaration [] type FSharpDeclarationListItem(name, glyph:int, info) = diff --git a/src/fsharp/vs/Symbols.fs b/src/fsharp/vs/Symbols.fs index 195a1dc3217..dd901b5257e 100644 --- a/src/fsharp/vs/Symbols.fs +++ b/src/fsharp/vs/Symbols.fs @@ -370,7 +370,7 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) = member __.FSharpDelegateSignature = checkIsResolved() match entity.TypeReprInfo with - | TFsObjModelRepr r when entity.IsFSharpDelegateTycon -> + | TFSharpObjectRepr r when entity.IsFSharpDelegateTycon -> match r.fsobjmodel_kind with | TTyconDelegate ss -> FSharpDelegateSignature(cenv, ss) | _ -> invalidOp "not a delegate type" diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index 48075286ea0..3aeb8b8fcaf 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -315,6 +315,24 @@ let convMethodDef thisClo (md: ILMethodDef) = let b' = convMethodBody thisClo (md.mdBody.Contents) {md with mdBody=mkMethBodyAux b'} +// -------------------------------------------------------------------- +// Convert a class +// -------------------------------------------------------------------- + +let rec convTypeDef cenv encl td = + [ {td with + NestedTypes = convTypeDefs cenv (encl@[td.Name]) td.NestedTypes; + Methods=morphILMethodDefs (convMethodDef None) td.Methods; } ] + +and convTypeDefs cenv encl tdefs = + morphExpandILTypeDefs (convTypeDef cenv encl) tdefs + +let ConvModule ilg modul = + let cenv = newIlxPubCloEnv(ilg) + let newTypes = convTypeDefs cenv [] modul.TypeDefs + {modul with TypeDefs=newTypes} + + // -------------------------------------------------------------------- // Make fields for free variables of a type abstraction. // REVIEW: change type abstractions to use other closure mechanisms. @@ -346,8 +364,8 @@ let mkILCloFldDefs cenv flds = // it's a type abstraction or a term abstraction. // -------------------------------------------------------------------- -let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = - let newTypeDefs,newMethodDefs = +let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = + let newTypeDefs = // the following are shared between cases 1 && 2 let nowFields = clo.cloFreeVars @@ -427,7 +445,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = let laterCode = rewriteCodeToAccessArgsFromEnv laterCloSpec [(0, selfFreeVar)] let laterTypeDefs = - convIlxClosureDef cenv mdefGen encl + convIlxClosureDef cenv encl {td with GenericParams=laterGenericParams; Access=laterAccess; Name=laterTypeName} @@ -455,10 +473,10 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = tagApp) let nowTypeDefs = - convIlxClosureDef cenv mdefGen encl + convIlxClosureDef cenv encl td {clo with cloStructure=nowStruct; cloCode=notlazy nowCode} - nowTypeDefs @ laterTypeDefs, [] + nowTypeDefs @ laterTypeDefs else // CASE 1b. Build a type application. // Currently the sole mbody defines a class and uses @@ -504,7 +522,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = HasSecurity=false; SecurityDecls=emptyILSecurityDecls; tdKind = ILTypeDefKind.Class;} - [ cloTypeDef], [] + [ cloTypeDef] // CASE 2 - Term Application | [], (_ :: _ as nowParams),_ -> @@ -539,13 +557,13 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = end, tagApp) let nowTypeDefs = - convIlxClosureDef cenv mdefGen encl + convIlxClosureDef cenv encl td {clo with cloStructure=nowStruct; cloCode=notlazy nowCode} let laterCode = rewriteCodeToAccessArgsFromEnv laterCloSpec argToFreeVarMap let laterTypeDefs = - convIlxClosureDef cenv mdefGen encl + convIlxClosureDef cenv encl {td with GenericParams=laterGenericParams; Access=laterAccess; Name=laterTypeName} @@ -554,7 +572,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = cloCode=notlazy laterCode} // add 'compiler generated' to all the methods in the 'now' classes let laterTypeDefs = laterTypeDefs |> List.map (addMethodGeneratedAttrsToTypeDef cenv.ilg) - nowTypeDefs @ laterTypeDefs, [] + nowTypeDefs @ laterTypeDefs else // CASE 2b - Build an Term Application Apply method @@ -598,7 +616,7 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = HasSecurity=false; SecurityDecls=emptyILSecurityDecls; tdKind = ILTypeDefKind.Class; } - [cloTypeDef],[] + [cloTypeDef] | [],[ ],Lambdas_return _ -> // No code is being declared: just bake a (mutable) environment let cloCode' = @@ -632,34 +650,9 @@ let rec convIlxClosureDef cenv mdefGen encl (td: ILTypeDef) clo = Methods= mkILMethods (ctorMethodDef :: List.map (convMethodDef (Some nowCloSpec)) td.Methods.AsList); Fields= mkILFields (mkILCloFldDefs cenv nowFields @ td.Fields.AsList); tdKind = ILTypeDefKind.Class; } - [cloTypeDef],[] + [cloTypeDef] | a,b,_ -> failwith ("Unexpected unsupported abstraction sequence, #tyabs = "^string a.Length ^ ", #tmabs = "^string b.Length) - mdefGen := !mdefGen@newMethodDefs; newTypeDefs -// -------------------------------------------------------------------- -// Convert a class -// -------------------------------------------------------------------- - -let rec convTypeDef cenv mdefGen encl td = - match td.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e && (match destIlxExtTypeDefKind e with IlxTypeDefKind.Closure _ -> true | _ -> false) -> - match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure cloinfo -> convIlxClosureDef cenv mdefGen encl td cloinfo - | IlxTypeDefKind.Union _ -> failwith "classunions should have been erased by this time" - | _ -> - [ {td with - NestedTypes = convTypeDefs cenv mdefGen (encl@[td.Name]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef None) td.Methods; } ] - -and convTypeDefs cenv mdefGen encl tdefs = - morphExpandILTypeDefs (convTypeDef cenv mdefGen encl) tdefs - -let ConvModule ilg modul = - let cenv = newIlxPubCloEnv(ilg) - let mdefGen = ref [] - let newTypes = convTypeDefs cenv mdefGen [] modul.TypeDefs - {modul with TypeDefs=newTypes} - diff --git a/src/ilx/EraseClosures.fsi b/src/ilx/EraseClosures.fsi index dc4696bedf7..6c8ce53b3b6 100644 --- a/src/ilx/EraseClosures.fsi +++ b/src/ilx/EraseClosures.fsi @@ -17,3 +17,6 @@ val mkILFuncTy : cenv -> ILType -> ILType -> ILType val mkILTyFuncTy : cenv -> ILType val newIlxPubCloEnv : ILGlobals -> cenv val mkTyOfLambdas: cenv -> IlxClosureLambdas -> ILType + +val convIlxClosureDef : cenv -> encl: string list -> ILTypeDef -> IlxClosureInfo -> ILTypeDef list + diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index 4291e6b81ce..a6e184cde13 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -176,13 +176,13 @@ let cuspecRepr = type NoTypesGeneratedViaThisReprDecider = NoTypesGeneratedViaThisReprDecider let cudefRepr = UnionReprDecisions - ((fun (_enc,_td,cud) -> cud.cudAlternatives), - (fun (_enc,_td,cud) -> cud.cudNullPermitted), + ((fun (_td,cud) -> cud.cudAlternatives), + (fun (_td,cud) -> cud.cudNullPermitted), (fun (alt:IlxUnionAlternative) -> alt.IsNullary), - (fun (_enc,_td,cud) -> cud.cudHasHelpers = IlxUnionHasHelpers.SpecialFSharpListHelpers), + (fun (_td,cud) -> cud.cudHasHelpers = IlxUnionHasHelpers.SpecialFSharpListHelpers), (fun (alt:IlxUnionAlternative) -> alt.Name), - (fun (_enc,_td,_cud) -> NoTypesGeneratedViaThisReprDecider), - (fun ((_enc,_td,_cud),_nm) -> NoTypesGeneratedViaThisReprDecider)) + (fun (_td,_cud) -> NoTypesGeneratedViaThisReprDecider), + (fun ((_td,_cud),_nm) -> NoTypesGeneratedViaThisReprDecider)) let mkBasicBlock2 (a,b) = @@ -574,6 +574,20 @@ let convILMethodBody ilg il = let convMethodDef ilg md = {md with mdBody= morphILMethodBody (convILMethodBody ilg) md.mdBody } +let rec convTypeDef ilg td = + {td with NestedTypes = convTypeDefs ilg td.NestedTypes; + Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; } + +and convTypeDefs ilg tdefs : ILTypeDefs = + morphILTypeDefs (convTypeDef ilg) tdefs + +let ConvModule ilg modul = + morphILTypeDefsInILModule (convTypeDefs ilg) modul + + +//--------------------------------------------------- +// Generate the union classes + let mkHiddenGeneratedInstanceFieldDef ilg (nm,ty,init,access) = mkILInstanceField (nm,ty,init,access) |> addFieldNeverAttrs ilg @@ -615,10 +629,10 @@ let mkMethodsAndPropertiesForFields ilg access attr hasHelpers (typ: ILType) (fi nonBranchingInstrsToCode [ mkLdarg 0us; mkNormalLdfld fspec ], attr)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg ] basicProps, basicMethods + let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (alt:IlxUnionAlternative) = let attr = cud.cudWhere @@ -654,7 +668,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode [ I_ldsfld (Nonvolatile,mkConstFieldSpec altName baseTy) ], attr)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg [meth] @@ -678,7 +691,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a mkILReturn ilg.typ_bool, mkMethodBody(true,emptyILLocals,2,nonBranchingInstrsToCode ([ mkLdarg0 ] @ mkIsData ilg (true, cuspec, num)), attr)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg ], [ { Name=mkTesterName altName; IsRTSpecialName=false; @@ -704,7 +716,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a ("get_" + altName, cud.cudHelpersAccess, [], mkILReturn baseTy, mkMethodBody(true,emptyILLocals,fields.Length, nonBranchingInstrsToCode (convNewDataInstrInternal ilg cuspec num), attr)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg |> addAltAttribs @@ -736,7 +747,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a nonBranchingInstrsToCode (Array.toList (Array.mapi (fun i _ -> mkLdarg (uint16 i)) fields) @ (convNewDataInstrInternal ilg cuspec num)), attr)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg |> addAltAttribs @@ -802,7 +812,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a [ mkLdarg0; mkNormalLdfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)); mkNormalLdfld (mkILFieldSpecInTy(altTy,fldName,fldTy));],None)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg) |> Array.toList @@ -891,10 +900,10 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a baseMakerMeths, baseMakerProps, altUniqObjMeths, typeDefs, altDebugTypeDefs, altNullaryFields -let rec convClassUnionDef ilg enc td cud = - let baseTy = mkILFormalBoxedTy (mkRefForNestedILTypeDef ILScopeRef.Local (enc,td)) td.GenericParams +let mkClassUnionDef ilg tref td cud = + let baseTy = mkILFormalBoxedTy tref td.GenericParams let cuspec = IlxUnionSpec(IlxUnionRef(baseTy.TypeRef, cud.cudAlternatives, cud.cudNullPermitted, cud.cudHasHelpers), baseTy.GenericArgs) - let info = (enc,td,cud) + let info = (td,cud) let repr = cudefRepr let isTotallyImmutable = (cud.cudHasHelpers <> SpecialFSharpListHelpers) @@ -999,7 +1008,6 @@ let rec convClassUnionDef ilg enc td cud = [ mkLdarg0; (mkIlxInstr (EI_lddatatag (true, cuspec))) ], cud.cudWhere)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg ], [] @@ -1013,7 +1021,6 @@ let rec convClassUnionDef ilg enc td cud = [ mkLdarg0; (mkIlxInstr (EI_lddatatag (true, cuspec))) ], cud.cudWhere)) - |> convMethodDef ilg |> addMethodGeneratedAttrs ilg ], [ { Name=tagPropertyName; @@ -1034,21 +1041,9 @@ let rec convClassUnionDef ilg enc td cud = // The class can be abstract if each alternative is represented by a derived type let isAbstract = (altTypeDefs.Length = cud.cudAlternatives.Length) - let existingMeths = - td.Methods.AsList - // Filter out the F#-compiler supplied implementation of the get_Empty method. This is because we will replace - // its implementation by one that loads the unique private static field for lists - |> List.filter (fun md -> not (cud.cudHasHelpers = SpecialFSharpListHelpers && (md.Name = "get_Empty" || md.Name = "Cons" || md.Name = "get_IsEmpty")) && - not (cud.cudHasHelpers = SpecialFSharpOptionHelpers && (md.Name = "get_Value" || md.Name = "get_None" || md.Name = "Some"))) - // Convert the user-defined methods - |> List.map (convMethodDef ilg) - - let existingProps = - td.Properties.AsList - // Filter out the F#-compiler supplied implementation of the Empty property. - |> List.filter (fun pd -> not (cud.cudHasHelpers = SpecialFSharpListHelpers && (pd.Name = "Empty" || pd.Name = "IsEmpty" )) && - not (cud.cudHasHelpers = SpecialFSharpOptionHelpers && (pd.Name = "Value" || pd.Name = "None"))) - + let existingMeths = td.Methods.AsList + let existingProps = td.Properties.AsList + let enumTypeDef = // The nested Tags type is elided if there is only one tag // The Tag property is NOT elided if there is only one tag @@ -1085,7 +1080,7 @@ let rec convClassUnionDef ilg enc td cud = NestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ - (convTypeDefs ilg (enc@[td]) td.NestedTypes).AsList); + td.NestedTypes.AsList); GenericParams= td.GenericParams; Access = td.Access; IsAbstract = isAbstract; @@ -1116,26 +1111,27 @@ let rec convClassUnionDef ilg enc td cud = // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit - baseTypeDef +(* + printfn "union type %s has helpers = %+A" td.Name cud.cudHasHelpers + for md in td.Methods do + printfn "original union type %s has method %s" td.Name md.Name + for pd in td.Properties.AsList do + printfn "original union type %s has property %s" td.Name pd.Name + for md in baseTypeDef.Methods.AsList do + printfn "type %s has method %s" baseTypeDef.Name md.Name + for pd in baseTypeDef.Properties.AsList do + printfn "type %s has property %s" baseTypeDef.Name pd.Name + + for pd in tagProps do + printfn "type %s has tag property %s" baseTypeDef.Name pd.Name + for pd in basePropsFromAlt do + printfn "type %s has basePropsFromAlt property %s" baseTypeDef.Name pd.Name + for pd in selfProps do + printfn "type %s has selfProps property %s" baseTypeDef.Name pd.Name + for pd in existingProps do + printfn "type %s has existingProps property %s" baseTypeDef.Name pd.Name +*) + baseTypeDef -and convTypeDef ilg enc td = - match td.tdKind with - | ILTypeDefKind.Other e when isIlxExtTypeDefKind e -> - begin match destIlxExtTypeDefKind e with - | IlxTypeDefKind.Closure cloinfo -> - {td with NestedTypes = convTypeDefs ilg (enc@[td]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; - tdKind= mkIlxTypeDefKind(IlxTypeDefKind.Closure (morphIlxClosureInfo (convILMethodBody ilg) cloinfo)) } - | IlxTypeDefKind.Union cud -> convClassUnionDef ilg enc td cud - end - | _ -> - {td with NestedTypes = convTypeDefs ilg (enc@[td]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; } - -and convTypeDefs ilg enc tdefs : ILTypeDefs = - morphILTypeDefs (convTypeDef ilg enc) tdefs - -let ConvModule ilg modul = - morphILTypeDefsInILModule (convTypeDefs ilg []) modul diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index e9db0377858..66a867fc09a 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -14,5 +14,6 @@ val mkIsData : ILGlobals -> bool * IlxUnionSpec * int -> ILInstr list val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list val mkStData : IlxUnionSpec * int * int -> ILInstr list val mkBrIsData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel -> ILInstr list +val mkClassUnionDef : ILGlobals -> ILTypeRef -> ILTypeDef -> IlxUnionInfo -> ILTypeDef val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef val GetILTypeForAlternative : IlxUnionSpec -> int -> ILType From da0f68d1a6375a7596b04b884a9e148dbe7d964a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 5 Jun 2016 17:18:00 +0100 Subject: [PATCH 234/334] remove closure erasure phase --- src/fsharp/fsc.fs | 2 -- src/ilx/EraseClosures.fs | 55 ++++++++++++--------------------------- src/ilx/EraseClosures.fsi | 2 -- 3 files changed, 17 insertions(+), 42 deletions(-) diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index bb90d564ef1..4d456e925e3 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -2034,8 +2034,6 @@ let main2c(Args(tcConfig, errorLogger, staticLinker, ilGlobals, outfile, pdbfile ReportTime tcConfig "ILX -> IL (Unions)"; let ilxMainModule = EraseUnions.ConvModule ilGlobals ilxMainModule - ReportTime tcConfig "ILX -> IL (Funcs)"; - let ilxMainModule = EraseClosures.ConvModule ilGlobals ilxMainModule AbortOnError(errorLogger,tcConfig,exiter) Args(tcConfig,errorLogger,staticLinker,ilGlobals,ilxMainModule,outfile,pdbfile,signingInfo,exiter) diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index 3aeb8b8fcaf..9bbc32219f7 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -297,14 +297,16 @@ let convILMethodBody (thisClo,boxReturnTy) il = match thisClo with | Some _ -> il.MaxStack+2 (* for calls *) | None -> il.MaxStack - let code' = il.Code - let code' = match boxReturnTy with - | None -> code' - | Some ty -> (* box before returning? e.g. in the case of a TyFunc returning a struct, which compiles to a Specialise<_> method returning an object *) - morphExpandILInstrsInILCode (convReturnInstr ty) code' + let code = il.Code + // Box before returning? e.g. in the case of a TyFunc returning a struct, which + // compiles to a Specialise<_> method returning an object + let code = + match boxReturnTy with + | None -> code + | Some ty -> morphExpandILInstrsInILCode (convReturnInstr ty) code {il with MaxStack=newMax; IsZeroInit=true; - Code= code' ; + Code= code ; Locals = ILList.ofList (ILList.toList locals @ tmps.Close()) } let convMethodBody thisClo = function @@ -315,24 +317,6 @@ let convMethodDef thisClo (md: ILMethodDef) = let b' = convMethodBody thisClo (md.mdBody.Contents) {md with mdBody=mkMethBodyAux b'} -// -------------------------------------------------------------------- -// Convert a class -// -------------------------------------------------------------------- - -let rec convTypeDef cenv encl td = - [ {td with - NestedTypes = convTypeDefs cenv (encl@[td.Name]) td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef None) td.Methods; } ] - -and convTypeDefs cenv encl tdefs = - morphExpandILTypeDefs (convTypeDef cenv encl) tdefs - -let ConvModule ilg modul = - let cenv = newIlxPubCloEnv(ilg) - let newTypes = convTypeDefs cenv [] modul.TypeDefs - {modul with TypeDefs=newTypes} - - // -------------------------------------------------------------------- // Make fields for free variables of a type abstraction. // REVIEW: change type abstractions to use other closure mechanisms. @@ -377,7 +361,7 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = let tagApp = (Lazy.force clo.cloCode).SourceMarker let tyargsl,tmargsl,laterStruct = stripSupportedAbstraction clo.cloStructure - let laterAccess = td.Access (* (if td.Access = ILTypeDefAccess.Public then ILTypeDefAccess.Nested ILMemberAccess.Public else ILTypeDefAccess.Nested ILMemberAccess.Assembly) in*) + let laterAccess = td.Access // Adjust all the argument and environment accesses let rewriteCodeToAccessArgsFromEnv laterCloSpec (argToFreeVarMap: (int * IlxClosureFreeVar) list) = @@ -473,14 +457,11 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = tagApp) let nowTypeDefs = - convIlxClosureDef cenv encl - td {clo with cloStructure=nowStruct; - cloCode=notlazy nowCode} + convIlxClosureDef cenv encl td {clo with cloStructure=nowStruct; + cloCode=notlazy nowCode} nowTypeDefs @ laterTypeDefs else // CASE 1b. Build a type application. - // Currently the sole mbody defines a class and uses - // virtual methods. let boxReturnTy = Some nowReturnTy (* box prior to all I_ret *) let nowApplyMethDef = mkILGenericVirtualMethod @@ -557,19 +538,17 @@ let rec convIlxClosureDef cenv encl (td: ILTypeDef) clo = end, tagApp) let nowTypeDefs = - convIlxClosureDef cenv encl - td - {clo with cloStructure=nowStruct; - cloCode=notlazy nowCode} + convIlxClosureDef cenv encl td {clo with cloStructure=nowStruct; + cloCode=notlazy nowCode} let laterCode = rewriteCodeToAccessArgsFromEnv laterCloSpec argToFreeVarMap let laterTypeDefs = convIlxClosureDef cenv encl {td with GenericParams=laterGenericParams; - Access=laterAccess; - Name=laterTypeName} + Access=laterAccess; + Name=laterTypeName} {clo with cloStructure=laterStruct; - cloFreeVars=laterFields; - cloCode=notlazy laterCode} + cloFreeVars=laterFields; + cloCode=notlazy laterCode} // add 'compiler generated' to all the methods in the 'now' classes let laterTypeDefs = laterTypeDefs |> List.map (addMethodGeneratedAttrsToTypeDef cenv.ilg) nowTypeDefs @ laterTypeDefs diff --git a/src/ilx/EraseClosures.fsi b/src/ilx/EraseClosures.fsi index 6c8ce53b3b6..0cea96a8922 100644 --- a/src/ilx/EraseClosures.fsi +++ b/src/ilx/EraseClosures.fsi @@ -8,8 +8,6 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types -val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef - type cenv val mkCallFunc : cenv -> allocLocal:(ILType -> uint16) -> numThisGenParams:int -> ILTailcall -> IlxClosureApps -> ILInstr list From f6f55e7ea7f88fb85a7d63a6692d5aa2c2804c7d Mon Sep 17 00:00:00 2001 From: Martin Woodward Date: Sun, 5 Jun 2016 18:17:24 -0400 Subject: [PATCH 235/334] Remove references to MS Open Tech --- setup/resources/ThirdPartyNotices.txt | 6 +++--- src/absil/ilsign.fs | 2 +- src/buildtools/buildnugets.fsx | 2 +- .../layoutfschostnuget.fsx | 2 +- src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx | 2 +- src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs | 2 +- src/fsharp/FSharp.Core.Unittests/SurfaceArea.coreclr.fs | 2 +- src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx | 2 +- src/utils/reshapedmsbuild.fs | 2 +- src/utils/reshapedreflection.fs | 2 +- tests/fsharp/core/signedtests/test.fs | 2 +- vsintegration/src/FSharp.ProjectSystem.FSharp/Overview.xml | 2 +- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/setup/resources/ThirdPartyNotices.txt b/setup/resources/ThirdPartyNotices.txt index edacc372f78..ba876731aea 100644 --- a/setup/resources/ThirdPartyNotices.txt +++ b/setup/resources/ThirdPartyNotices.txt @@ -10,9 +10,9 @@ Microsoft is offering you a license to use the following components with Microso %% Visual F# Tools NOTICES AND INFORMATION BEGIN HERE ========================================= -Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -Microsoft Open Technologies would like to thank its contributors, a list -of whom are at https://visualfsharp.codeplex.com/wikipage?title=Contributors. +Copyright (c) Microsoft. All rights reserved. +Microsoft would like to thank its contributors, a list +of whom are at https://github.com/Microsoft/visualfsharp/graphs/contributors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may diff --git a/src/absil/ilsign.fs b/src/absil/ilsign.fs index 5e7619c0dcb..f8a31ffbf57 100644 --- a/src/absil/ilsign.fs +++ b/src/absil/ilsign.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. module internal Microsoft.FSharp.Compiler.AbstractIL.Internal.StrongNameSign diff --git a/src/buildtools/buildnugets.fsx b/src/buildtools/buildnugets.fsx index ddf82dfcf82..f1ae0cb4309 100644 --- a/src/buildtools/buildnugets.fsx +++ b/src/buildtools/buildnugets.fsx @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, // // Build nuget package for the fsharp compiler //========================================================================================= diff --git a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx index 6ea068f36a9..ca90004d47e 100644 --- a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx +++ b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, // // Layout the nuget host package for the fsharp compiler //========================================================================================= diff --git a/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx b/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx index 43f93d4fb41..da8720bcf6e 100644 --- a/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx +++ b/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, // // Layout the nuget package for the fsharp compiler //========================================================================================= diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 7f5125a3a08..694052fa4d2 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.RecordTypes #nowarn "9" diff --git a/src/fsharp/FSharp.Core.Unittests/SurfaceArea.coreclr.fs b/src/fsharp/FSharp.Core.Unittests/SurfaceArea.coreclr.fs index f5a414b172f..2b42e37c12e 100644 --- a/src/fsharp/FSharp.Core.Unittests/SurfaceArea.coreclr.fs +++ b/src/fsharp/FSharp.Core.Unittests/SurfaceArea.coreclr.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace FSharp.Core.Unittests.Portable.SurfaceArea diff --git a/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx b/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx index 4ed9f01e30a..1b9c03d7096 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx +++ b/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, // // Layout the nuget package for the fsharp compiler //========================================================================================= diff --git a/src/utils/reshapedmsbuild.fs b/src/utils/reshapedmsbuild.fs index 2e04719e48e..13fdd0366bd 100644 --- a/src/utils/reshapedmsbuild.fs +++ b/src/utils/reshapedmsbuild.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Build.Tasks namespace Microsoft.Build.Utilities diff --git a/src/utils/reshapedreflection.fs b/src/utils/reshapedreflection.fs index b1e3d993d93..af1bfb3cf2f 100644 --- a/src/utils/reshapedreflection.fs +++ b/src/utils/reshapedreflection.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.FSharp.Core diff --git a/tests/fsharp/core/signedtests/test.fs b/tests/fsharp/core/signedtests/test.fs index 88754658c8f..b078a2bc0fd 100644 --- a/tests/fsharp/core/signedtests/test.fs +++ b/tests/fsharp/core/signedtests/test.fs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace signingtests open System diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/Overview.xml b/vsintegration/src/FSharp.ProjectSystem.FSharp/Overview.xml index da3b2642bdc..c2837d0a6d5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/Overview.xml +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/Overview.xml @@ -1,6 +1,6 @@  - + ../../../Common From d76278109a98d474c7932e6a790607ffbcaee1be Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 6 Jun 2016 09:16:59 +0100 Subject: [PATCH 236/334] fix build break --- src/fsharp/fsi/fsi.fs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 8609e3e2eea..ed5241334bb 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -858,8 +858,6 @@ type internal FsiDynamicCompiler ReportTime tcConfig "ILX -> IL (Unions)"; let ilxMainModule = EraseUnions.ConvModule ilGlobals ilxMainModule - ReportTime tcConfig "ILX -> IL (Funcs)"; - let ilxMainModule = EraseClosures.ConvModule ilGlobals ilxMainModule errorLogger.AbortOnError(); From aa5b1e5828e66aaddfa5a4f2e3cb79fbee560a4f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Mon, 6 Jun 2016 16:54:39 -0700 Subject: [PATCH 237/334] Added VS insertion manifests --- build-everything.proj | 22 +++++++++---------- setup/FSharp.SDK/FSharp.SDK.wixproj | 2 +- .../Insertion/FSharp.SDK/FSharp.SDK.swixproj | 21 ++++++++++++++++++ setup/Insertion/FSharp.SDK/FSharp.SDK.swr | 15 +++++++++++++ setup/Insertion/Insertion.vsmanproj | 16 ++++++++++++++ .../VisualFSharpVSIX.swixproj | 20 +++++++++++++++++ .../VisualFSharpVSIX/VisualFSharpVSIX.swr | 16 ++++++++++++++ setup/fsharp-setup-build.proj | 17 +++++++++++--- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 2 +- 9 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj create mode 100644 setup/Insertion/FSharp.SDK/FSharp.SDK.swr create mode 100644 setup/Insertion/Insertion.vsmanproj create mode 100644 setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj create mode 100644 setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr diff --git a/build-everything.proj b/build-everything.proj index 4c370b0d1fc..41b691c8dc9 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -1,23 +1,23 @@ - + - - - + + + - - + + - + @@ -25,20 +25,20 @@ - + - + - + - + diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj index 1483ed4ae4f..64a014b5cb6 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wixproj +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -68,6 +68,6 @@ - + \ No newline at end of file diff --git a/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj b/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj new file mode 100644 index 00000000000..717b05185af --- /dev/null +++ b/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj @@ -0,0 +1,21 @@ + + + + ..\..\..\src + neutral + false + manifest + Debug + $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json + + + + + + $(PackagePreprocessorDefinitions);InsertionFolder=$(FSharpSourcesRoot)\..\$(Configuration)\insertion + + + + + + diff --git a/setup/Insertion/FSharp.SDK/FSharp.SDK.swr b/setup/Insertion/FSharp.SDK/FSharp.SDK.swr new file mode 100644 index 00000000000..c8be14a0d23 --- /dev/null +++ b/setup/Insertion/FSharp.SDK/FSharp.SDK.swr @@ -0,0 +1,15 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.type=msi + vs.package.chip=neutral + vs.package.language=neutral + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +vs.payloads + vs.payload source=$(InsertionFolder)\msi\ENU\FSharp.SDK.msi diff --git a/setup/Insertion/Insertion.vsmanproj b/setup/Insertion/Insertion.vsmanproj new file mode 100644 index 00000000000..21c51ecf689 --- /dev/null +++ b/setup/Insertion/Insertion.vsmanproj @@ -0,0 +1,16 @@ + + + + ..\..\src + true + true + $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json + + + + + + + + + \ No newline at end of file diff --git a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj new file mode 100644 index 00000000000..ee71a943031 --- /dev/null +++ b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj @@ -0,0 +1,20 @@ + + + + ..\..\..\src + neutral + false + manifest + $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json + + + + + + $(PackagePreprocessorDefinitions);InsertionFolder=$(FSharpSourcesRoot)\..\$(Configuration)\insertion + + + + + + diff --git a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr new file mode 100644 index 00000000000..944cdd6bb99 --- /dev/null +++ b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr @@ -0,0 +1,16 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.chip=neutral + vs.package.language=en-us + vs.package.type=vsix + vs.package.vsixId=VisualFSharp + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +vs.payloads + vs.payload source=$(InsertionFolder)\vsix\VisualFSharpVsix.Professional.vsix diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj index 60a7b5d5b09..9c018d37e84 100644 --- a/setup/fsharp-setup-build.proj +++ b/setup/fsharp-setup-build.proj @@ -16,19 +16,30 @@ - + + + + + + - + + + + - + + + + diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index dc8d290d9f5..f9cc3eccbf8 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -344,6 +344,6 @@ - + \ No newline at end of file From de846232f251c72206b6d6b1c8a4b981065b7eb9 Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Mon, 6 Jun 2016 18:09:20 -0500 Subject: [PATCH 238/334] Update unit-type-expected compiler warning --- src/fsharp/CompileOps.fs | 4 ++-- src/fsharp/FSStrings.resx | 2 +- .../LetBindings/Basic/W_DoBindingsNotUnit01.fs | 2 +- .../Expressions/BindingExpressions/Binding/in01.fs | 2 +- .../Expressions/BindingExpressions/Binding/in02.fs | 2 +- .../Expressions/BindingExpressions/Binding/in03.fs | 2 +- .../Expressions/BindingExpressions/Binding/in04.fs | 2 +- .../Expressions/BindingExpressions/Binding/in05.fs | 2 +- .../TryFinally/W-TryFinallyNotUnit.fs | 2 +- .../QueryExpressions/E_WhereRequiresParens01.fs | 2 +- .../PatternMatching/Named/E_ActivePatternUnconstrained01.fs | 2 +- tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs | 2 +- tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs | 2 +- tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop01.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop02.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop03.fs | 2 +- .../Source/Diagnostics/async/MissingReturnBangForLoop04.fs | 2 +- tests/fsharpqa/Source/Misc/Parsing02.fs | 6 +++--- 19 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 4ff176e17ed..61da60bdfa5 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -531,7 +531,7 @@ let UseOfAddressOfOperatorE() = DeclareResourceString("UseOfAddressOfOperator"," let DefensiveCopyWarningE() = DeclareResourceString("DefensiveCopyWarning","%s") let DeprecatedThreadStaticBindingWarningE() = DeclareResourceString("DeprecatedThreadStaticBindingWarning","") let FunctionValueUnexpectedE() = DeclareResourceString("FunctionValueUnexpected","%s") -let UnitTypeExpected1E() = DeclareResourceString("UnitTypeExpected1","%s") +let UnitTypeExpected1E() = DeclareResourceString("UnitTypeExpected1","") let UnitTypeExpected2E() = DeclareResourceString("UnitTypeExpected2","%s") let RecursiveUseCheckedAtRuntimeE() = DeclareResourceString("RecursiveUseCheckedAtRuntime","") let LetRecUnsound1E() = DeclareResourceString("LetRecUnsound1","%s") @@ -1182,7 +1182,7 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = if perhapsProp then os.Append(UnitTypeExpected2E().Format (NicePrint.stringOfTy denv ty)) |> ignore else - os.Append(UnitTypeExpected1E().Format (NicePrint.stringOfTy denv ty)) |> ignore + os.Append(UnitTypeExpected1E().Format) |> ignore | RecursiveUseCheckedAtRuntime _ -> os.Append(RecursiveUseCheckedAtRuntimeE().Format) |> ignore | LetRecUnsound (_,[v],_) -> diff --git a/src/fsharp/FSStrings.resx b/src/fsharp/FSStrings.resx index f4c45a898f5..f028e00b6f8 100644 --- a/src/fsharp/FSStrings.resx +++ b/src/fsharp/FSStrings.resx @@ -892,7 +892,7 @@ This expression is a function value, i.e. is missing arguments. Its type is {0}. - This expression has a value of type '{0}' that is implicitly ignored. Use the 'ignore' function to discard this value explicitly, e.g. 'expr |> ignore', or bind it to a name to refer to it later, e.g. 'let result = expr'. + The result of this expression is implicitly ignored. Consider using 'ignore' to discard this value explicitly, e.g. 'expr |> ignore', or 'let' to bind the result to a name, e.g. 'let result = expr'. This expression should have type 'unit', but has type '{0}'. If assigning to a property use the syntax 'obj.Prop <- expr'. diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs index f9ffa7970ce..e703b6ac2a4 100644 --- a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs +++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/W_DoBindingsNotUnit01.fs @@ -2,7 +2,7 @@ #light // Verify warning when 'do-bindings' do not return unit. -//This expression has a value of type 'int' that is implicitly ignored +//The result of this expression is implicitly ignored let square x = x * x diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs index d4d1116810e..72abc807372 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in01.fs @@ -5,7 +5,7 @@ // Eventually, we will deprecated them - and the specs will be updated. // //The value or constructor 'a' is not defined$ -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ module A = let a = 3 in a + 1 |> ignore;; a > 4;; diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs index 9d1abe85d68..b3799eb1539 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in02.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ // module B = diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs index f36c08169f8..e0af19fb87c 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in03.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ // module C = let a = 3 diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs index a56dcd72f94..36e735c458e 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in04.fs @@ -4,7 +4,7 @@ // I'm adding these cases to make sure we do not accidentally change the behavior from version to version // Eventually, we will deprecated them - and the specs will be updated. // -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ // module D = diff --git a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs index a6cf5359f82..68dad9c89db 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/BindingExpressions/Binding/in05.fs @@ -5,7 +5,7 @@ // Eventually, we will deprecated them - and the specs will be updated. //The type 'int' does not match the type 'unit'$ //Type mismatch\. Expecting a. ''a -> 'b' .but given a. ''a -> unit' .The type 'int' does not match the type 'unit'$ -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ module E = let a = 3 in a + 1 |> ignore diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs b/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs index dcfad64bdfb..bdb54bf3d7b 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/ControlFlowExpressions/TryFinally/W-TryFinallyNotUnit.fs @@ -2,7 +2,7 @@ #light // Verify warning if a finally block does not return 'unit' -//This expression has a value of type 'bool' that is implicitly ignored +//The result of this expression is implicitly ignored let x : int = try diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs index f69b652c4cd..453173b9192 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/QueryExpressions/E_WhereRequiresParens01.fs @@ -1,7 +1,7 @@ // #Conformance #DataExpressions #Query // Where expressions require parenthesis //'where' is not used correctly\. This is a custom operation in this query or computation expression\.$ -//This expression has a value of type 'bool' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ let query = query { for i in [1..10] do diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs index 17ad18262e1..b930cbaba00 100644 --- a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternUnconstrained01.fs @@ -2,7 +2,7 @@ // Regression test for FSHARP1.0:5590 // This code used to compile, but fail peverification // Now, it just does not compile anymore telling the user to annotated it a bit. -//This expression has a value of type 'int' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ //Active pattern '\|A1\|A2\|A3\|' has a result type containing type variables that are not determined by the input\. The common cause is a when a result case is not mentioned, e\.g\. 'let \(\|A\|B\|\) \(x:int\) = A x'\. This can be fixed with a type constraint, e\.g\. 'let \(\|A\|B\|\) \(x:int\) : Choice = A x'$ let (|A1|A2|A3|) (inp:int) : Choice = printfn "hello" diff --git a/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs b/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs index f6d624f2cc5..b68027a1693 100644 --- a/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs +++ b/tests/fsharpqa/Source/Diagnostics/General/W_Multiline02.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:3596 // Make sure that error spans correctly across multiple lines -//This expression has a value of type 'int' that is implicitly ignored +//The result of this expression is implicitly ignored #nowarn "988" let f g x = g x diff --git a/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs b/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs index a78898e77d7..f6f6443df63 100644 --- a/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs +++ b/tests/fsharpqa/Source/Diagnostics/NONTERM/quoteExpr01.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics // Regression test for FSHARP1.0:2391, FSHARP1.0:1479 -//This expression has a value of type 'seq.Quotations\.Var.' that is implicitly ignored +//The result of this expression is implicitly ignored #light "off" <@@ 1 @@>.GetFreeVars() diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs index cefbf104a47..3fe0919320d 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingIgnore.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 -//This expression has a value of type 'int' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ async { 1; return 2 } |> ignore diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs index 2e53ebcc6d0..4dd57691e8d 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop01.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ let rec loop() = async { let x = 1 in loop() } diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs index f5ee4118eec..a9bb89c9dac 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop02.fs @@ -1,5 +1,5 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ let rec loop() = async { loop() } diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs index 821a452ef65..dfba108aac0 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop03.fs @@ -1,6 +1,6 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ //This expression was expected to have type. 'Async<'a>' .but here has type. 'unit' let rec loop2() = async.Delay(fun () -> loop2(); ()); diff --git a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs index f433fb10b6b..b86efb67132 100644 --- a/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs +++ b/tests/fsharpqa/Source/Diagnostics/async/MissingReturnBangForLoop04.fs @@ -1,7 +1,7 @@ // #Regression #Diagnostics #Async // Regression tests for FSHARP1.0:4394 // common mistake: forgetting the return! For a loop -//This expression has a value of type 'Async<'a>' that is implicitly ignored\. Use the 'ignore' function to discard this value explicitly, e\.g\. 'expr \|> ignore', or bind it to a name to refer to it later, e\.g\. 'let result = expr'\.$ +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ //This expression was expected to have type. 'Async<'a>' .but here has type. 'unit' // Note: interestingly, this looks much better if a method call is not used let delay x = async.Delay x diff --git a/tests/fsharpqa/Source/Misc/Parsing02.fs b/tests/fsharpqa/Source/Misc/Parsing02.fs index 67f9859ebef..9a17369e870 100644 --- a/tests/fsharpqa/Source/Misc/Parsing02.fs +++ b/tests/fsharpqa/Source/Misc/Parsing02.fs @@ -1,10 +1,10 @@ // #Regression #Misc // Verify warnings associated with top level expressions getting discarded -//This expression has a value of type '\( \^a -> unit\) \* int' that is implicitly ignored -//This expression has a value of type '\('a \[\] -> unit \[\]\) \* string \[\]' that is implicitly ignored +//The result of this expression is implicitly ignored +//The result of this expression is implicitly ignored -// Note the comma between printf "%A", this results in a tuple expr which probabaly wasn't intended. +// Note the comma between printf "%A", this results in a tuple expr which probably wasn't intended. let arr = [|"Foo"; "Bar"|] printf "%d", arr.Length From 10559a978c1087b5381ae7be4dfc5162c87fa869 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 7 Jun 2016 18:15:01 +0100 Subject: [PATCH 239/334] put union erasure in IlxGen phase --- src/absil/il.fs | 45 +---- src/absil/il.fsi | 12 -- src/absil/ilprint.fs | 19 +- src/absil/ilreflect.fs | 1 - src/absil/ilx.fs | 37 +--- src/absil/ilx.fsi | 14 +- src/fsharp/IlxGen.fs | 43 +++-- src/fsharp/fsc.fs | 14 +- src/fsharp/fsi/fsi.fs | 5 - src/ilx/EraseUnions.fs | 386 +++++++++++++++++----------------------- src/ilx/EraseUnions.fsi | 13 +- 11 files changed, 205 insertions(+), 384 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 0d1955ead1f..41c004dbce4 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -1124,46 +1124,7 @@ type ILInstr = (* FOR EXTENSIONS, e.g. MS-ILX *) | EI_ilzero of ILType | EI_ldlen_multi of int32 * int32 - | I_other of IlxExtensionInstr -and IlxExtensionInstr = Ext_instr of obj - - -// -------------------------------------------------------------------- -// Helpers for the ILX extensions -// -------------------------------------------------------------------- - -type internal_instr_extension = - { internalInstrExtDests: IlxExtensionInstr -> ILCodeLabel list; - internalInstrExtFallthrough: IlxExtensionInstr -> ILCodeLabel option; - internalInstrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> IlxExtensionInstr -> IlxExtensionInstr; } - -type ILInstrSetExtension<'T> = - { instrExtDests: 'T -> ILCodeLabel list; - instrExtFallthrough: 'T -> ILCodeLabel option; - instrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> 'T -> 'T; } - -let instrExtensions = ref [] - -let RegisterInstructionSetExtension (ext: ILInstrSetExtension<'T>) = - if nonNil !instrExtensions then failwith "RegisterInstructionSetExtension: only one extension currently allowed"; - let mk (x: 'T) = Ext_instr (box x) - let test (Ext_instr _x) = true - let dest (Ext_instr x) = (unbox x : 'T) - instrExtensions := - { internalInstrExtDests=(fun x -> ext.instrExtDests (dest x)); - internalInstrExtFallthrough=(fun x -> ext.instrExtFallthrough (dest x)); - internalInstrExtRelabel=(fun f x -> mk (ext.instrExtRelabel f (dest x))); } - :: !instrExtensions; - mk,test,dest - -let rec find_extension s f l = - let rec look l1 = - match l1 with - | [] -> failwith ("extension for "+s+" not found") - | (h::t) -> match f h with None -> look t | Some res -> res - look l - type ILDebugMapping = { LocalIndex: int; @@ -1180,7 +1141,6 @@ type ILBasicBlock = member x.Fallthrough = match x.LastInstruction with | I_br l | I_brcmp (_,_,l) | I_switch (_,l) -> Some l - | I_other e -> find_extension "instr" (fun ext -> Some (ext.internalInstrExtFallthrough e)) !instrExtensions | _ -> None @@ -2065,7 +2025,6 @@ let destinationsOfInstr i = | I_endfinally | I_endfilter | I_ret | I_throw | I_rethrow | I_call (Tailcall,_,_)| I_callvirt (Tailcall,_,_)| I_callconstraint (Tailcall,_,_,_) | I_calli (Tailcall,_,_) -> [] - | I_other e -> find_extension "instr" (fun ext -> Some (ext.internalInstrExtDests e)) !instrExtensions | _ -> [] let destinationsOfBasicBlock (bblock:ILBasicBlock) = destinationsOfInstr bblock.LastInstruction @@ -2080,7 +2039,6 @@ let instrIsBasicBlockEnd i = match i with | I_leave _ | I_br _ | I_brcmp _ | I_switch _ | I_endfinally | I_endfilter | I_ret | I_throw | I_rethrow -> true - | I_other e -> find_extension "instr" (fun ext -> Some (nonNil (ext.internalInstrExtDests e))) !instrExtensions | _ -> false let checks = false @@ -3586,7 +3544,6 @@ type BasicBlockStartsToCodeLabelsMap(instrs,tryspecs,localspecs,lab2pc) = match i with | I_leave l -> I_leave(c.lab2cl l) | I_br l -> I_br (c.lab2cl l) - | I_other e -> I_other (find_extension "instr" (fun ext -> Some (ext.internalInstrExtRelabel c.lab2cl e)) !instrExtensions) | I_brcmp (x,l1,l2) -> I_brcmp(x,c.lab2cl l1, c.lab2cl l2) | I_switch (ls,l) -> I_switch(List.map c.lab2cl ls, c.lab2cl l) | _ -> i @@ -4881,7 +4838,7 @@ and refs_of_instr s x = | I_ldarga _|I_ldarg _|I_leave _|I_br _ | I_brcmp _|I_rethrow|I_refanytype|I_ldlen|I_throw|I_initblk _ |I_cpblk _ | I_localloc|I_ret |I_endfilter|I_endfinally|I_arglist - | I_other _ | I_break + | I_break | AI_add | AI_add_ovf | AI_add_ovf_un | AI_and | AI_div | AI_div_un | AI_ceq | AI_cgt | AI_cgt_un | AI_clt | AI_clt_un | AI_conv _ | AI_conv_ovf _ | AI_conv_ovf_un _ | AI_mul | AI_mul_ovf | AI_mul_ovf_un | AI_rem | AI_rem_un | AI_shl | AI_shr | AI_shr_un | AI_sub | AI_sub_ovf | AI_sub_ovf_un | AI_xor | AI_or | AI_neg | AI_not diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 6c435acbfd4..6c31d8a0c4c 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -98,9 +98,6 @@ type ILSourceMarker = member EndLine: int member EndColumn: int -/// Represents an extension to the algebra of instructions -type IlxExtensionInstr - [] type PublicKey = | PublicKey of byte[] @@ -669,15 +666,6 @@ type ILInstr = // EXTENSIONS, e.g. MS-ILX | EI_ilzero of ILType | EI_ldlen_multi of int32 * int32 - | I_other of IlxExtensionInstr - -// REVIEW: remove this open-ended way of extending the IL and just combine with ILX -type ILInstrSetExtension<'Extension> = - { instrExtDests: ('Extension -> ILCodeLabel list); - instrExtFallthrough: ('Extension -> ILCodeLabel option); - instrExtRelabel: (ILCodeLabel -> ILCodeLabel) -> 'Extension -> 'Extension; } - -val RegisterInstructionSetExtension: ILInstrSetExtension<'Extension> -> ('Extension -> IlxExtensionInstr) * (IlxExtensionInstr -> bool) * (IlxExtensionInstr -> 'Extension) /// A list of instructions ending in an unconditionally /// branching instruction. A basic block has a label which must be unique diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 86c13094cd7..6112fd5b5ff 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -754,24 +754,7 @@ let rec goutput_instr env os inst = | I_cpobj tok -> output_string os "cpobj "; goutput_typ env os tok | I_sizeof tok -> output_string os "sizeof "; goutput_typ env os tok | I_seqpoint s -> output_source os s - | (EI_ilzero ty) -> output_string os "ilzero "; goutput_typ env os ty - | I_other e when isIlxExtInstr e -> - match (destIlxExtInstr e) with - | EI_castdata (check,ty,n) -> - if not check then output_string os "/* unchecked. */ "; - output_string os "castdata "; - goutput_cuspec env os ty; - output_string os ","; - output_int os n - | (EI_lddatatag (_,ty)) -> - output_string os "lddatatag "; - goutput_cuspec env os ty - | (EI_datacase (_,ty,l,_)) -> - output_string os "datacase"; - output_string os " "; - goutput_cuspec env os ty; - output_string os ","; - output_parens (output_seq "," (fun os (x,y) -> output_int os x; output_string os ","; output_code_label os y)) os l + | EI_ilzero ty -> output_string os "ilzero "; goutput_typ env os ty | _ -> output_string os "" diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 684b1f32db3..564e8e7b724 100644 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -1200,7 +1200,6 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | EI_ldlen_multi (_,m) -> emitInstr cenv modB emEnv ilG (mkLdcInt32 m); emitInstr cenv modB emEnv ilG (mkNormalCall(mkILNonGenericMethSpecInTy(cenv.ilg.typ_Array, ILCallingConv.Instance, "GetLength", [cenv.ilg.typ_int32], cenv.ilg.typ_int32))) - | I_other e when isIlxExtInstr e -> Printf.failwithf "the ILX instruction %s cannot be emitted" (e.ToString()) | i -> Printf.failwithf "the IL instruction %s cannot be emitted" (i.ToString()) //---------------------------------------------------------------------------- diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index 9f5cc1f35fb..a37c279ae11 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -115,41 +115,6 @@ type IlxClosureSpec = mkILCtorMethSpecForTy (cloTy,fields |> Array.map (fun fv -> fv.fvType) |> Array.toList) -type IlxInstr = - // Discriminated unions - | EI_castdata of bool * IlxUnionSpec * int - | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel - | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec - - -let destinations i = - match i with - | (EI_datacase (_,_,ls,l)) -> - let hashSet = System.Collections.Generic.HashSet<_>(HashIdentity.Structural) - [yield l - for (_,l) in ls do - if hashSet.Add l then - yield l] - | _ -> [] - -let fallthrough i = - match i with - | (EI_datacase (_,_,_,l)) -> Some l - | _ -> None - -let remapIlxLabels lab2cl i = - match i with - | EI_datacase (z,x,ls,l) -> EI_datacase (z,x,List.map (fun (y,l) -> (y,lab2cl l)) ls, lab2cl l) - | _ -> i - -let (mkIlxExtInstr,isIlxExtInstr,destIlxExtInstr) = - RegisterInstructionSetExtension - { instrExtDests=destinations - instrExtFallthrough=fallthrough - instrExtRelabel=remapIlxLabels } - -let mkIlxInstr i = I_other (mkIlxExtInstr i) - // Define an extension of the IL algebra of type definitions type IlxClosureInfo = { cloStructure: IlxClosureLambdas; @@ -157,7 +122,7 @@ type IlxClosureInfo = cloCode: Lazy; cloSource: ILSourceMarker option} -and IlxUnionInfo = +type IlxUnionInfo = { /// is the representation public? cudReprAccess: ILMemberAccess; /// are the representation public? diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index 93522ff8e16..a158e4669b1 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -89,18 +89,6 @@ type IlxClosureApps = | Apps_app of ILType * IlxClosureApps | Apps_done of ILType -/// ILX extensions to the instruction set. -type IlxInstr = - | EI_castdata of bool * IlxUnionSpec * int - | EI_datacase of avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel - | EI_lddatatag of avoidHelpers:bool * IlxUnionSpec - -val mkIlxExtInstr: (IlxInstr -> IlxExtensionInstr) -val isIlxExtInstr: (IlxExtensionInstr -> bool) -val destIlxExtInstr: (IlxExtensionInstr -> IlxInstr) - -val mkIlxInstr: IlxInstr -> ILInstr - // -------------------------------------------------------------------- // ILX extensions to the kinds of type definitions available // -------------------------------------------------------------------- @@ -111,7 +99,7 @@ type IlxClosureInfo = cloCode: Lazy; cloSource: ILSourceMarker option} -and IlxUnionInfo = +type IlxUnionInfo = { /// Is the representation public? cudReprAccess: ILMemberAccess; /// Are the representation helpers public? diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index a4af0b385fe..2007bf457eb 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1608,6 +1608,9 @@ let CodeGenMethod cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName, // ILDASM has issues if you emit symbols with a source range but without any sequence points let sourceRange = if hasSequencePoints then GenPossibleILSourceMarker cenv m else None + // The old union erasure phase increased maxstack by 2 since the code pushes some items, we do the same here + let maxStack = maxStack + 2 + // Build an Abstract IL method instrs, mkILMethodBody (true,mkILLocals locals,maxStack,code, sourceRange) @@ -2176,13 +2179,21 @@ and GenSetExnField cenv cgbuf eenv (e,ecref,fieldNum,e2,m) sequel = CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld(mkILFieldSpecInTy (typ,ilFieldName,ftyp))); GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel +and UnionCodeGen (cgbuf: CodeGenBuffer) = + { new EraseUnions.ICodeGen with + member __.CodeLabel(m) = m.CodeLabel + member __.GenerateDelayMark() = CG.GenerateDelayMark cgbuf "unionCodeGenMark" + member __.GenLocal(ilty) = cgbuf.AllocLocal([],ilty) |> uint16 + member __.SetMarkToHere(m) = CG.SetMarkToHere cgbuf m + member __.EmitInstr x = CG.EmitInstr cgbuf (pop 0) (Push []) x + member __.EmitInstrs xs = CG.EmitInstrs cgbuf (pop 0) (Push []) xs } and GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs let fty = EraseUnions.GetILTypeForAlternative cuspec idx - CG.EmitInstrs cgbuf (pop 1) (Push [fty]) - [ mkIlxInstr (EI_castdata(false,cuspec,idx)); ]; + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,cuspec,idx) + CG.EmitInstrs cgbuf (pop 1) (Push [fty]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = @@ -2199,13 +2210,15 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec = GenUnionSpec cenv.amap m cenv.g eenv.tyenv tcref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib tcref - CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_int32]) [ mkIlxInstr (EI_lddatatag(avoidHelpers, cuspec)) ]; + EraseUnions.emitLdDataTag cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec) + CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_int32]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs - CG.EmitInstr cgbuf (pop 1) (Push [cuspec.EnclosingType]) (mkIlxInstr (EI_castdata(false,cuspec,idx))); + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,cuspec,idx) + CG.EmitInstrs cgbuf (pop 1) (Push [cuspec.EnclosingType]) [ ] // push/pop to match the line above GenExpr cenv cgbuf eenv SPSuppress e2 Continue; CG.EmitInstrs cgbuf (pop 2) Push0 (EraseUnions.mkStData (cuspec, idx, n)); GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel @@ -2360,9 +2373,10 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = else ntmargs for i = ntmargs - 1 downto 0 do - CG.EmitInstrs cgbuf (pop 1) Push0 [ I_starg (uint16 (i+cgbuf.PreallocatedArgCount)) ]; - done; - CG.EmitInstrs cgbuf (pop 0) Push0 [ I_br (mark.CodeLabel) ]; + CG.EmitInstrs cgbuf (pop 1) Push0 [ I_starg (uint16 (i+cgbuf.PreallocatedArgCount)) ] + + CG.EmitInstrs cgbuf (pop 0) Push0 [ I_br mark.CodeLabel ] + GenSequelEndScopes cgbuf sequel // PhysicalEquality becomes cheap reference equality once @@ -2961,16 +2975,10 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = | I_ldsfld (vol,fspec) ,_ -> I_ldsfld (vol,modFieldSpec fspec) | I_ldsflda (fspec) ,_ -> I_ldsflda (modFieldSpec fspec) | EI_ilzero(ILType.TypeVar _) ,[tyarg] -> EI_ilzero(tyarg) - | I_other e,_ when isIlxExtInstr e -> - begin match (destIlxExtInstr e),ilTyArgs with - | _ -> - if not (isNil tyargs) then err "Bad polymorphic ILX instruction"; - i - end | AI_nop,_ -> i - (* These are embedded in the IL for a an initonly ldfld, i.e. *) - (* here's the relevant comment from tc.fs *) - (* "Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr." *) + // These are embedded in the IL for a an initonly ldfld, i.e. + // here's the relevant comment from tc.fs + // "Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr." | _ -> if not (isNil tyargs) then err "Bad polymorphic IL instruction"; @@ -4308,7 +4316,8 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT | _ -> failwith "error: mixed constructor/const test?") let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib hdc.TyconRef - CG.EmitInstr cgbuf (pop 1) Push0 (mkIlxInstr (EI_datacase (avoidHelpers,cuspec,dests, defaultLabel.CodeLabel))); + EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers,cuspec,dests,defaultLabel.CodeLabel); + CG.EmitInstrs cgbuf (pop 1) Push0 [ ] // push/pop to match the line above GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos caseLabels cases defaultTargetOpt defaultLabel sequel | Test.Const c -> diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 4d456e925e3..da17d60c132 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -2028,18 +2028,7 @@ let main2b(Args(tcConfig: TcConfig, tcImports, tcGlobals, errorLogger, generated Args (tcConfig,errorLogger,staticLinker,ilGlobals,outfile,pdbfile,ilxMainModule,signingInfo,exiter) -let main2c(Args(tcConfig, errorLogger, staticLinker, ilGlobals, outfile, pdbfile, ilxMainModule, signingInfo, exiter: Exiter)) = - - use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind (BuildPhase.IlGen) - - ReportTime tcConfig "ILX -> IL (Unions)"; - let ilxMainModule = EraseUnions.ConvModule ilGlobals ilxMainModule - - AbortOnError(errorLogger,tcConfig,exiter) - Args(tcConfig,errorLogger,staticLinker,ilGlobals,ilxMainModule,outfile,pdbfile,signingInfo,exiter) - - -let main3(Args(tcConfig, errorLogger: ErrorLogger, staticLinker, ilGlobals, ilxMainModule, outfile, pdbfile, signingInfo, exiter:Exiter)) = +let main3(Args(tcConfig, errorLogger: ErrorLogger, staticLinker, ilGlobals, outfile, pdbfile, ilxMainModule, signingInfo, exiter:Exiter)) = let ilxMainModule = try staticLinker ilxMainModule @@ -2077,7 +2066,6 @@ let typecheckAndCompile(argv,bannerAlreadyPrinted,exiter:Exiter, errorLoggerProv |> main1 |> main2 |> main2b - |> main2c |> main3 |> main4 diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 306056b549c..49dd0c29768 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -856,11 +856,6 @@ type internal FsiDynamicCompiler errorLogger.AbortOnError(); - ReportTime tcConfig "ILX -> IL (Unions)"; - let ilxMainModule = EraseUnions.ConvModule ilGlobals ilxMainModule - - errorLogger.AbortOnError(); - ReportTime tcConfig "Assembly refs Normalised"; let mainmod3 = Morphs.morphILScopeRefsInILModuleMemoized ilGlobals (NormalizeAssemblyRefs tcImports) ilxMainModule errorLogger.AbortOnError(); diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index a6e184cde13..d53a9591fb3 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -185,10 +185,6 @@ let cudefRepr = (fun ((_td,_cud),_nm) -> NoTypesGeneratedViaThisReprDecider)) -let mkBasicBlock2 (a,b) = - mkBasicBlock { Label=a; Instructions= Array.ofList b} - - let mkTesterName nm = "Is" + nm let tagPropertyName = "Tag" @@ -372,6 +368,41 @@ let mkIsData ilg (avoidHelpers, cuspec, cidx) = | TagCons -> mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_cgt_un ] | _ -> failwith "unexpected" +type ICodeGen<'Mark> = + abstract CodeLabel: 'Mark -> ILCodeLabel + abstract GenerateDelayMark: unit -> 'Mark + abstract GenLocal: ILType -> uint16 + abstract SetMarkToHere: 'Mark -> unit + abstract EmitInstr : ILInstr -> unit + abstract EmitInstrs : ILInstr list -> unit + +// TODO: this will be removed +let genWith g = + let blocks = ResizeArray() // all the blocks emitted so far + let instrs = ResizeArray() // the current block being emitted + let internalLabels = ResizeArray() + let firstLabel = generateCodeLabel() + let mutable label = firstLabel + let closeBock m = + blocks.Add (mkBasicBlock { Label = label; Instructions=instrs.ToArray() }) + internalLabels.Add label + label <- m + instrs.Clear() + let cg = + { new ICodeGen<_> with + member __.CodeLabel(m) = m + member __.GenerateDelayMark() = generateCodeLabel() + member __.GenLocal(ilty) = failwith "not needed" + member __.SetMarkToHere(m) = closeBock m + member __.EmitInstr x = instrs.Add x + member cg.EmitInstrs xs = for i in xs do cg.EmitInstr i } + g cg + closeBock (generateCodeLabel()) + let entry = generateCodeLabel() + // TODO: what about "I_ret" instruction??? + mkGroupBlock(internalLabels |> Seq.toList, mkBasicBlock { Label = entry; Instructions = [| I_br firstLabel |] } :: (blocks |> Seq.toList)) + + let mkBrIsData ilg (avoidHelpers, cuspec,cidx,tg,failLab) = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt @@ -393,196 +424,138 @@ let mkBrIsData ilg (avoidHelpers, cuspec,cidx,tg,failLab) = | _ -> failwith "unexpected" -let rec convInstr ilg (tmps: ILLocalsAllocator) inplab outlab instr = - match instr with - | I_other e when isIlxExtInstr e -> - match (destIlxExtInstr e) with - | EI_lddatatag (avoidHelpers,cuspec) -> - // If helpers exist, use them - match cuspec.HasHelpers with - | SpecialFSharpListHelpers - | AllHelpers - when not avoidHelpers -> InstrMorph [ mkGetTagFromHelpers ilg cuspec ] - | _ -> +let emitLdDataTagPrim ilg ldOpt (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxUnionSpec) = + // If helpers exist, use them + match cuspec.HasHelpers with + | (SpecialFSharpListHelpers | AllHelpers) when not avoidHelpers -> + ldOpt |> Option.iter cg.EmitInstr + cg.EmitInstr (mkGetTagFromHelpers ilg cuspec) + | _ -> - let alts = cuspec.Alternatives - match cuspecRepr.DiscriminationTechnique cuspec with - | TailOrNull -> - // leaves 1 if cons, 0 if not - InstrMorph (mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_cgt_un]) - | IntegerTag -> - let baseTy = baseTyOfUnionSpec cuspec - InstrMorph (mkGetTagFromField ilg cuspec baseTy) - | SingleCase -> - InstrMorph [ AI_pop; mkLdcInt32 0 ] - | RuntimeTypes -> - let baseTy = baseTyOfUnionSpec cuspec - let locn = tmps.AllocLocal (mkILLocal baseTy None) - - let mkCase last inplab cidx failLab = - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt + let alts = cuspec.Alternatives + match cuspecRepr.DiscriminationTechnique cuspec with + | TailOrNull -> + // leaves 1 if cons, 0 if not + ldOpt |> Option.iter cg.EmitInstr + cg.EmitInstrs (mkGetTailOrNull avoidHelpers cuspec @ [ AI_ldnull; AI_cgt_un]) + | IntegerTag -> + let baseTy = baseTyOfUnionSpec cuspec + ldOpt |> Option.iter cg.EmitInstr + cg.EmitInstrs (mkGetTagFromField ilg cuspec baseTy) + | SingleCase -> + ldOpt |> Option.iter cg.EmitInstr + cg.EmitInstrs [ AI_pop; mkLdcInt32 0 ] + | RuntimeTypes -> + let baseTy = baseTyOfUnionSpec cuspec + let ld = + match ldOpt with + | None -> + let locn = cg.GenLocal baseTy + // Add on a branch to the first input label. This gets optimized away by the printer/emitter. + cg.EmitInstr (mkStloc locn) + mkLdloc locn + | Some i -> i + + let outlab = cg.GenerateDelayMark() + + let emitCase cidx = + let alt = altOfUnionSpec cuspec cidx + let internalLab = cg.GenerateDelayMark() + let failLab = cg.GenerateDelayMark () + let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) + let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),cg.CodeLabel failLab,cg.CodeLabel internalLab) + let testBlock = + if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + [ test ] + else let altName = alt.Name - let internalLab = generateCodeLabel () - let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) - if last then - mkBasicBlock2 (inplab,[ mkLdcInt32 cidx; I_br outlab ]) - else - let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),failLab,internalLab) - let test_block = - if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then - [ test ] - else - mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy test - mkGroupBlock - ([internalLab], - [ mkBasicBlock2 (inplab, mkLdloc locn ::test_block); - mkBasicBlock2 (internalLab,[mkLdcInt32 cidx; I_br outlab ]) ]) - - // Make the block for the last test. - let lastInpLab = generateCodeLabel () - let lastBlock = mkCase true lastInpLab 0 outlab - - // Make the blocks for the remaining tests. - let _, firstInpLab, overallBlock = - List.foldBack - (fun _ (n, continueInpLab, continueBlock) -> - let newInpLab = generateCodeLabel () - n+1, - newInpLab, - mkGroupBlock - ([continueInpLab], - [ mkCase false newInpLab n continueInpLab; - continueBlock ])) - (List.tail alts) - (1,lastInpLab, lastBlock) + let altTy = tyForAlt cuspec alt + mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy test + cg.EmitInstrs (ld :: testBlock); + cg.SetMarkToHere internalLab + cg.EmitInstrs [mkLdcInt32 cidx; I_br (cg.CodeLabel outlab) ] + cg.SetMarkToHere failLab - // Add on a branch to the first input label. This gets optimized away by the printer/emitter. - InstrMorph - (mkGroupBlock - ([firstInpLab], - [ mkBasicBlock2 (inplab, [ mkStloc locn; I_br firstInpLab ]); - overallBlock ])) - - | EI_castdata (canfail,cuspec,cidx) -> - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then - if canfail then - let internal1 = generateCodeLabel () - InstrMorph - (mkGroupBlock - ([internal1], - [ mkBasicBlock2 (inplab, - [ AI_dup; - I_brcmp (BI_brfalse,outlab, internal1) ]); - mkBasicBlock2 (internal1, - [ mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; - I_throw ]); - ] )) - else - // If it can't fail, it's still verifiable just to leave the value on the stack unchecked - InstrMorph [] - - elif cuspecRepr.OptimizeAlternativeToRootClass (cuspec,alt) then - InstrMorph [] + // Make the blocks for the remaining tests. + for n in alts.Length-1 .. -1 .. 1 do + emitCase n - else InstrMorph [ I_castclass altTy ] - + // Make the block for the last test. + cg.EmitInstr (mkLdcInt32 0) + cg.SetMarkToHere outlab + +let emitLdDataTag ilg (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxUnionSpec) = + emitLdDataTagPrim ilg None cg (avoidHelpers,cuspec) + +let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = + let alt = altOfUnionSpec cuspec cidx + if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if canfail then + let outlab = cg.GenerateDelayMark () + let internal1 = cg.GenerateDelayMark () + cg.EmitInstrs [AI_dup; I_brcmp (BI_brfalse, cg.CodeLabel outlab, cg.CodeLabel internal1) ]; + cg.SetMarkToHere internal1 + cg.EmitInstrs [mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ] + cg.SetMarkToHere outlab + // If it can't fail, it's still verifiable just to leave the value on the stack unchecked + elif cuspecRepr.OptimizeAlternativeToRootClass (cuspec,alt) then + () + else + let altTy = tyForAlt cuspec alt + cg.EmitInstr (I_castclass altTy) - | EI_datacase (avoidHelpers, cuspec, cases, cont) -> - let baseTy = baseTyOfUnionSpec cuspec +let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases, cont) = + let baseTy = baseTyOfUnionSpec cuspec - match cuspecRepr.DiscriminationTechnique cuspec with - | RuntimeTypes -> - let locn = tmps.AllocLocal (mkILLocal baseTy None) - let mkCase _last inplab (cidx,tg) failLab = - let alt = altOfUnionSpec cuspec cidx - let altTy = tyForAlt cuspec alt - let altName = alt.Name - let _internalLab = generateCodeLabel () - let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) - - let test = - let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg,failLab) + match cuspecRepr.DiscriminationTechnique cuspec with + | RuntimeTypes -> + let locn = cg.GenLocal baseTy - [ mkLdloc locn ] @ - (if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then - [ testInstr ] - else - mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy testInstr) + cg.EmitInstr (mkStloc locn) - mkBasicBlock2 (inplab, test) - - // Make the block for the last test. - let lastInpLab = generateCodeLabel () - let lastCase, firstCases = - let l2 = List.rev cases - List.head l2, List.rev (List.tail l2) - - let lastBlock = mkCase true lastInpLab lastCase cont - - // Make the blocks for the remaining tests. - let firstInpLab,overallBlock = - List.foldBack - (fun caseInfo (continueInpLab, continueBlock) -> - let newInpLab = generateCodeLabel () - (newInpLab, mkGroupBlock - ([continueInpLab], - [ mkCase false newInpLab caseInfo continueInpLab; - continueBlock ]))) - firstCases - (lastInpLab, lastBlock) - - // Add on a branch to the first input label. This gets optimized - // away by the printer/emitter. - InstrMorph - (mkGroupBlock - ([firstInpLab], - [ mkBasicBlock2 (inplab, [ mkStloc locn; I_br firstInpLab ]); - overallBlock ])) - | IntegerTag -> - // Use a dictionary to avoid quadratic lookup in case list - let dict = System.Collections.Generic.Dictionary() - for (i,case) in cases do dict.[i] <- case - let mkCase i _ = - let mutable res = Unchecked.defaultof<_> - let ok = dict.TryGetValue(i, &res) - if ok then res else cont - - let dests = List.mapi mkCase cuspec.Alternatives - InstrMorph (mkGetTag ilg cuspec @ [ I_switch (dests,cont) ]) - | SingleCase -> - match cases with - | [(0,tg)] -> InstrMorph [ AI_pop; I_br tg ] - | [] -> InstrMorph [ AI_pop; I_br cont ] - | _ -> failwith "unexpected: strange switch on single-case unions should not be present" - | TailOrNull -> - failwith "unexpected: switches on lists should have been eliminated to brisdata tests" + for (cidx,tg) in cases do + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let altName = alt.Name + let failLab = cg.GenerateDelayMark () + let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) + + let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg,cg.CodeLabel failLab) + + cg.EmitInstr (mkLdloc locn) + if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + cg.EmitInstr testInstr + else + cg.EmitInstrs (mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy testInstr) + cg.SetMarkToHere failLab + cg.EmitInstr (I_br cont) - | _ -> InstrMorph [instr] - - -let convILMethodBody ilg il = - let tmps = ILLocalsAllocator il.Locals.Length - let code= morphExpandILInstrsInILCode (convInstr ilg tmps) il.Code - {il with - Locals = ILList.ofList (ILList.toList il.Locals @ tmps.Close()); - Code=code; - MaxStack=il.MaxStack+2 } - -let convMethodDef ilg md = - {md with mdBody= morphILMethodBody (convILMethodBody ilg) md.mdBody } - -let rec convTypeDef ilg td = - {td with NestedTypes = convTypeDefs ilg td.NestedTypes; - Methods=morphILMethodDefs (convMethodDef ilg) td.Methods; } -and convTypeDefs ilg tdefs : ILTypeDefs = - morphILTypeDefs (convTypeDef ilg) tdefs - -let ConvModule ilg modul = - morphILTypeDefsInILModule (convTypeDefs ilg) modul + | IntegerTag -> + match cases with + | [] -> cg.EmitInstrs [ AI_pop; I_br cont ] + | _ -> + // Use a dictionary to avoid quadratic lookup in case list + let dict = System.Collections.Generic.Dictionary() + for (i,case) in cases do dict.[i] <- case + let emitCase i _ = + let mutable res = Unchecked.defaultof<_> + let ok = dict.TryGetValue(i, &res) + if ok then res else cont + + let dests = Array.mapi emitCase cuspec.AlternativesArray + cg.EmitInstrs (mkGetTag ilg cuspec) + cg.EmitInstr (I_switch (Array.toList dests,cont)) + + | SingleCase -> + match cases with + | [(0,tg)] -> cg.EmitInstrs [ AI_pop; I_br tg ] + | [] -> cg.EmitInstrs [ AI_pop; I_br cont ] + | _ -> failwith "unexpected: strange switch on single-case unions should not be present" + + | TailOrNull -> + failwith "unexpected: switches on lists should have been eliminated to brisdata tests" + //--------------------------------------------------- @@ -994,33 +967,19 @@ let mkClassUnionDef ilg tref td cud = |> Array.mapi (fun num alt -> mkILLiteralField (alt.Name, tagFieldType, ILFieldInit.Int32 num, None, ILMemberAccess.Public)) |> Array.toList + let tagMeths,tagProps = + + let body = mkMethodBody(true,emptyILLocals,2,genWith (fun cg -> emitLdDataTagPrim ilg (Some mkLdarg0) cg (true, cuspec); cg.EmitInstr I_ret), cud.cudWhere) // // If we are using NULL as a representation for an element of this type then we cannot // // use an instance method if (repr.OptimizingOneAlternativeToNull info) then - [ mkILNonGenericStaticMethod - ("Get" + tagPropertyName, - cud.cudHelpersAccess, - [mkILParamAnon baseTy], - mkILReturn tagFieldType, - mkMethodBody(true,emptyILLocals,2, - nonBranchingInstrsToCode - [ mkLdarg0; - (mkIlxInstr (EI_lddatatag (true, cuspec))) ], - cud.cudWhere)) + [ mkILNonGenericStaticMethod("Get" + tagPropertyName,cud.cudHelpersAccess,[mkILParamAnon baseTy],mkILReturn tagFieldType,body) |> addMethodGeneratedAttrs ilg ], [] else - [ mkILNonGenericInstanceMethod - ("get_" + tagPropertyName, - cud.cudHelpersAccess,[], - mkILReturn tagFieldType, - mkMethodBody(true,emptyILLocals,2, - nonBranchingInstrsToCode - [ mkLdarg0; - (mkIlxInstr (EI_lddatatag (true, cuspec))) ], - cud.cudWhere)) + [ mkILNonGenericInstanceMethod("get_" + tagPropertyName,cud.cudHelpersAccess,[],mkILReturn tagFieldType,body) |> addMethodGeneratedAttrs ilg ], [ { Name=tagPropertyName; @@ -1111,27 +1070,6 @@ let mkClassUnionDef ilg tref td cud = // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit -(* - printfn "union type %s has helpers = %+A" td.Name cud.cudHasHelpers - for md in td.Methods do - printfn "original union type %s has method %s" td.Name md.Name - for pd in td.Properties.AsList do - printfn "original union type %s has property %s" td.Name pd.Name - for md in baseTypeDef.Methods.AsList do - printfn "type %s has method %s" baseTypeDef.Name md.Name - for pd in baseTypeDef.Properties.AsList do - printfn "type %s has property %s" baseTypeDef.Name pd.Name - - for pd in tagProps do - printfn "type %s has tag property %s" baseTypeDef.Name pd.Name - for pd in basePropsFromAlt do - printfn "type %s has basePropsFromAlt property %s" baseTypeDef.Name pd.Name - for pd in selfProps do - printfn "type %s has selfProps property %s" baseTypeDef.Name pd.Name - for pd in existingProps do - printfn "type %s has existingProps property %s" baseTypeDef.Name pd.Name -*) - baseTypeDef diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index 66a867fc09a..090061573db 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -15,5 +15,16 @@ val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list val mkStData : IlxUnionSpec * int * int -> ILInstr list val mkBrIsData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel -> ILInstr list val mkClassUnionDef : ILGlobals -> ILTypeRef -> ILTypeDef -> IlxUnionInfo -> ILTypeDef -val ConvModule: ILGlobals -> ILModuleDef -> ILModuleDef val GetILTypeForAlternative : IlxUnionSpec -> int -> ILType + +type ICodeGen<'Mark> = + abstract CodeLabel: 'Mark -> ILCodeLabel + abstract GenerateDelayMark: unit -> 'Mark + abstract GenLocal: ILType -> uint16 + abstract SetMarkToHere: 'Mark -> unit + abstract EmitInstr : ILInstr -> unit + abstract EmitInstrs : ILInstr list -> unit + +val emitCastData : ILGlobals -> ICodeGen<'Mark> -> canfail: bool * IlxUnionSpec * int -> unit +val emitLdDataTag : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec -> unit +val emitDataSwitch : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel -> unit From 06556b65a40c58b30048b71a03dad1eb93913c92 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 7 Jun 2016 19:26:47 +0100 Subject: [PATCH 240/334] updates to tests --- .../EmittedIL/ComputationExpressions/keep.lst | 2 +- .../EmittedIL/Misc/EqualsOnUnions01.il.bsl | 576 +++++++++--------- .../Misc/EqualsOnUnions01.il.netfx4.bsl | 471 +++++++------- .../QueryExpressionStepping/keep.lst | 2 +- .../ToplevelModule.il.bsl | 20 +- .../ToplevelNamespace.il.bsl | 16 +- .../SteppingMatch/SteppingMatch03.il.bsl | 106 ++-- .../SteppingMatch/SteppingMatch04.il.bsl | 106 ++-- 8 files changed, 648 insertions(+), 651 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/ComputationExpressions/keep.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/ComputationExpressions/keep.lst index 9304c7c3ab6..f59ec20aabf 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/ComputationExpressions/keep.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/ComputationExpressions/keep.lst @@ -1 +1 @@ -ComputationExprLibrary.dll \ No newline at end of file +* \ No newline at end of file diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.bsl index d6b38a92de6..b01b5b049cf 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.1 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly EqualsOnUnions01 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.EqualsOnUnions01 { - // Offset: 0x00000000 Length: 0x00000657 + // Offset: 0x00000000 Length: 0x0000064B } .mresource public FSharpOptimizationData.EqualsOnUnions01 { - // Offset: 0x00000660 Length: 0x000001C7 + // Offset: 0x00000650 Length: 0x000001C7 } .module EqualsOnUnions01.exe -// MVID: {4BEB2859-BBFB-14A0-A745-03835928EB4B} +// MVID: {57570CD9-BBFB-14A0-A745-0383D90C5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x001E0000 +// Image base: 0x01410000 // =============== CLASS MEMBERS DECLARATION =================== @@ -83,7 +83,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 7 (0x7) - .maxstack 2 + .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void EqualsOnUnions01/U::.ctor() IL_0006: ret @@ -109,7 +109,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) - .maxstack 2 + .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void EqualsOnUnions01/U::.ctor() IL_0006: ldarg.0 @@ -118,12 +118,13 @@ IL_000d: ret } // end of method B::.ctor - .method public instance int32 get_Item() cil managed + .method public hidebysig instance int32 + get_Item() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 7 (0x7) - .maxstack 4 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldfld int32 EqualsOnUnions01/U/B::item IL_0006: ret @@ -153,7 +154,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) - .maxstack 3 + .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ldarg.0 @@ -177,7 +178,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) - .maxstack 3 + .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ldarg.0 @@ -186,12 +187,13 @@ IL_000d: ret } // end of method B@DebugTypeProxy::.ctor - .method public instance int32 get_Item() cil managed + .method public hidebysig instance int32 + get_Item() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 12 (0xc) - .maxstack 4 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldfld class EqualsOnUnions01/U/B EqualsOnUnions01/U/B@DebugTypeProxy::_obj IL_0006: ldfld int32 EqualsOnUnions01/U/B::item @@ -217,7 +219,7 @@ void .cctor() cil managed { // Code size 11 (0xb) - .maxstack 1 + .maxstack 8 IL_0000: newobj instance void EqualsOnUnions01/U/_A::.ctor() IL_0005: stsfld class EqualsOnUnions01/U EqualsOnUnions01/U::_unique_A IL_000a: ret @@ -229,88 +231,88 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 7 (0x7) - .maxstack 2 + .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method U::.ctor .method public static class EqualsOnUnions01/U - NewB(int32 item) cil managed + get_A() cil managed { .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, - int32) = ( 01 00 08 00 00 00 01 00 00 00 00 00 ) - // Code size 7 (0x7) - .maxstack 3 - IL_0000: ldarg.0 - IL_0001: newobj instance void EqualsOnUnions01/U/B::.ctor(int32) - IL_0006: ret - } // end of method U::NewB + int32) = ( 01 00 08 00 00 00 00 00 00 00 00 00 ) + // Code size 6 (0x6) + .maxstack 8 + IL_0000: ldsfld class EqualsOnUnions01/U EqualsOnUnions01/U::_unique_A + IL_0005: ret + } // end of method U::get_A - .method public instance bool get_IsB() cil managed + .method public hidebysig instance bool + get_IsA() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 10 (0xa) - .maxstack 4 + .maxstack 8 IL_0000: ldarg.0 - IL_0001: isinst EqualsOnUnions01/U/B + IL_0001: isinst EqualsOnUnions01/U/_A IL_0006: ldnull IL_0007: cgt.un IL_0009: ret - } // end of method U::get_IsB + } // end of method U::get_IsA .method public static class EqualsOnUnions01/U - get_A() cil managed + NewB(int32 item) cil managed { .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, - int32) = ( 01 00 08 00 00 00 00 00 00 00 00 00 ) - // Code size 6 (0x6) - .maxstack 2 - IL_0000: ldsfld class EqualsOnUnions01/U EqualsOnUnions01/U::_unique_A - IL_0005: ret - } // end of method U::get_A + int32) = ( 01 00 08 00 00 00 01 00 00 00 00 00 ) + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: newobj instance void EqualsOnUnions01/U/B::.ctor(int32) + IL_0006: ret + } // end of method U::NewB - .method public instance bool get_IsA() cil managed + .method public hidebysig instance bool + get_IsB() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 10 (0xa) - .maxstack 4 + .maxstack 8 IL_0000: ldarg.0 - IL_0001: isinst EqualsOnUnions01/U/_A + IL_0001: isinst EqualsOnUnions01/U/B IL_0006: ldnull IL_0007: cgt.un IL_0009: ret - } // end of method U::get_IsA + } // end of method U::get_IsB - .method public instance int32 get_Tag() cil managed + .method public hidebysig instance int32 + get_Tag() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 15 (0xf) - .maxstack 4 - .locals init (class EqualsOnUnions01/U V_0) + // Code size 13 (0xd) + .maxstack 8 IL_0000: ldarg.0 - IL_0001: stloc.0 - IL_0002: ldloc.0 - IL_0003: isinst EqualsOnUnions01/U/B - IL_0008: brfalse.s IL_000d + IL_0001: isinst EqualsOnUnions01/U/B + IL_0006: brfalse.s IL_000b - IL_000a: ldc.i4.1 - IL_000b: br.s IL_000e + IL_0008: ldc.i4.1 + IL_0009: br.s IL_000c - IL_000d: ldc.i4.0 - IL_000e: ret + IL_000b: ldc.i4.0 + IL_000c: ret } // end of method U::get_Tag - .method assembly specialname instance object - __DebugDisplay() cil managed + .method assembly hidebysig specialname + instance object __DebugDisplay() cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 22 (0x16) - .maxstack 4 + .maxstack 8 IL_0000: ldstr "%+0.8A" IL_0005: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5,class [FSharp.Core]Microsoft.FSharp.Core.Unit,string,string,string>::.ctor(string) IL_000a: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatToString>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) @@ -326,14 +328,14 @@ // Code size 159 (0x9f) .maxstack 4 .locals init (int32 V_0, - int32 V_1, - class EqualsOnUnions01/U/B V_2, - class EqualsOnUnions01/U/B V_3, - class [mscorlib]System.Collections.IComparer V_4, - int32 V_5, - int32 V_6, - class EqualsOnUnions01/U V_7, - class EqualsOnUnions01/U V_8) + class EqualsOnUnions01/U V_1, + int32 V_2, + class EqualsOnUnions01/U V_3, + class EqualsOnUnions01/U/B V_4, + class EqualsOnUnions01/U/B V_5, + class [mscorlib]System.Collections.IComparer V_6, + int32 V_7, + int32 V_8) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -354,59 +356,59 @@ IL_0016: br IL_008f IL_001b: ldarg.0 - IL_001c: stloc.s V_7 - IL_001e: ldloc.s V_7 - IL_0020: isinst EqualsOnUnions01/U/B - IL_0025: brfalse.s IL_002a - - IL_0027: ldc.i4.1 - IL_0028: br.s IL_002b - - IL_002a: ldc.i4.0 - IL_002b: stloc.0 - IL_002c: ldarg.1 - IL_002d: stloc.s V_8 - IL_002f: ldloc.s V_8 - IL_0031: isinst EqualsOnUnions01/U/B - IL_0036: brfalse.s IL_003b - - IL_0038: ldc.i4.1 - IL_0039: br.s IL_003c - - IL_003b: ldc.i4.0 - IL_003c: stloc.1 - IL_003d: ldloc.0 - IL_003e: ldloc.1 - IL_003f: bne.un.s IL_0043 + IL_001c: stloc.1 + IL_001d: ldloc.1 + IL_001e: isinst EqualsOnUnions01/U/B + IL_0023: brfalse.s IL_0028 + + IL_0025: ldc.i4.1 + IL_0026: br.s IL_0029 + + IL_0028: ldc.i4.0 + IL_0029: stloc.0 + IL_002a: ldarg.1 + IL_002b: stloc.3 + IL_002c: ldloc.3 + IL_002d: isinst EqualsOnUnions01/U/B + IL_0032: brfalse.s IL_0037 - IL_0041: br.s IL_0045 + IL_0034: ldc.i4.1 + IL_0035: br.s IL_0038 - IL_0043: br.s IL_008b + IL_0037: ldc.i4.0 + IL_0038: stloc.2 + IL_0039: ldloc.0 + IL_003a: ldloc.2 + IL_003b: bne.un.s IL_003f - IL_0045: ldarg.0 - IL_0046: isinst EqualsOnUnions01/U/B - IL_004b: brfalse.s IL_004f + IL_003d: br.s IL_0041 - IL_004d: br.s IL_0051 + IL_003f: br.s IL_008b - IL_004f: br.s IL_0089 + IL_0041: ldarg.0 + IL_0042: isinst EqualsOnUnions01/U/B + IL_0047: brfalse.s IL_004b - IL_0051: ldarg.0 - IL_0052: castclass EqualsOnUnions01/U/B - IL_0057: stloc.2 - IL_0058: ldarg.1 - IL_0059: castclass EqualsOnUnions01/U/B - IL_005e: stloc.3 - IL_005f: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() - IL_0064: stloc.s V_4 - IL_0066: ldloc.2 - IL_0067: ldfld int32 EqualsOnUnions01/U/B::item - IL_006c: stloc.s V_5 - IL_006e: ldloc.3 + IL_0049: br.s IL_004d + + IL_004b: br.s IL_0089 + + IL_004d: ldarg.0 + IL_004e: castclass EqualsOnUnions01/U/B + IL_0053: stloc.s V_4 + IL_0055: ldarg.1 + IL_0056: castclass EqualsOnUnions01/U/B + IL_005b: stloc.s V_5 + IL_005d: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0062: stloc.s V_6 + IL_0064: ldloc.s V_4 + IL_0066: ldfld int32 EqualsOnUnions01/U/B::item + IL_006b: stloc.s V_7 + IL_006d: ldloc.s V_5 IL_006f: ldfld int32 EqualsOnUnions01/U/B::item - IL_0074: stloc.s V_6 - IL_0076: ldloc.s V_5 - IL_0078: ldloc.s V_6 + IL_0074: stloc.s V_8 + IL_0076: ldloc.s V_7 + IL_0078: ldloc.s V_8 IL_007a: bge.s IL_007e IL_007c: br.s IL_0080 @@ -416,8 +418,8 @@ IL_0080: ldc.i4.m1 IL_0081: ret - IL_0082: ldloc.s V_5 - IL_0084: ldloc.s V_6 + IL_0082: ldloc.s V_7 + IL_0084: ldloc.s V_8 IL_0086: cgt IL_0088: ret @@ -425,7 +427,7 @@ IL_008a: ret IL_008b: ldloc.0 - IL_008c: ldloc.1 + IL_008c: ldloc.2 IL_008d: sub IL_008e: ret @@ -453,14 +455,14 @@ { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) - .maxstack 4 + .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 6,6 : 6,7 + .line 6,6 : 6,7 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\Misc\\EqualsOnUnions01.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 IL_0003: unbox.any EqualsOnUnions01/U - IL_0008: call instance int32 EqualsOnUnions01/U::CompareTo(class EqualsOnUnions01/U) + IL_0008: callvirt instance int32 EqualsOnUnions01/U::CompareTo(class EqualsOnUnions01/U) IL_000d: ret } // end of method U::CompareTo @@ -473,15 +475,15 @@ .maxstack 4 .locals init ([0] class EqualsOnUnions01/U V_0, [1] int32 V_1, - [2] int32 V_2, - [3] class EqualsOnUnions01/U/B V_3, - [4] class EqualsOnUnions01/U/B V_4, - [5] class [mscorlib]System.Collections.IComparer V_5, - [6] int32 V_6, - [7] int32 V_7, - [8] class EqualsOnUnions01/U V_8, - [9] class EqualsOnUnions01/U V_9) - .line 6,6 : 6,7 + [2] class EqualsOnUnions01/U V_2, + [3] int32 V_3, + [4] class EqualsOnUnions01/U V_4, + [5] class EqualsOnUnions01/U/B V_5, + [6] class EqualsOnUnions01/U/B V_6, + [7] class [mscorlib]System.Collections.IComparer V_7, + [8] int32 V_8, + [9] int32 V_9) + .line 6,6 : 6,7 '' IL_0000: nop IL_0001: ldarg.1 IL_0002: unbox.any EqualsOnUnions01/U @@ -495,7 +497,7 @@ IL_0010: br IL_009b - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0015: ldarg.1 IL_0016: unbox.any EqualsOnUnions01/U IL_001b: ldnull @@ -506,94 +508,94 @@ IL_0022: br IL_0099 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0027: ldarg.0 - IL_0028: stloc.s V_8 - IL_002a: ldloc.s V_8 - IL_002c: isinst EqualsOnUnions01/U/B - IL_0031: brfalse.s IL_0036 - - IL_0033: ldc.i4.1 - IL_0034: br.s IL_0037 - - IL_0036: ldc.i4.0 - IL_0037: stloc.1 - IL_0038: ldloc.0 - IL_0039: stloc.s V_9 - IL_003b: ldloc.s V_9 - IL_003d: isinst EqualsOnUnions01/U/B - IL_0042: brfalse.s IL_0047 - - IL_0044: ldc.i4.1 - IL_0045: br.s IL_0048 - - IL_0047: ldc.i4.0 - IL_0048: stloc.2 - IL_0049: ldloc.1 - IL_004a: ldloc.2 - IL_004b: bne.un.s IL_004f - - IL_004d: br.s IL_0051 - - IL_004f: br.s IL_0095 - - .line 100001,100001 : 0,0 - IL_0051: ldarg.0 - IL_0052: isinst EqualsOnUnions01/U/B - IL_0057: brfalse.s IL_005b - - IL_0059: br.s IL_005d - - IL_005b: br.s IL_0093 - - .line 100001,100001 : 0,0 - IL_005d: ldarg.0 - IL_005e: castclass EqualsOnUnions01/U/B - IL_0063: stloc.3 - IL_0064: ldloc.0 - IL_0065: castclass EqualsOnUnions01/U/B - IL_006a: stloc.s V_4 - IL_006c: ldarg.2 - IL_006d: stloc.s V_5 - IL_006f: ldloc.3 + IL_0028: stloc.2 + IL_0029: ldloc.2 + IL_002a: isinst EqualsOnUnions01/U/B + IL_002f: brfalse.s IL_0034 + + IL_0031: ldc.i4.1 + IL_0032: br.s IL_0035 + + IL_0034: ldc.i4.0 + IL_0035: stloc.1 + IL_0036: ldloc.0 + IL_0037: stloc.s V_4 + IL_0039: ldloc.s V_4 + IL_003b: isinst EqualsOnUnions01/U/B + IL_0040: brfalse.s IL_0045 + + IL_0042: ldc.i4.1 + IL_0043: br.s IL_0046 + + IL_0045: ldc.i4.0 + IL_0046: stloc.3 + IL_0047: ldloc.1 + IL_0048: ldloc.3 + IL_0049: bne.un.s IL_004d + + IL_004b: br.s IL_004f + + IL_004d: br.s IL_0095 + + .line 100001,100001 : 0,0 '' + IL_004f: ldarg.0 + IL_0050: isinst EqualsOnUnions01/U/B + IL_0055: brfalse.s IL_0059 + + IL_0057: br.s IL_005b + + IL_0059: br.s IL_0093 + + .line 100001,100001 : 0,0 '' + IL_005b: ldarg.0 + IL_005c: castclass EqualsOnUnions01/U/B + IL_0061: stloc.s V_5 + IL_0063: ldloc.0 + IL_0064: castclass EqualsOnUnions01/U/B + IL_0069: stloc.s V_6 + IL_006b: ldarg.2 + IL_006c: stloc.s V_7 + IL_006e: ldloc.s V_5 IL_0070: ldfld int32 EqualsOnUnions01/U/B::item - IL_0075: stloc.s V_6 - IL_0077: ldloc.s V_4 + IL_0075: stloc.s V_8 + IL_0077: ldloc.s V_6 IL_0079: ldfld int32 EqualsOnUnions01/U/B::item - IL_007e: stloc.s V_7 - IL_0080: ldloc.s V_6 - IL_0082: ldloc.s V_7 + IL_007e: stloc.s V_9 + IL_0080: ldloc.s V_8 + IL_0082: ldloc.s V_9 IL_0084: bge.s IL_0088 IL_0086: br.s IL_008a IL_0088: br.s IL_008c - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_008a: ldc.i4.m1 IL_008b: ret - .line 100001,100001 : 0,0 - IL_008c: ldloc.s V_6 - IL_008e: ldloc.s V_7 + .line 100001,100001 : 0,0 '' + IL_008c: ldloc.s V_8 + IL_008e: ldloc.s V_9 IL_0090: cgt IL_0092: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0093: ldc.i4.0 IL_0094: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0095: ldloc.1 - IL_0096: ldloc.2 + IL_0096: ldloc.3 IL_0097: sub IL_0098: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0099: ldc.i4.1 IL_009a: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_009b: ldarg.1 IL_009c: unbox.any EqualsOnUnions01/U IL_00a1: ldnull @@ -604,11 +606,11 @@ IL_00a8: br.s IL_00ac - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_00aa: ldc.i4.m1 IL_00ab: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_00ac: ldc.i4.0 IL_00ad: ret } // end of method U::CompareTo @@ -683,12 +685,12 @@ { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 13 (0xd) - .maxstack 4 - .line 6,6 : 6,7 + .maxstack 8 + .line 6,6 : 6,7 '' IL_0000: nop IL_0001: ldarg.0 IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() - IL_0007: call instance int32 EqualsOnUnions01/U::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) + IL_0007: callvirt instance int32 EqualsOnUnions01/U::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) IL_000c: ret } // end of method U::GetHashCode @@ -702,12 +704,12 @@ .locals init (class EqualsOnUnions01/U V_0, class EqualsOnUnions01/U V_1, int32 V_2, - int32 V_3, - class EqualsOnUnions01/U/B V_4, - class EqualsOnUnions01/U/B V_5, - class [mscorlib]System.Collections.IEqualityComparer V_6, - class EqualsOnUnions01/U V_7, - class EqualsOnUnions01/U V_8) + class EqualsOnUnions01/U V_3, + int32 V_4, + class EqualsOnUnions01/U V_5, + class EqualsOnUnions01/U/B V_6, + class EqualsOnUnions01/U/B V_7, + class [mscorlib]System.Collections.IEqualityComparer V_8) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -731,29 +733,29 @@ IL_001c: ldloc.0 IL_001d: stloc.1 IL_001e: ldarg.0 - IL_001f: stloc.s V_7 - IL_0021: ldloc.s V_7 - IL_0023: isinst EqualsOnUnions01/U/B - IL_0028: brfalse.s IL_002d - - IL_002a: ldc.i4.1 - IL_002b: br.s IL_002e - - IL_002d: ldc.i4.0 - IL_002e: stloc.2 - IL_002f: ldloc.1 - IL_0030: stloc.s V_8 - IL_0032: ldloc.s V_8 - IL_0034: isinst EqualsOnUnions01/U/B - IL_0039: brfalse.s IL_003e - - IL_003b: ldc.i4.1 - IL_003c: br.s IL_003f - - IL_003e: ldc.i4.0 - IL_003f: stloc.3 - IL_0040: ldloc.2 - IL_0041: ldloc.3 + IL_001f: stloc.3 + IL_0020: ldloc.3 + IL_0021: isinst EqualsOnUnions01/U/B + IL_0026: brfalse.s IL_002b + + IL_0028: ldc.i4.1 + IL_0029: br.s IL_002c + + IL_002b: ldc.i4.0 + IL_002c: stloc.2 + IL_002d: ldloc.1 + IL_002e: stloc.s V_5 + IL_0030: ldloc.s V_5 + IL_0032: isinst EqualsOnUnions01/U/B + IL_0037: brfalse.s IL_003c + + IL_0039: ldc.i4.1 + IL_003a: br.s IL_003d + + IL_003c: ldc.i4.0 + IL_003d: stloc.s V_4 + IL_003f: ldloc.2 + IL_0040: ldloc.s V_4 IL_0042: bne.un.s IL_0046 IL_0044: br.s IL_0048 @@ -770,15 +772,15 @@ IL_0054: ldarg.0 IL_0055: castclass EqualsOnUnions01/U/B - IL_005a: stloc.s V_4 + IL_005a: stloc.s V_6 IL_005c: ldloc.1 IL_005d: castclass EqualsOnUnions01/U/B - IL_0062: stloc.s V_5 + IL_0062: stloc.s V_7 IL_0064: ldarg.2 - IL_0065: stloc.s V_6 - IL_0067: ldloc.s V_4 + IL_0065: stloc.s V_8 + IL_0067: ldloc.s V_6 IL_0069: ldfld int32 EqualsOnUnions01/U/B::item - IL_006e: ldloc.s V_5 + IL_006e: ldloc.s V_7 IL_0070: ldfld int32 EqualsOnUnions01/U/B::item IL_0075: ceq IL_0077: ret @@ -807,11 +809,11 @@ // Code size 121 (0x79) .maxstack 4 .locals init (int32 V_0, - int32 V_1, - class EqualsOnUnions01/U/B V_2, - class EqualsOnUnions01/U/B V_3, - class EqualsOnUnions01/U V_4, - class EqualsOnUnions01/U V_5) + class EqualsOnUnions01/U V_1, + int32 V_2, + class EqualsOnUnions01/U V_3, + class EqualsOnUnions01/U/B V_4, + class EqualsOnUnions01/U/B V_5) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -832,52 +834,52 @@ IL_0016: br.s IL_006f IL_0018: ldarg.0 - IL_0019: stloc.s V_4 - IL_001b: ldloc.s V_4 - IL_001d: isinst EqualsOnUnions01/U/B - IL_0022: brfalse.s IL_0027 - - IL_0024: ldc.i4.1 - IL_0025: br.s IL_0028 - - IL_0027: ldc.i4.0 - IL_0028: stloc.0 - IL_0029: ldarg.1 - IL_002a: stloc.s V_5 - IL_002c: ldloc.s V_5 - IL_002e: isinst EqualsOnUnions01/U/B - IL_0033: brfalse.s IL_0038 - - IL_0035: ldc.i4.1 - IL_0036: br.s IL_0039 - - IL_0038: ldc.i4.0 - IL_0039: stloc.1 - IL_003a: ldloc.0 - IL_003b: ldloc.1 - IL_003c: bne.un.s IL_0040 - - IL_003e: br.s IL_0042 - - IL_0040: br.s IL_006d - - IL_0042: ldarg.0 - IL_0043: isinst EqualsOnUnions01/U/B - IL_0048: brfalse.s IL_004c - - IL_004a: br.s IL_004e - - IL_004c: br.s IL_006b - - IL_004e: ldarg.0 - IL_004f: castclass EqualsOnUnions01/U/B - IL_0054: stloc.2 - IL_0055: ldarg.1 - IL_0056: castclass EqualsOnUnions01/U/B - IL_005b: stloc.3 - IL_005c: ldloc.2 - IL_005d: ldfld int32 EqualsOnUnions01/U/B::item - IL_0062: ldloc.3 + IL_0019: stloc.1 + IL_001a: ldloc.1 + IL_001b: isinst EqualsOnUnions01/U/B + IL_0020: brfalse.s IL_0025 + + IL_0022: ldc.i4.1 + IL_0023: br.s IL_0026 + + IL_0025: ldc.i4.0 + IL_0026: stloc.0 + IL_0027: ldarg.1 + IL_0028: stloc.3 + IL_0029: ldloc.3 + IL_002a: isinst EqualsOnUnions01/U/B + IL_002f: brfalse.s IL_0034 + + IL_0031: ldc.i4.1 + IL_0032: br.s IL_0035 + + IL_0034: ldc.i4.0 + IL_0035: stloc.2 + IL_0036: ldloc.0 + IL_0037: ldloc.2 + IL_0038: bne.un.s IL_003c + + IL_003a: br.s IL_003e + + IL_003c: br.s IL_006d + + IL_003e: ldarg.0 + IL_003f: isinst EqualsOnUnions01/U/B + IL_0044: brfalse.s IL_0048 + + IL_0046: br.s IL_004a + + IL_0048: br.s IL_006b + + IL_004a: ldarg.0 + IL_004b: castclass EqualsOnUnions01/U/B + IL_0050: stloc.s V_4 + IL_0052: ldarg.1 + IL_0053: castclass EqualsOnUnions01/U/B + IL_0058: stloc.s V_5 + IL_005a: ldloc.s V_4 + IL_005c: ldfld int32 EqualsOnUnions01/U/B::item + IL_0061: ldloc.s V_5 IL_0063: ldfld int32 EqualsOnUnions01/U/B::item IL_0068: ceq IL_006a: ret @@ -919,7 +921,7 @@ IL_000f: ldarg.0 IL_0010: ldloc.0 - IL_0011: call instance bool EqualsOnUnions01/U::Equals(class EqualsOnUnions01/U) + IL_0011: callvirt instance bool EqualsOnUnions01/U::Equals(class EqualsOnUnions01/U) IL_0016: ret IL_0017: ldc.i4.0 @@ -933,13 +935,6 @@ .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) .get instance int32 EqualsOnUnions01/U::get_Tag() } // end of property U::Tag - .property instance bool IsB() - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) - .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) - .get instance bool EqualsOnUnions01/U::get_IsB() - } // end of property U::IsB .property class EqualsOnUnions01/U A() { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) @@ -954,6 +949,13 @@ .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) .get instance bool EqualsOnUnions01/U::get_IsA() } // end of property U::IsA + .property instance bool IsB() + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .get instance bool EqualsOnUnions01/U::get_IsB() + } // end of property U::IsB } // end of class U } // end of class EqualsOnUnions01 @@ -965,7 +967,7 @@ { .entrypoint // Code size 2 (0x2) - .maxstack 2 + .maxstack 8 IL_0000: nop IL_0001: ret } // end of method $EqualsOnUnions01::main@ diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.netfx4.bsl index 9fbe31122c9..b01b5b049cf 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Misc/EqualsOnUnions01.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.17376 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:3:0:0 + .ver 4:4:1:0 } .assembly EqualsOnUnions01 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.EqualsOnUnions01 { - // Offset: 0x00000000 Length: 0x00000667 + // Offset: 0x00000000 Length: 0x0000064B } .mresource public FSharpOptimizationData.EqualsOnUnions01 { - // Offset: 0x00000670 Length: 0x000001C7 + // Offset: 0x00000650 Length: 0x000001C7 } .module EqualsOnUnions01.exe -// MVID: {4F20DEF4-BBFB-14A0-A745-0383F4DE204F} +// MVID: {57570CD9-BBFB-14A0-A745-0383D90C5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000006024A50000 +// Image base: 0x01410000 // =============== CLASS MEMBERS DECLARATION =================== @@ -293,20 +293,17 @@ { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 15 (0xf) - .maxstack 4 - .locals init (class EqualsOnUnions01/U V_0) + // Code size 13 (0xd) + .maxstack 8 IL_0000: ldarg.0 - IL_0001: stloc.0 - IL_0002: ldloc.0 - IL_0003: isinst EqualsOnUnions01/U/B - IL_0008: brfalse.s IL_000d + IL_0001: isinst EqualsOnUnions01/U/B + IL_0006: brfalse.s IL_000b - IL_000a: ldc.i4.1 - IL_000b: br.s IL_000e + IL_0008: ldc.i4.1 + IL_0009: br.s IL_000c - IL_000d: ldc.i4.0 - IL_000e: ret + IL_000b: ldc.i4.0 + IL_000c: ret } // end of method U::get_Tag .method assembly hidebysig specialname @@ -331,14 +328,14 @@ // Code size 159 (0x9f) .maxstack 4 .locals init (int32 V_0, - int32 V_1, - class EqualsOnUnions01/U/B V_2, - class EqualsOnUnions01/U/B V_3, - class [mscorlib]System.Collections.IComparer V_4, - int32 V_5, - int32 V_6, - class EqualsOnUnions01/U V_7, - class EqualsOnUnions01/U V_8) + class EqualsOnUnions01/U V_1, + int32 V_2, + class EqualsOnUnions01/U V_3, + class EqualsOnUnions01/U/B V_4, + class EqualsOnUnions01/U/B V_5, + class [mscorlib]System.Collections.IComparer V_6, + int32 V_7, + int32 V_8) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -359,59 +356,59 @@ IL_0016: br IL_008f IL_001b: ldarg.0 - IL_001c: stloc.s V_7 - IL_001e: ldloc.s V_7 - IL_0020: isinst EqualsOnUnions01/U/B - IL_0025: brfalse.s IL_002a - - IL_0027: ldc.i4.1 - IL_0028: br.s IL_002b - - IL_002a: ldc.i4.0 - IL_002b: stloc.0 - IL_002c: ldarg.1 - IL_002d: stloc.s V_8 - IL_002f: ldloc.s V_8 - IL_0031: isinst EqualsOnUnions01/U/B - IL_0036: brfalse.s IL_003b - - IL_0038: ldc.i4.1 - IL_0039: br.s IL_003c - - IL_003b: ldc.i4.0 - IL_003c: stloc.1 - IL_003d: ldloc.0 - IL_003e: ldloc.1 - IL_003f: bne.un.s IL_0043 + IL_001c: stloc.1 + IL_001d: ldloc.1 + IL_001e: isinst EqualsOnUnions01/U/B + IL_0023: brfalse.s IL_0028 + + IL_0025: ldc.i4.1 + IL_0026: br.s IL_0029 + + IL_0028: ldc.i4.0 + IL_0029: stloc.0 + IL_002a: ldarg.1 + IL_002b: stloc.3 + IL_002c: ldloc.3 + IL_002d: isinst EqualsOnUnions01/U/B + IL_0032: brfalse.s IL_0037 - IL_0041: br.s IL_0045 + IL_0034: ldc.i4.1 + IL_0035: br.s IL_0038 - IL_0043: br.s IL_008b + IL_0037: ldc.i4.0 + IL_0038: stloc.2 + IL_0039: ldloc.0 + IL_003a: ldloc.2 + IL_003b: bne.un.s IL_003f - IL_0045: ldarg.0 - IL_0046: isinst EqualsOnUnions01/U/B - IL_004b: brfalse.s IL_004f + IL_003d: br.s IL_0041 - IL_004d: br.s IL_0051 + IL_003f: br.s IL_008b - IL_004f: br.s IL_0089 + IL_0041: ldarg.0 + IL_0042: isinst EqualsOnUnions01/U/B + IL_0047: brfalse.s IL_004b - IL_0051: ldarg.0 - IL_0052: castclass EqualsOnUnions01/U/B - IL_0057: stloc.2 - IL_0058: ldarg.1 - IL_0059: castclass EqualsOnUnions01/U/B - IL_005e: stloc.3 - IL_005f: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() - IL_0064: stloc.s V_4 - IL_0066: ldloc.2 - IL_0067: ldfld int32 EqualsOnUnions01/U/B::item - IL_006c: stloc.s V_5 - IL_006e: ldloc.3 + IL_0049: br.s IL_004d + + IL_004b: br.s IL_0089 + + IL_004d: ldarg.0 + IL_004e: castclass EqualsOnUnions01/U/B + IL_0053: stloc.s V_4 + IL_0055: ldarg.1 + IL_0056: castclass EqualsOnUnions01/U/B + IL_005b: stloc.s V_5 + IL_005d: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0062: stloc.s V_6 + IL_0064: ldloc.s V_4 + IL_0066: ldfld int32 EqualsOnUnions01/U/B::item + IL_006b: stloc.s V_7 + IL_006d: ldloc.s V_5 IL_006f: ldfld int32 EqualsOnUnions01/U/B::item - IL_0074: stloc.s V_6 - IL_0076: ldloc.s V_5 - IL_0078: ldloc.s V_6 + IL_0074: stloc.s V_8 + IL_0076: ldloc.s V_7 + IL_0078: ldloc.s V_8 IL_007a: bge.s IL_007e IL_007c: br.s IL_0080 @@ -421,8 +418,8 @@ IL_0080: ldc.i4.m1 IL_0081: ret - IL_0082: ldloc.s V_5 - IL_0084: ldloc.s V_6 + IL_0082: ldloc.s V_7 + IL_0084: ldloc.s V_8 IL_0086: cgt IL_0088: ret @@ -430,7 +427,7 @@ IL_008a: ret IL_008b: ldloc.0 - IL_008c: ldloc.1 + IL_008c: ldloc.2 IL_008d: sub IL_008e: ret @@ -460,7 +457,7 @@ // Code size 14 (0xe) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 6,6 : 6,7 + .line 6,6 : 6,7 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\Misc\\EqualsOnUnions01.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -478,15 +475,15 @@ .maxstack 4 .locals init ([0] class EqualsOnUnions01/U V_0, [1] int32 V_1, - [2] int32 V_2, - [3] class EqualsOnUnions01/U/B V_3, - [4] class EqualsOnUnions01/U/B V_4, - [5] class [mscorlib]System.Collections.IComparer V_5, - [6] int32 V_6, - [7] int32 V_7, - [8] class EqualsOnUnions01/U V_8, - [9] class EqualsOnUnions01/U V_9) - .line 6,6 : 6,7 + [2] class EqualsOnUnions01/U V_2, + [3] int32 V_3, + [4] class EqualsOnUnions01/U V_4, + [5] class EqualsOnUnions01/U/B V_5, + [6] class EqualsOnUnions01/U/B V_6, + [7] class [mscorlib]System.Collections.IComparer V_7, + [8] int32 V_8, + [9] int32 V_9) + .line 6,6 : 6,7 '' IL_0000: nop IL_0001: ldarg.1 IL_0002: unbox.any EqualsOnUnions01/U @@ -500,7 +497,7 @@ IL_0010: br IL_009b - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0015: ldarg.1 IL_0016: unbox.any EqualsOnUnions01/U IL_001b: ldnull @@ -511,94 +508,94 @@ IL_0022: br IL_0099 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0027: ldarg.0 - IL_0028: stloc.s V_8 - IL_002a: ldloc.s V_8 - IL_002c: isinst EqualsOnUnions01/U/B - IL_0031: brfalse.s IL_0036 - - IL_0033: ldc.i4.1 - IL_0034: br.s IL_0037 - - IL_0036: ldc.i4.0 - IL_0037: stloc.1 - IL_0038: ldloc.0 - IL_0039: stloc.s V_9 - IL_003b: ldloc.s V_9 - IL_003d: isinst EqualsOnUnions01/U/B - IL_0042: brfalse.s IL_0047 - - IL_0044: ldc.i4.1 - IL_0045: br.s IL_0048 - - IL_0047: ldc.i4.0 - IL_0048: stloc.2 - IL_0049: ldloc.1 - IL_004a: ldloc.2 - IL_004b: bne.un.s IL_004f - - IL_004d: br.s IL_0051 - - IL_004f: br.s IL_0095 - - .line 100001,100001 : 0,0 - IL_0051: ldarg.0 - IL_0052: isinst EqualsOnUnions01/U/B - IL_0057: brfalse.s IL_005b - - IL_0059: br.s IL_005d - - IL_005b: br.s IL_0093 - - .line 100001,100001 : 0,0 - IL_005d: ldarg.0 - IL_005e: castclass EqualsOnUnions01/U/B - IL_0063: stloc.3 - IL_0064: ldloc.0 - IL_0065: castclass EqualsOnUnions01/U/B - IL_006a: stloc.s V_4 - IL_006c: ldarg.2 - IL_006d: stloc.s V_5 - IL_006f: ldloc.3 + IL_0028: stloc.2 + IL_0029: ldloc.2 + IL_002a: isinst EqualsOnUnions01/U/B + IL_002f: brfalse.s IL_0034 + + IL_0031: ldc.i4.1 + IL_0032: br.s IL_0035 + + IL_0034: ldc.i4.0 + IL_0035: stloc.1 + IL_0036: ldloc.0 + IL_0037: stloc.s V_4 + IL_0039: ldloc.s V_4 + IL_003b: isinst EqualsOnUnions01/U/B + IL_0040: brfalse.s IL_0045 + + IL_0042: ldc.i4.1 + IL_0043: br.s IL_0046 + + IL_0045: ldc.i4.0 + IL_0046: stloc.3 + IL_0047: ldloc.1 + IL_0048: ldloc.3 + IL_0049: bne.un.s IL_004d + + IL_004b: br.s IL_004f + + IL_004d: br.s IL_0095 + + .line 100001,100001 : 0,0 '' + IL_004f: ldarg.0 + IL_0050: isinst EqualsOnUnions01/U/B + IL_0055: brfalse.s IL_0059 + + IL_0057: br.s IL_005b + + IL_0059: br.s IL_0093 + + .line 100001,100001 : 0,0 '' + IL_005b: ldarg.0 + IL_005c: castclass EqualsOnUnions01/U/B + IL_0061: stloc.s V_5 + IL_0063: ldloc.0 + IL_0064: castclass EqualsOnUnions01/U/B + IL_0069: stloc.s V_6 + IL_006b: ldarg.2 + IL_006c: stloc.s V_7 + IL_006e: ldloc.s V_5 IL_0070: ldfld int32 EqualsOnUnions01/U/B::item - IL_0075: stloc.s V_6 - IL_0077: ldloc.s V_4 + IL_0075: stloc.s V_8 + IL_0077: ldloc.s V_6 IL_0079: ldfld int32 EqualsOnUnions01/U/B::item - IL_007e: stloc.s V_7 - IL_0080: ldloc.s V_6 - IL_0082: ldloc.s V_7 + IL_007e: stloc.s V_9 + IL_0080: ldloc.s V_8 + IL_0082: ldloc.s V_9 IL_0084: bge.s IL_0088 IL_0086: br.s IL_008a IL_0088: br.s IL_008c - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_008a: ldc.i4.m1 IL_008b: ret - .line 100001,100001 : 0,0 - IL_008c: ldloc.s V_6 - IL_008e: ldloc.s V_7 + .line 100001,100001 : 0,0 '' + IL_008c: ldloc.s V_8 + IL_008e: ldloc.s V_9 IL_0090: cgt IL_0092: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0093: ldc.i4.0 IL_0094: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0095: ldloc.1 - IL_0096: ldloc.2 + IL_0096: ldloc.3 IL_0097: sub IL_0098: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0099: ldc.i4.1 IL_009a: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_009b: ldarg.1 IL_009c: unbox.any EqualsOnUnions01/U IL_00a1: ldnull @@ -609,11 +606,11 @@ IL_00a8: br.s IL_00ac - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_00aa: ldc.i4.m1 IL_00ab: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_00ac: ldc.i4.0 IL_00ad: ret } // end of method U::CompareTo @@ -689,7 +686,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 13 (0xd) .maxstack 8 - .line 6,6 : 6,7 + .line 6,6 : 6,7 '' IL_0000: nop IL_0001: ldarg.0 IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() @@ -707,12 +704,12 @@ .locals init (class EqualsOnUnions01/U V_0, class EqualsOnUnions01/U V_1, int32 V_2, - int32 V_3, - class EqualsOnUnions01/U/B V_4, - class EqualsOnUnions01/U/B V_5, - class [mscorlib]System.Collections.IEqualityComparer V_6, - class EqualsOnUnions01/U V_7, - class EqualsOnUnions01/U V_8) + class EqualsOnUnions01/U V_3, + int32 V_4, + class EqualsOnUnions01/U V_5, + class EqualsOnUnions01/U/B V_6, + class EqualsOnUnions01/U/B V_7, + class [mscorlib]System.Collections.IEqualityComparer V_8) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -736,29 +733,29 @@ IL_001c: ldloc.0 IL_001d: stloc.1 IL_001e: ldarg.0 - IL_001f: stloc.s V_7 - IL_0021: ldloc.s V_7 - IL_0023: isinst EqualsOnUnions01/U/B - IL_0028: brfalse.s IL_002d - - IL_002a: ldc.i4.1 - IL_002b: br.s IL_002e - - IL_002d: ldc.i4.0 - IL_002e: stloc.2 - IL_002f: ldloc.1 - IL_0030: stloc.s V_8 - IL_0032: ldloc.s V_8 - IL_0034: isinst EqualsOnUnions01/U/B - IL_0039: brfalse.s IL_003e - - IL_003b: ldc.i4.1 - IL_003c: br.s IL_003f - - IL_003e: ldc.i4.0 - IL_003f: stloc.3 - IL_0040: ldloc.2 - IL_0041: ldloc.3 + IL_001f: stloc.3 + IL_0020: ldloc.3 + IL_0021: isinst EqualsOnUnions01/U/B + IL_0026: brfalse.s IL_002b + + IL_0028: ldc.i4.1 + IL_0029: br.s IL_002c + + IL_002b: ldc.i4.0 + IL_002c: stloc.2 + IL_002d: ldloc.1 + IL_002e: stloc.s V_5 + IL_0030: ldloc.s V_5 + IL_0032: isinst EqualsOnUnions01/U/B + IL_0037: brfalse.s IL_003c + + IL_0039: ldc.i4.1 + IL_003a: br.s IL_003d + + IL_003c: ldc.i4.0 + IL_003d: stloc.s V_4 + IL_003f: ldloc.2 + IL_0040: ldloc.s V_4 IL_0042: bne.un.s IL_0046 IL_0044: br.s IL_0048 @@ -775,15 +772,15 @@ IL_0054: ldarg.0 IL_0055: castclass EqualsOnUnions01/U/B - IL_005a: stloc.s V_4 + IL_005a: stloc.s V_6 IL_005c: ldloc.1 IL_005d: castclass EqualsOnUnions01/U/B - IL_0062: stloc.s V_5 + IL_0062: stloc.s V_7 IL_0064: ldarg.2 - IL_0065: stloc.s V_6 - IL_0067: ldloc.s V_4 + IL_0065: stloc.s V_8 + IL_0067: ldloc.s V_6 IL_0069: ldfld int32 EqualsOnUnions01/U/B::item - IL_006e: ldloc.s V_5 + IL_006e: ldloc.s V_7 IL_0070: ldfld int32 EqualsOnUnions01/U/B::item IL_0075: ceq IL_0077: ret @@ -812,11 +809,11 @@ // Code size 121 (0x79) .maxstack 4 .locals init (int32 V_0, - int32 V_1, - class EqualsOnUnions01/U/B V_2, - class EqualsOnUnions01/U/B V_3, - class EqualsOnUnions01/U V_4, - class EqualsOnUnions01/U V_5) + class EqualsOnUnions01/U V_1, + int32 V_2, + class EqualsOnUnions01/U V_3, + class EqualsOnUnions01/U/B V_4, + class EqualsOnUnions01/U/B V_5) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull @@ -837,52 +834,52 @@ IL_0016: br.s IL_006f IL_0018: ldarg.0 - IL_0019: stloc.s V_4 - IL_001b: ldloc.s V_4 - IL_001d: isinst EqualsOnUnions01/U/B - IL_0022: brfalse.s IL_0027 - - IL_0024: ldc.i4.1 - IL_0025: br.s IL_0028 - - IL_0027: ldc.i4.0 - IL_0028: stloc.0 - IL_0029: ldarg.1 - IL_002a: stloc.s V_5 - IL_002c: ldloc.s V_5 - IL_002e: isinst EqualsOnUnions01/U/B - IL_0033: brfalse.s IL_0038 - - IL_0035: ldc.i4.1 - IL_0036: br.s IL_0039 - - IL_0038: ldc.i4.0 - IL_0039: stloc.1 - IL_003a: ldloc.0 - IL_003b: ldloc.1 - IL_003c: bne.un.s IL_0040 - - IL_003e: br.s IL_0042 - - IL_0040: br.s IL_006d - - IL_0042: ldarg.0 - IL_0043: isinst EqualsOnUnions01/U/B - IL_0048: brfalse.s IL_004c - - IL_004a: br.s IL_004e - - IL_004c: br.s IL_006b - - IL_004e: ldarg.0 - IL_004f: castclass EqualsOnUnions01/U/B - IL_0054: stloc.2 - IL_0055: ldarg.1 - IL_0056: castclass EqualsOnUnions01/U/B - IL_005b: stloc.3 - IL_005c: ldloc.2 - IL_005d: ldfld int32 EqualsOnUnions01/U/B::item - IL_0062: ldloc.3 + IL_0019: stloc.1 + IL_001a: ldloc.1 + IL_001b: isinst EqualsOnUnions01/U/B + IL_0020: brfalse.s IL_0025 + + IL_0022: ldc.i4.1 + IL_0023: br.s IL_0026 + + IL_0025: ldc.i4.0 + IL_0026: stloc.0 + IL_0027: ldarg.1 + IL_0028: stloc.3 + IL_0029: ldloc.3 + IL_002a: isinst EqualsOnUnions01/U/B + IL_002f: brfalse.s IL_0034 + + IL_0031: ldc.i4.1 + IL_0032: br.s IL_0035 + + IL_0034: ldc.i4.0 + IL_0035: stloc.2 + IL_0036: ldloc.0 + IL_0037: ldloc.2 + IL_0038: bne.un.s IL_003c + + IL_003a: br.s IL_003e + + IL_003c: br.s IL_006d + + IL_003e: ldarg.0 + IL_003f: isinst EqualsOnUnions01/U/B + IL_0044: brfalse.s IL_0048 + + IL_0046: br.s IL_004a + + IL_0048: br.s IL_006b + + IL_004a: ldarg.0 + IL_004b: castclass EqualsOnUnions01/U/B + IL_0050: stloc.s V_4 + IL_0052: ldarg.1 + IL_0053: castclass EqualsOnUnions01/U/B + IL_0058: stloc.s V_5 + IL_005a: ldloc.s V_4 + IL_005c: ldfld int32 EqualsOnUnions01/U/B::item + IL_0061: ldloc.s V_5 IL_0063: ldfld int32 EqualsOnUnions01/U/B::item IL_0068: ceq IL_006a: ret diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/QueryExpressionStepping/keep.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/QueryExpressionStepping/keep.lst index 1f8a01751de..f59ec20aabf 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/QueryExpressionStepping/keep.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/QueryExpressionStepping/keep.lst @@ -1 +1 @@ -Utils.dll \ No newline at end of file +* \ No newline at end of file diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl index 6c6d89f0327..70867b5230b 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:4:1:9055 + .ver 4:4:1:0 } .assembly TopLevelModule { @@ -29,22 +29,20 @@ } .mresource public FSharpSignatureData.TopLevelModule { - // Offset: 0x00000000 Length: 0x0000114B - // WARNING: managed resource file FSharpSignatureData.TopLevelModule created + // Offset: 0x00000000 Length: 0x0000114D } .mresource public FSharpOptimizationData.TopLevelModule { - // Offset: 0x00001150 Length: 0x000003FD - // WARNING: managed resource file FSharpOptimizationData.TopLevelModule created + // Offset: 0x00001158 Length: 0x000003FD } .module TopLevelModule.dll -// MVID: {570620A2-37F5-C118-A745-0383A2200657} +// MVID: {57570CF0-37F5-C118-A745-0383F00C5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00AE0000 +// Image base: 0x01340000 // =============== CLASS MEMBERS DECLARATION =================== @@ -221,7 +219,7 @@ // Code size 14 (0xe) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 6,6 : 14,18 'c:\\KevinRansom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelModule.fs' + .line 6,6 : 14,18 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelModule.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -579,7 +577,7 @@ valuetype [mscorlib]System.Runtime.Serialization.StreamingContext context) cil managed { // Code size 9 (0x9) - .maxstack 10 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: ldarg.2 @@ -1377,7 +1375,7 @@ valuetype [mscorlib]System.Runtime.Serialization.StreamingContext context) cil managed { // Code size 9 (0x9) - .maxstack 10 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: ldarg.2 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl index 222ca4688cc..7a89e3c0507 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:4:1:9055 + .ver 4:4:1:0 } .assembly ToplevelNamespace { @@ -29,20 +29,20 @@ } .mresource public FSharpSignatureData.ToplevelNamespace { - // Offset: 0x00000000 Length: 0x00001856 + // Offset: 0x00000000 Length: 0x00001858 } .mresource public FSharpOptimizationData.ToplevelNamespace { // Offset: 0x00001860 Length: 0x0000055C } .module ToplevelNamespace.dll -// MVID: {5706E102-218B-729A-A745-038302E10657} +// MVID: {57570CF5-218B-729A-A745-0383F50C5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x02520000 +// Image base: 0x00820000 // =============== CLASS MEMBERS DECLARATION =================== @@ -214,7 +214,7 @@ // Code size 14 (0xe) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 7,7 : 10,14 'd:\\KevinRansom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelNamespace.fs' + .line 7,7 : 10,14 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelNamespace.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -572,7 +572,7 @@ valuetype [mscorlib]System.Runtime.Serialization.StreamingContext context) cil managed { // Code size 9 (0x9) - .maxstack 10 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: ldarg.2 @@ -1370,7 +1370,7 @@ valuetype [mscorlib]System.Runtime.Serialization.StreamingContext context) cil managed { // Code size 9 (0x9) - .maxstack 10 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: ldarg.2 @@ -2168,7 +2168,7 @@ valuetype [mscorlib]System.Runtime.Serialization.StreamingContext context) cil managed { // Code size 9 (0x9) - .maxstack 10 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: ldarg.2 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch03.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch03.il.bsl index cf604d804be..263dc54c659 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch03.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch03.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly SteppingMatch03 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.SteppingMatch03 { - // Offset: 0x00000000 Length: 0x00000255 + // Offset: 0x00000000 Length: 0x00000231 } .mresource public FSharpOptimizationData.SteppingMatch03 { - // Offset: 0x00000260 Length: 0x0000007A + // Offset: 0x00000238 Length: 0x0000007A } .module SteppingMatch03.dll -// MVID: {4DAC14D0-4E87-D110-A745-0383D014AC4D} +// MVID: {57570D0A-4E87-D110-A745-03830A0D5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000460000 +// Image base: 0x02A70000 // =============== CLASS MEMBERS DECLARATION =================== @@ -53,59 +53,59 @@ .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) .method public static void funcC(class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 n) cil managed { - // Code size 84 (0x54) + // Code size 82 (0x52) .maxstack 3 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_0, - [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 V_1, - [2] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 V_2, - [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 V_3, - [4] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_4) + [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_1, + [2] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 V_2, + [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 V_3, + [4] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 V_4) .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 9,21 + .line 5,5 : 9,21 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SteppingMatch\\SteppingMatch03.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: stloc.0 IL_0003: ldloc.0 - IL_0004: stloc.s V_4 - IL_0006: ldloc.s V_4 - IL_0008: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 - IL_000d: brtrue.s IL_001a - - IL_000f: ldloc.s V_4 - IL_0011: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 - IL_0016: brtrue.s IL_001c - - IL_0018: br.s IL_001e - - IL_001a: br.s IL_0030 - - IL_001c: br.s IL_0042 - - IL_001e: ldloc.0 - IL_001f: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 - IL_0024: stloc.1 - .line 7,7 : 13,35 - IL_0025: ldstr "A" - IL_002a: call void [mscorlib]System.Console::WriteLine(string) - IL_002f: ret - - .line 5,5 : 9,21 - IL_0030: ldloc.0 - IL_0031: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 - IL_0036: stloc.2 - .line 9,9 : 13,35 - IL_0037: ldstr "B" - IL_003c: call void [mscorlib]System.Console::WriteLine(string) - IL_0041: ret - - .line 5,5 : 9,21 - IL_0042: ldloc.0 - IL_0043: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 - IL_0048: stloc.3 - .line 11,11 : 13,35 - IL_0049: ldstr "C" - IL_004e: call void [mscorlib]System.Console::WriteLine(string) - IL_0053: ret + IL_0004: stloc.1 + IL_0005: ldloc.1 + IL_0006: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 + IL_000b: brtrue.s IL_0017 + + IL_000d: ldloc.1 + IL_000e: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 + IL_0013: brtrue.s IL_0019 + + IL_0015: br.s IL_001b + + IL_0017: br.s IL_002d + + IL_0019: br.s IL_003f + + IL_001b: ldloc.0 + IL_001c: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 + IL_0021: stloc.2 + .line 7,7 : 13,35 '' + IL_0022: ldstr "A" + IL_0027: call void [mscorlib]System.Console::WriteLine(string) + IL_002c: ret + + .line 5,5 : 9,21 '' + IL_002d: ldloc.0 + IL_002e: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 + IL_0033: stloc.3 + .line 9,9 : 13,35 '' + IL_0034: ldstr "B" + IL_0039: call void [mscorlib]System.Console::WriteLine(string) + IL_003e: ret + + .line 5,5 : 9,21 '' + IL_003f: ldloc.0 + IL_0040: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 + IL_0045: stloc.s V_4 + .line 11,11 : 13,35 '' + IL_0047: ldstr "C" + IL_004c: call void [mscorlib]System.Console::WriteLine(string) + IL_0051: ret } // end of method SteppingMatch03::funcC } // end of class SteppingMatch03 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch04.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch04.il.bsl index 6fc887a26c6..27f346464dc 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch04.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SteppingMatch/SteppingMatch04.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly SteppingMatch04 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.SteppingMatch04 { - // Offset: 0x00000000 Length: 0x00000256 + // Offset: 0x00000000 Length: 0x00000232 } .mresource public FSharpOptimizationData.SteppingMatch04 { - // Offset: 0x00000260 Length: 0x0000007B + // Offset: 0x00000238 Length: 0x0000007B } .module SteppingMatch04.dll -// MVID: {4DAC14D2-6D4C-8357-A745-0383D214AC4D} +// MVID: {57570D0D-6D4C-8357-A745-03830D0D5757} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000360000 +// Image base: 0x00E40000 // =============== CLASS MEMBERS DECLARATION =================== @@ -53,59 +53,59 @@ .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) .method public static void funcC2(class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 n) cil managed { - // Code size 84 (0x54) + // Code size 82 (0x52) .maxstack 3 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_0, - [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 V_1, - [2] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 V_2, - [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 V_3, - [4] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_4) + [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3 V_1, + [2] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 V_2, + [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 V_3, + [4] class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 V_4) .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 9,21 + .line 5,5 : 9,21 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SteppingMatch\\SteppingMatch04.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: stloc.0 IL_0003: ldloc.0 - IL_0004: stloc.s V_4 - IL_0006: ldloc.s V_4 - IL_0008: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 - IL_000d: brtrue.s IL_001a - - IL_000f: ldloc.s V_4 - IL_0011: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 - IL_0016: brtrue.s IL_001c - - IL_0018: br.s IL_001e - - IL_001a: br.s IL_0030 - - IL_001c: br.s IL_0042 - - IL_001e: ldloc.0 - IL_001f: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 - IL_0024: stloc.1 - .line 7,7 : 13,35 - IL_0025: ldstr "B" - IL_002a: call void [mscorlib]System.Console::WriteLine(string) - IL_002f: ret - - .line 5,5 : 9,21 - IL_0030: ldloc.0 - IL_0031: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 - IL_0036: stloc.2 - .line 9,9 : 13,35 - IL_0037: ldstr "C" - IL_003c: call void [mscorlib]System.Console::WriteLine(string) - IL_0041: ret - - .line 5,5 : 9,21 - IL_0042: ldloc.0 - IL_0043: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 - IL_0048: stloc.3 - .line 11,11 : 13,35 - IL_0049: ldstr "A" - IL_004e: call void [mscorlib]System.Console::WriteLine(string) - IL_0053: ret + IL_0004: stloc.1 + IL_0005: ldloc.1 + IL_0006: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 + IL_000b: brtrue.s IL_0017 + + IL_000d: ldloc.1 + IL_000e: isinst class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 + IL_0013: brtrue.s IL_0019 + + IL_0015: br.s IL_001b + + IL_0017: br.s IL_002d + + IL_0019: br.s IL_003f + + IL_001b: ldloc.0 + IL_001c: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice2Of3 + IL_0021: stloc.2 + .line 7,7 : 13,35 '' + IL_0022: ldstr "B" + IL_0027: call void [mscorlib]System.Console::WriteLine(string) + IL_002c: ret + + .line 5,5 : 9,21 '' + IL_002d: ldloc.0 + IL_002e: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice3Of3 + IL_0033: stloc.3 + .line 9,9 : 13,35 '' + IL_0034: ldstr "C" + IL_0039: call void [mscorlib]System.Console::WriteLine(string) + IL_003e: ret + + .line 5,5 : 9,21 '' + IL_003f: ldloc.0 + IL_0040: castclass class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`3/Choice1Of3 + IL_0045: stloc.s V_4 + .line 11,11 : 13,35 '' + IL_0047: ldstr "A" + IL_004c: call void [mscorlib]System.Console::WriteLine(string) + IL_0051: ret } // end of method SteppingMatch04::funcC2 } // end of class SteppingMatch04 From 130fa52f8a9b18365cf6f6b6a8b61acdcc4117af Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 7 Jun 2016 20:04:36 +0100 Subject: [PATCH 241/334] remove dead code --- src/absil/il.fs | 2 - src/absil/ilmorph.fs | 91 ---------------------------------------- src/absil/ilmorph.fsi | 28 ++----------- src/ilx/EraseClosures.fs | 8 ++-- 4 files changed, 7 insertions(+), 122 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 41c004dbce4..3070688ceaa 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -3446,8 +3446,6 @@ type ILExceptionSpec = { exnRange: (ILCodeLabel * ILCodeLabel); exnClauses: ILExceptionClause list } -type exceptions = ILExceptionSpec list - //----------------------------------------------------------------------- // [instructions_to_code] makes the basic block structure of code from // a primitive array of instructions. We diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index f1a1768bd59..daffb812576 100644 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -65,90 +65,6 @@ let bblock_instr2instrs f bb = {bb with Instructions = Array.sub codebuf 0 codebuf_size} -// Map each instruction in a basic block to a more complicated block that -// may involve internal branching, but which will still have one entry -// label and one exit label. This is used, for example, when macro-expanding -// complicated high-level ILX instructions. -// The morphing function is told the name of the input and output labels -// that must be used for the generated block. -// Optimize the case where an instruction gets mapped to a -// straightline sequence of instructions by allowing the morphing -// function to return a special result for this case. -// -// Let [i] be the instruction being morphed. If [i] is a control-flow -// then instruction then [f] must return either a control-flow terminated -// sequence of instructions or a block both of which must targets the same labels -// (or a subset of the labels) targeted in [i]. If [i] -// is not a if not a control-flow instruction then [f] -// must return a block targeting the given output label. - -let rec countAccInstrs (xss:ILInstr list list) acc = - match xss with - | [] -> acc - | xs :: rest -> countAccInstrs rest (acc + List.length xs) - -let rec commitAccInstrsAux (xs:ILInstr list) (arr:ILInstr[]) i = - match xs with - | [] -> () - | x :: rest -> arr.[i] <- x; commitAccInstrsAux rest arr (i+1) - -// Fill in the array chunk by chunk from the end and work backwards -let rec commitAccInstrs xss arr i = - match xss with - | [] -> assert (i = 0) - | xs :: rest -> - let n = List.length xs - commitAccInstrsAux xs arr (i - n) - commitAccInstrs rest arr (i - n) - -// Write the accumulated instructions into an array. The fragments come in in reverse order. -let commitAccBasicBlock (sofar: ILInstr list list) = - let n = countAccInstrs sofar 0 - let arr = Array.zeroCreate n - commitAccInstrs sofar arr n - arr - -[] -type InstrMorph(isInstrs:bool, instrs:ILInstr list, code: ILCode) = - new (instrs:ILInstr list) = InstrMorph(true,instrs,Unchecked.defaultof<_>) - new (code:ILCode) = InstrMorph(false,Unchecked.defaultof<_>,code) - member x.IsInstrs = isInstrs - member x.Instrs = instrs - member x.Code = code - -let rec bblockLoop f bb currBBlockInpLabel currInpLabel currOutLabel sofar instrs = - match instrs with - | (i::rest) -> - let res : InstrMorph = f currInpLabel currOutLabel i - if res.IsInstrs then - // First possibility: return a list of instructions. No addresses get consumed. - bblockLoop f bb currBBlockInpLabel currInpLabel currOutLabel (res.Instrs :: sofar) rest - else - let middle_bblock = res.Code - let before_bblock = - let instrs = commitAccBasicBlock ([I_br currInpLabel] :: sofar) - mkBasicBlock {Label=currBBlockInpLabel;Instructions=instrs} - if checking && uniqueEntryOfCode middle_bblock <> currInpLabel then - dprintn ("*** warning when transforming bblock "^formatCodeLabel bb.Label^": bblock2code_instr2code: input label of returned block does not match the expected label while converting an instruction to a block."); - let afterBlocks = - match rest with - | [] -> [] // the bblock has already been transformed - | _ -> - let newInLab = generateCodeLabel () - let newOutLab = generateCodeLabel () - [ bblockLoop f bb currOutLabel newInLab newOutLab [] rest ] - - checkILCode - (mkGroupBlock - ( currInpLabel :: (match rest with [] -> [] | _ -> [ currOutLabel ]), - before_bblock :: middle_bblock :: afterBlocks)) - | [] -> - let instrs = commitAccBasicBlock sofar - mkBasicBlock {Label=currBBlockInpLabel;Instructions=instrs} - -let bblock2code_instr2code (f:ILCodeLabel -> ILCodeLabel -> ILInstr -> InstrMorph) bb = - bblockLoop f bb bb.Label (generateCodeLabel ()) (generateCodeLabel ()) [] (Array.toList bb.Instructions) - let rec block_bblock2code_typ2typ ((fbb,fty) as f) x = match x with | ILBasicBlock bblock -> fbb bblock @@ -363,12 +279,6 @@ let fdefs_fdef2fdef f (m:ILFieldDefs) = mkILFields (List.map f m.AsList) (* use this when the conversion produces just one type... *) let morphILTypeDefs f (m: ILTypeDefs) = mkILTypeDefsFromArray (Array.map f m.AsArray) -let morphExpandILTypeDefs f (m:ILTypeDefs) = - mkILTypeDefs (List.collect f m.AsList) - -let morphILTypeDefsInILModule typesf m = - {m with TypeDefs=typesf m.TypeDefs} - let locals_typ2typ f ls = ILList.map (local_typ2typ f) ls let freevars_typ2typ f ls = Array.map (freevar_typ2typ f) ls @@ -483,7 +393,6 @@ let morphILInstrsAndILTypesInILModule ilg (f1,f2) x = module_bblock2code_typ2typ ilg ((fun modCtxt tdefCtxt mdefCtxt i -> mkBasicBlock (bblock_instr2instr (f1 modCtxt tdefCtxt mdefCtxt) i)), f2) x let morphILInstrsInILCode f x = topcode_bblock2code (fun i -> mkBasicBlock (bblock_instr2instrs f i)) x -let morphExpandILInstrsInILCode f x = topcode_bblock2code (bblock2code_instr2code f) x let morphILTypeInILModule ilg ftype y = let finstr modCtxt tdefCtxt mdefCtxt = diff --git a/src/absil/ilmorph.fsi b/src/absil/ilmorph.fsi index 8c387883e99..1d55dbbcd84 100644 --- a/src/absil/ilmorph.fsi +++ b/src/absil/ilmorph.fsi @@ -8,40 +8,18 @@ /// the ILMethodDef (if any) where the item occurs. etc. module internal Microsoft.FSharp.Compiler.AbstractIL.Morphs -open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL -open Microsoft.FSharp.Compiler.AbstractIL.Internal -open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types open Microsoft.FSharp.Compiler.AbstractIL.IL -type 'T morph = 'T -> 'T - /// Morph each scope reference inside a type signature. -val morphILScopeRefsInILTypeRef: ILScopeRef morph -> ILTypeRef -> ILTypeRef - -val morphILMethodDefs: ILMethodDef morph -> ILMethodDefs -> ILMethodDefs -/// nb. does not do nested tdefs. -val morphILTypeDefs: ILTypeDef morph -> ILTypeDefs -> ILTypeDefs - -val morphExpandILTypeDefs: (ILTypeDef -> ILTypeDef list) -> ILTypeDefs -> ILTypeDefs - -/// Morph all tables of ILTypeDefs in "ILModuleDef". -val morphILTypeDefsInILModule: ILTypeDefs morph -> ILModuleDef -> ILModuleDef +val morphILScopeRefsInILTypeRef: (ILScopeRef -> ILScopeRef) -> ILTypeRef -> ILTypeRef /// Morph all type references throughout an entire module. -val morphILTypeRefsInILModuleMemoized: ILGlobals -> ILTypeRef morph -> ILModuleDef -> ILModuleDef +val morphILTypeRefsInILModuleMemoized: ILGlobals -> (ILTypeRef -> ILTypeRef) -> ILModuleDef -> ILModuleDef -val morphILScopeRefsInILModuleMemoized: ILGlobals -> ILScopeRef morph -> ILModuleDef -> ILModuleDef +val morphILScopeRefsInILModuleMemoized: ILGlobals -> (ILScopeRef -> ILScopeRef) -> ILModuleDef -> ILModuleDef -val morphILMethodBody: ILMethodBody morph -> ILLazyMethodBody -> ILLazyMethodBody val morphILInstrsInILCode: (ILInstr -> ILInstr list) -> ILCode -> ILCode -[] -type InstrMorph = - new : ILInstr list -> InstrMorph - new : ILCode -> InstrMorph - -val morphExpandILInstrsInILCode: (ILCodeLabel -> ILCodeLabel -> ILInstr -> InstrMorph) -> ILCode -> ILCode - val enablemorphCustomAttributeData : unit -> unit val disablemorphCustomAttributeData : unit -> unit diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index 9bbc32219f7..c4fd7a28de0 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -282,10 +282,10 @@ let mkCallFunc cenv allocLocal numThisGenParams tl apps = buildApp true [] apps // Fix up I_ret instruction. Generalise to selected instr. -let convReturnInstr ty _inplab _outlab instr = +let convReturnInstr ty instr = match instr with - | I_ret -> InstrMorph [I_box ty;I_ret] - | _ -> InstrMorph [instr] + | I_ret -> [I_box ty;I_ret] + | _ -> [instr] let convILMethodBody (thisClo,boxReturnTy) il = let tmps = ILLocalsAllocator il.Locals.Length @@ -303,7 +303,7 @@ let convILMethodBody (thisClo,boxReturnTy) il = let code = match boxReturnTy with | None -> code - | Some ty -> morphExpandILInstrsInILCode (convReturnInstr ty) code + | Some ty -> morphILInstrsInILCode (convReturnInstr ty) code {il with MaxStack=newMax; IsZeroInit=true; Code= code ; From e6821c1322d68945c9ac6eec574626f0c718cff6 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 7 Jun 2016 12:42:38 -0700 Subject: [PATCH 242/334] Build VSIX after signing is complete --- build-everything.proj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build-everything.proj b/build-everything.proj index 41b691c8dc9..f35cbd05964 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -21,7 +21,6 @@ - @@ -37,8 +36,9 @@ - - + + + @@ -48,7 +48,7 @@ - + @@ -58,7 +58,7 @@ - + @@ -68,6 +68,6 @@ - + From 36005579efa22622d33ee85bcef89ba42668990f Mon Sep 17 00:00:00 2001 From: Taylor Wood Date: Tue, 7 Jun 2016 16:23:42 -0500 Subject: [PATCH 243/334] Add test case for unused result warning --- .../fsharpqa/Source/Warnings/WarnIfExpressionResultUnused.fs | 5 +++++ tests/fsharpqa/Source/Warnings/env.lst | 1 + 2 files changed, 6 insertions(+) create mode 100644 tests/fsharpqa/Source/Warnings/WarnIfExpressionResultUnused.fs diff --git a/tests/fsharpqa/Source/Warnings/WarnIfExpressionResultUnused.fs b/tests/fsharpqa/Source/Warnings/WarnIfExpressionResultUnused.fs new file mode 100644 index 00000000000..e43c60b38d9 --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/WarnIfExpressionResultUnused.fs @@ -0,0 +1,5 @@ +// #Warnings +//The result of this expression is implicitly ignored\. Consider using 'ignore' to discard this value explicitly, e\.g\. 'expr \|> ignore', or 'let' to bind the result to a name, e\.g\. 'let result = expr'.$ + +1 + 2 +printfn "%d" 3 diff --git a/tests/fsharpqa/Source/Warnings/env.lst b/tests/fsharpqa/Source/Warnings/env.lst index 89651c646aa..4ccec603e9b 100644 --- a/tests/fsharpqa/Source/Warnings/env.lst +++ b/tests/fsharpqa/Source/Warnings/env.lst @@ -12,3 +12,4 @@ SOURCE=DowncastInsteadOfUpcast.fs # DowncastInsteadOfUpcast.fs SOURCE=RuntimeTypeTestInPattern.fs # RuntimeTypeTestInPattern.fs SOURCE=RuntimeTypeTestInPattern2.fs # RuntimeTypeTestInPattern2.fs + SOURCE=WarnIfExpressionResultUnused.fs # WarnIfExpressionResultUnused.fs From db7cea0ad327c0a9ca7a4c682c0f53a3bb9c08e1 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 7 Jun 2016 17:12:00 -0700 Subject: [PATCH 244/334] Declaring insertion projects as packages --- setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj | 1 + setup/Insertion/Insertion.vsmanproj | 1 + setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj | 1 + 3 files changed, 3 insertions(+) diff --git a/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj b/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj index 717b05185af..f58db676094 100644 --- a/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj +++ b/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj @@ -5,6 +5,7 @@ neutral false manifest + true Debug $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json diff --git a/setup/Insertion/Insertion.vsmanproj b/setup/Insertion/Insertion.vsmanproj index 21c51ecf689..2695ff0aa09 100644 --- a/setup/Insertion/Insertion.vsmanproj +++ b/setup/Insertion/Insertion.vsmanproj @@ -4,6 +4,7 @@ ..\..\src true true + true $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json diff --git a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj index ee71a943031..7ea1c2a0cee 100644 --- a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj +++ b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj @@ -5,6 +5,7 @@ neutral false manifest + true $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json From c9b78df76982657cc76b144b2835de95d7b59e65 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 8 Jun 2016 14:09:03 -0700 Subject: [PATCH 245/334] Added signing to missing projects --- .../FSharp.Compiler.Interactive.Settings.fsproj | 10 ++++++++++ .../FSharp.Compiler.Server.Shared.fsproj | 10 ++++++++++ .../src/FSharp.Editor/FSharp.Editor.fsproj | 13 ++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj index ba34ac07b55..b34a3d459a2 100644 --- a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj +++ b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj @@ -50,4 +50,14 @@ + + + + + + Microsoft + StrongName + + + diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj index c1772607551..efe7c37235a 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj +++ b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj @@ -58,4 +58,14 @@ + + + + + + Microsoft + StrongName + + + diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index e3918584174..77a73d101b1 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -83,6 +83,17 @@ + - + + + + + + + Microsoft + StrongName + + + \ No newline at end of file From ef8c0cf83b63bcde348488cb0064b5fb76c0e53c Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 8 Jun 2016 18:02:12 -0700 Subject: [PATCH 246/334] Introduced swix project for vsix install --- build-everything.proj | 2 +- .../Common.Wix.Properties.wxs | 43 ------------ setup/FSharp.SDK/FSharp.SDK.wixproj | 5 +- setup/FSharp.SDK/FSharp.SDK.wxs | 1 - .../Compiler_OtherResources.wxs | 16 +---- .../Compiler_PublicAssemblies.wxs | 39 ----------- .../component-groups/Compiler_SDK.wxs | 3 - .../Langpack_ManagedFiles.wxs | 3 - .../component-groups/Redist_ManagedFiles.wxs | 3 - .../VisualFSharpVSIX.swixproj | 21 ------ .../VisualFSharpVSIX/VisualFSharpVSIX.swr | 16 ----- .../FSharp.SDK/FSharp.SDK.swixproj | 7 +- .../FSharp.SDK/Files.swr} | 2 +- .../Microsoft.FSharp.vsmanproj} | 6 +- .../VisualFSharpVSIX.Desktop.swixproj | 40 +++++++++++ .../VisualFSharpVSIX.Professional.swixproj | 40 +++++++++++ .../VisualFSharpVSIX.WebDevelopment.swixproj | 40 +++++++++++ setup/fsharp-setup-build.proj | 47 +++++++++---- .../Desktop/Source.extension.vsixmanifest | 58 ---------------- .../Source.extension.vsixmanifest | 63 ----------------- .../Source.extension.vsixmanifest | 58 ---------------- .../VisualFSharpVsix/VisualFSharpVsix.csproj | 67 +------------------ .../fsharp-vsintegration-vsix-build.proj | 33 --------- 23 files changed, 169 insertions(+), 444 deletions(-) rename setup/{ => FSharp.SDK}/Common.Wix.Properties.wxs (77%) delete mode 100644 setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs delete mode 100644 setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj delete mode 100644 setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr rename setup/{Insertion => Swix}/FSharp.SDK/FSharp.SDK.swixproj (73%) rename setup/{Insertion/FSharp.SDK/FSharp.SDK.swr => Swix/FSharp.SDK/Files.swr} (85%) rename setup/{Insertion/Insertion.vsmanproj => Swix/Microsoft.FSharp.vsmanproj} (78%) create mode 100644 setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj create mode 100644 setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj create mode 100644 setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj delete mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest delete mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest delete mode 100644 vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest delete mode 100644 vsintegration/fsharp-vsintegration-vsix-build.proj diff --git a/build-everything.proj b/build-everything.proj index f35cbd05964..8b2761e4c02 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -21,6 +21,7 @@ + @@ -37,7 +38,6 @@ - diff --git a/setup/Common.Wix.Properties.wxs b/setup/FSharp.SDK/Common.Wix.Properties.wxs similarity index 77% rename from setup/Common.Wix.Properties.wxs rename to setup/FSharp.SDK/Common.Wix.Properties.wxs index 8a6d610cb6e..65166a349dd 100644 --- a/setup/Common.Wix.Properties.wxs +++ b/setup/FSharp.SDK/Common.Wix.Properties.wxs @@ -2,58 +2,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj index 64a014b5cb6..668e4592800 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wixproj +++ b/setup/FSharp.SDK/FSharp.SDK.wixproj @@ -39,14 +39,13 @@ - + - @@ -68,6 +67,6 @@ - + \ No newline at end of file diff --git a/setup/FSharp.SDK/FSharp.SDK.wxs b/setup/FSharp.SDK/FSharp.SDK.wxs index 11b64086912..4967656f0bf 100644 --- a/setup/FSharp.SDK/FSharp.SDK.wxs +++ b/setup/FSharp.SDK/FSharp.SDK.wxs @@ -29,7 +29,6 @@ - - - - - - - - - - - - - - - - + diff --git a/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs b/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs deleted file mode 100644 index de1a877d160..00000000000 --- a/setup/FSharp.SDK/component-groups/Compiler_PublicAssemblies.wxs +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs b/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs index c80c5774d3d..0c3ca0f90e8 100644 --- a/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs +++ b/setup/FSharp.SDK/component-groups/Compiler_SDK.wxs @@ -3,9 +3,6 @@ - - - diff --git a/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs b/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs index b28240f206e..756e492a514 100644 --- a/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs +++ b/setup/FSharp.SDK/component-groups/Langpack_ManagedFiles.wxs @@ -3,9 +3,6 @@ - - - diff --git a/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs b/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs index 4ee6b6e7892..73e8b104e7e 100644 --- a/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs +++ b/setup/FSharp.SDK/component-groups/Redist_ManagedFiles.wxs @@ -3,9 +3,6 @@ - - - diff --git a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj deleted file mode 100644 index 7ea1c2a0cee..00000000000 --- a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swixproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - ..\..\..\src - neutral - false - manifest - true - $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json - - - - - - $(PackagePreprocessorDefinitions);InsertionFolder=$(FSharpSourcesRoot)\..\$(Configuration)\insertion - - - - - - diff --git a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr b/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr deleted file mode 100644 index 944cdd6bb99..00000000000 --- a/setup/Insertion/VisualFSharpVSIX/VisualFSharpVSIX.swr +++ /dev/null @@ -1,16 +0,0 @@ -use vs - -package name=Microsoft.FSharp - version=4.1 - vs.package.chip=neutral - vs.package.language=en-us - vs.package.type=vsix - vs.package.vsixId=VisualFSharp - -vs.localizedResources - vs.localizedResource language=en-us - title="Visual F# Tools" - description="Deploy Visual F# Tools templates to Visual Studio" - -vs.payloads - vs.payload source=$(InsertionFolder)\vsix\VisualFSharpVsix.Professional.vsix diff --git a/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj b/setup/Swix/FSharp.SDK/FSharp.SDK.swixproj similarity index 73% rename from setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj rename to setup/Swix/FSharp.SDK/FSharp.SDK.swixproj index f58db676094..4b66278ec8a 100644 --- a/setup/Insertion/FSharp.SDK/FSharp.SDK.swixproj +++ b/setup/Swix/FSharp.SDK/FSharp.SDK.swixproj @@ -7,16 +7,17 @@ manifest true Debug - $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json + $(FSharpSourcesRoot)\..\$(Configuration) + $(BinariesFolder)\insertion - $(PackagePreprocessorDefinitions);InsertionFolder=$(FSharpSourcesRoot)\..\$(Configuration)\insertion + $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) - + diff --git a/setup/Insertion/FSharp.SDK/FSharp.SDK.swr b/setup/Swix/FSharp.SDK/Files.swr similarity index 85% rename from setup/Insertion/FSharp.SDK/FSharp.SDK.swr rename to setup/Swix/FSharp.SDK/Files.swr index c8be14a0d23..d684f9c41d7 100644 --- a/setup/Insertion/FSharp.SDK/FSharp.SDK.swr +++ b/setup/Swix/FSharp.SDK/Files.swr @@ -12,4 +12,4 @@ vs.localizedResources description="Deploy Visual F# Tools templates to Visual Studio" vs.payloads - vs.payload source=$(InsertionFolder)\msi\ENU\FSharp.SDK.msi + vs.payload source=$(BinariesFolder)\msi\FSharp.SDK.ENU.msi diff --git a/setup/Insertion/Insertion.vsmanproj b/setup/Swix/Microsoft.FSharp.vsmanproj similarity index 78% rename from setup/Insertion/Insertion.vsmanproj rename to setup/Swix/Microsoft.FSharp.vsmanproj index 2695ff0aa09..300150a6576 100644 --- a/setup/Insertion/Insertion.vsmanproj +++ b/setup/Swix/Microsoft.FSharp.vsmanproj @@ -5,13 +5,15 @@ true true true - $(FSharpSourcesRoot)\..\$(Configuration)\insertion\json + $(FSharpSourcesRoot)\..\$(Configuration)\insertion + + - + \ No newline at end of file diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj new file mode 100644 index 00000000000..4ce3d51a0b2 --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj @@ -0,0 +1,40 @@ + + + + ..\..\..\src + neutral + false + vsix + true + Debug + $(FSharpSourcesRoot)\..\$(Configuration) + $(BinariesFolder)\insertion + VisualFSharpVSIX.Desktop + $(MSBuildThisFileDirectory)obj + + + + + + $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + + + + + + + + + + + VsixSHA2 + + + + diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj new file mode 100644 index 00000000000..243e8b844a0 --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj @@ -0,0 +1,40 @@ + + + + ..\..\..\src + neutral + false + vsix + true + Debug + $(FSharpSourcesRoot)\..\$(Configuration) + $(BinariesFolder)\insertion + VisualFSharpVSIX.Professional + $(MSBuildThisFileDirectory)obj + + + + + + $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + + + + + + + + + + + VsixSHA2 + + + + diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj new file mode 100644 index 00000000000..609353057cf --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj @@ -0,0 +1,40 @@ + + + + ..\..\..\src + neutral + false + vsix + true + Debug + $(FSharpSourcesRoot)\..\$(Configuration) + $(BinariesFolder)\insertion + VisualFSharpVSIX.WebDevelopment + $(MSBuildThisFileDirectory)obj + + + + + + $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + + + + + + + + + + + VsixSHA2 + + + + diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj index 9c018d37e84..be9ad8f2a22 100644 --- a/setup/fsharp-setup-build.proj +++ b/setup/fsharp-setup-build.proj @@ -7,39 +7,60 @@ . net40 ENU + Debug + + + + + + + + + + - - - - - + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest deleted file mode 100644 index c6f51b034f6..00000000000 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/Desktop/Source.extension.vsixmanifest +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Visual F# Tools - Deploy Visual F# Tools templates to Visual Studio - ..\CommonExtensions\Microsoft\FSharp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest deleted file mode 100644 index 2701f6f7c7a..00000000000 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/Professional/Source.extension.vsixmanifest +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Visual F# Tools - Deploy Visual F# Tools templates to Visual Studio - ..\CommonExtensions\Microsoft\FSharp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest b/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest deleted file mode 100644 index 60b92d7e94b..00000000000 --- a/vsintegration/VisualFSharpVsix/ShippingManifests/WebDevelopment/Source.extension.vsixmanifest +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Visual F# Tools - Deploy Visual F# Tools templates to Visual Studio - ..\CommonExtensions\Microsoft\FSharp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj index f9cc3eccbf8..49c86e14e52 100644 --- a/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj +++ b/vsintegration/VisualFSharpVsix/VisualFSharpVsix.csproj @@ -51,16 +51,9 @@ true VisualFSharpVsix $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin - - - VisualFSharpVsix $(RootBinPath) - - VisualFSharpVsix.$(ShippingSku) - $(RootBinPath)\ShippingSkus\$(ShippingSku) - Program @@ -80,13 +73,9 @@ - + Designer - - Designer - Source.extension.vsixmanifest - Always true @@ -98,7 +87,7 @@ - + Always true @@ -141,42 +130,6 @@ - - - Always - true - ProjectTemplates\TutorialProject.zip - - - Always - true - ProjectTemplates\ConsoleProject.zip - - - Always - true - ProjectTemplates\LibraryProject.zip - - - - - - Always - true - ProjectTemplates\TutorialProject.zip - - - Always - true - ProjectTemplates\SilverlightProject.zip - - - Always - true - ProjectTemplates\LibraryProject.zip - - - Always @@ -330,20 +283,4 @@ - - - - - - VsixSHA2 - - - - - - - - - - \ No newline at end of file diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj deleted file mode 100644 index 4ccae9f868b..00000000000 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ /dev/null @@ -1,33 +0,0 @@ - - - - net40 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 2cc7a73fae489c5fe08f0d757795fa1b91257e88 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 9 Jun 2016 19:37:08 +0300 Subject: [PATCH 247/334] fix typo --- src/fsharp/lex.fsl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index 58694b81204..a18cf6d983a 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -181,12 +181,12 @@ let anychar = [^'\n''\r'] let anystring = anychar* let op_char = '!'|'$'|'%'|'&'|'*'|'+'|'-'|'.'|'/'|'<'|'='|'>'|'?'|'@'|'^'|'|'|'~'|':' let ignored_op_char = '.' | '$' | '?' -let seperator = '_' +let separator = '_' let xinteger = - ( '0' ('x'| 'X') hex ((hex | seperator)* hex)? - | '0' ('o'| 'O') (['0'-'7']) (((['0'-'7']) | seperator)* (['0'-'7']))? - | '0' ('b'| 'B') (['0'-'1']) (((['0'-'1']) | seperator)* (['0'-'1']))?) -let integer = digit ((digit | seperator)* digit)? + ( '0' ('x'| 'X') hex ((hex | separator)* hex)? + | '0' ('o'| 'O') (['0'-'7']) (((['0'-'7']) | separator)* (['0'-'7']))? + | '0' ('b'| 'B') (['0'-'1']) (((['0'-'1']) | separator)* (['0'-'1']))?) +let integer = digit ((digit | separator)* digit)? let int8 = integer 'y' let uint8 = (xinteger | integer) 'u' 'y' let int16 = integer 's' @@ -203,8 +203,8 @@ let xint8 = xinteger 'y' let xint16 = xinteger 's' let xint = xinteger let xint32 = xinteger 'l' -let floatp = digit ((digit | seperator)* digit)? '.' (digit (digit | seperator)*)? -let floate = digit ((digit | seperator)* digit)? ('.' (digit (digit | seperator)*)? )? ('e'| 'E') ['+' '-']? digit (digit | seperator)* +let floatp = digit ((digit | separator)* digit)? '.' (digit (digit | separator)*)? +let floate = digit ((digit | separator)* digit)? ('.' (digit (digit | separator)*)? )? ('e'| 'E') ['+' '-']? digit (digit | separator)* let float = floatp | floate let bignum = integer ('I' | 'N' | 'Z' | 'Q' | 'R' | 'G') let ieee64 = float From 0705576daa42f37f67768f09716cce5aad702b91 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 9 Jun 2016 19:39:13 +0300 Subject: [PATCH 248/334] remove inline --- src/fsharp/FSharp.Core/prim-types.fs | 2 +- src/fsharp/lex.fsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 05fa73cef3c..ab28834a942 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2504,7 +2504,7 @@ namespace Microsoft.FSharp.Core let rec parse n acc = if n < l then parse (n+1) (acc *.. 2UL +.. (match s.Chars(n) with '0' -> 0UL | '1' -> 1UL | _ -> formatError())) else acc in parse p 0UL - let inline removeUnderscores (s:string) = + let removeUnderscores (s:string) = match s with | null -> null | s -> s.Replace("_", "") diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index a18cf6d983a..edd9de972e8 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -82,7 +82,7 @@ let parseOctalUInt64 (s:string) p l = let rec parse n acc = if n < l then parse (n+1) (acc * 8UL + (let c = s.[n] in if c >= '0' && c <= '7' then Convert.ToUInt64 c - Convert.ToUInt64 '0' else formatError())) else acc parse p 0UL -let inline removeUnderscores (s:string) = +let removeUnderscores (s:string) = match s with | null -> null | s -> s.Replace("_", "") From 57a2fe99ca39b2bcfafd88c517563698e61648f4 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 9 Jun 2016 20:39:43 +0300 Subject: [PATCH 249/334] restore inline --- src/fsharp/FSharp.Core/prim-types.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index ab28834a942..05fa73cef3c 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -2504,7 +2504,7 @@ namespace Microsoft.FSharp.Core let rec parse n acc = if n < l then parse (n+1) (acc *.. 2UL +.. (match s.Chars(n) with '0' -> 0UL | '1' -> 1UL | _ -> formatError())) else acc in parse p 0UL - let removeUnderscores (s:string) = + let inline removeUnderscores (s:string) = match s with | null -> null | s -> s.Replace("_", "") From 6936f2f9ed213dc0fc266d2a4626f07ed573bac1 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 9 Jun 2016 13:01:15 -0700 Subject: [PATCH 250/334] Added common files to swixproj --- setup/Swix/VisualFSharpVSIX/CommonFiles.swr | 55 +++++++++++++++++++ .../VisualFSharpVSIX.Desktop.swixproj | 9 +-- .../VisualFSharpVSIX.Professional.swixproj | 9 +-- .../VisualFSharpVSIX.WebDevelopment.swixproj | 9 +-- .../FSharp.LanguageService.Base.csproj | 2 + .../Project/ProjectSystem.Base.csproj | 2 + .../FSharp.PropertiesPages.vbproj | 2 + 7 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 setup/Swix/VisualFSharpVSIX/CommonFiles.swr diff --git a/setup/Swix/VisualFSharpVSIX/CommonFiles.swr b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr new file mode 100644 index 00000000000..c93fee58402 --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr @@ -0,0 +1,55 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.chip=neutral + vs.package.language=en-us + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +folder "InstallDir:\MSBuild\15.0" + file source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" + file source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" + +folder "InstallDir:\MSBuild\15.0\Bin" + file source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" + file source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" + +folder "InstallDir:\Common7\IDE\PublicAssemblies" + file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" + file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp" + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Interactive.Settings.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Server.Shared.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Editor.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.Base.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.Compiler.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.Base.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.FSharp.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.PropertyPages.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.VS.FSI.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\fsi.exe" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FsiAnyCPU.exe" vs.file.ngen=yes + file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" + file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" + file source="$(BinariesFolder)\net40\bin\fsi.exe.config" + file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe.config" + file source="$(BinariesFolder)\..\License.txt" + file source="$(BinariesFolder)\net40\bin\RegisterFsharpPackage.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Server.Shared.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.Editor.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.Base.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.Compiler.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.LanguageService.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.Base.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.FSharp.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.ProjectSystem.PropertyPages.pkgdef" + file source="$(BinariesFolder)\net40\bin\FSharp.VS.FSI.pkgdef" diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj index 4ce3d51a0b2..a7f26d0e494 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj @@ -20,12 +20,9 @@ - diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj index 243e8b844a0..22db7591487 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj @@ -20,12 +20,9 @@ - diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj index 609353057cf..5a413d9e798 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj @@ -20,12 +20,9 @@ - diff --git a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj index 1a565b9de41..6e59ea3017b 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj +++ b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj @@ -10,6 +10,8 @@ Debug + net40 + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin AnyCPU {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF} Library diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index e85929aef27..db75ba7bb00 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -15,6 +15,8 @@ FSharp.ProjectSystem.Base true Debug + net40 + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin AnyCPU {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7} $(DefineConstants);CODE_ANALYSIS diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 3d9e9db1d89..da40fbb61e2 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -10,6 +10,8 @@ Debug + net40 + $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin AnyCPU 9.0.21022 2.0 From 6c35ff6ab492a008cc10002735afa6bbdb1d275c Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 9 Jun 2016 13:31:09 -0700 Subject: [PATCH 251/334] added templates to swixproj --- .../VisualFSharpVSIX/DesktopTemplates.swr | 54 +++++++++++ .../ProfessionalTemplates.swr | 89 +++++++++++++++++++ .../VisualFSharpVSIX.Desktop.swixproj | 4 +- .../VisualFSharpVSIX.Professional.swixproj | 4 +- .../VisualFSharpVSIX.WebDevelopment.swixproj | 4 +- .../WebDevelopmentTemplates.swr | 54 +++++++++++ 6 files changed, 200 insertions(+), 9 deletions(-) create mode 100644 setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr create mode 100644 setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr create mode 100644 setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr diff --git a/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr new file mode 100644 index 00000000000..b9e8b64e4f3 --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr @@ -0,0 +1,54 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.chip=neutral + vs.package.language=en-us + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" + + folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\ConsoleProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\Program.fs" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" diff --git a/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr new file mode 100644 index 00000000000..7904a7fe9b3 --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr @@ -0,0 +1,89 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.chip=neutral + vs.package.language=en-us + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" + + folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\ConsoleProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\Program.fs" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCore259Project" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\NETCore259PortableLibrary.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCore78Project" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\NETCore78PortableLibrary.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCoreProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\NETCore7PortableLibrary.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\PortableLibraryProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\SilverlightProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Library1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Script.fsx" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj index a7f26d0e494..cc70a56b5e6 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Desktop.swixproj @@ -21,9 +21,7 @@ - + diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj index 22db7591487..12cd1f9139e 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.Professional.swixproj @@ -21,9 +21,7 @@ - + diff --git a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj index 5a413d9e798..30414a951c3 100644 --- a/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj +++ b/setup/Swix/VisualFSharpVSIX/VisualFSharpVSIX.WebDevelopment.swixproj @@ -21,9 +21,7 @@ - + diff --git a/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr new file mode 100644 index 00000000000..d3461ee036e --- /dev/null +++ b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr @@ -0,0 +1,54 @@ +use vs + +package name=Microsoft.FSharp + version=4.1 + vs.package.chip=neutral + vs.package.language=en-us + +vs.localizedResources + vs.localizedResource language=en-us + title="Visual F# Tools" + description="Deploy Visual F# Tools templates to Visual Studio" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" + file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\SilverlightProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\AssemblyInfo.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Library1.fs" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Script.fsx" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.vstemplate" + +folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" + file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" From 93d43a17cfe78ac328840bb94702764b6761b7b4 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 9 Jun 2016 14:31:14 -0700 Subject: [PATCH 252/334] Added vsix project dependencies --- build-everything.proj | 2 +- .../fsharp-vsintegration-vsix-build.proj | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 vsintegration/fsharp-vsintegration-vsix-build.proj diff --git a/build-everything.proj b/build-everything.proj index 8b2761e4c02..cd06e0c802a 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -21,7 +21,7 @@ - + diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj new file mode 100644 index 00000000000..1eb3e5c22a2 --- /dev/null +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -0,0 +1,29 @@ + + + + net40 + + + + + + + + + + + + + + + + + + + + + + + + + From 091ea9530bfda27f5eba940483fcad277cddc485 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 10 Jun 2016 10:30:59 +0300 Subject: [PATCH 253/334] fix float parsing --- src/fsharp/lex.fsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index edd9de972e8..e6dd1a6e397 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -203,8 +203,8 @@ let xint8 = xinteger 'y' let xint16 = xinteger 's' let xint = xinteger let xint32 = xinteger 'l' -let floatp = digit ((digit | separator)* digit)? '.' (digit (digit | separator)*)? -let floate = digit ((digit | separator)* digit)? ('.' (digit (digit | separator)*)? )? ('e'| 'E') ['+' '-']? digit (digit | separator)* +let floatp = digit ((digit | separator)* digit)? '.' (digit ((digit | separator)* digit)?)? +let floate = digit ((digit | separator)* digit)? ('.' (digit ((digit | separator)* digit)?)? )? ('e'| 'E') ['+' '-']? digit ((digit | separator)* digit)? let float = floatp | floate let bignum = integer ('I' | 'N' | 'Z' | 'Q' | 'R' | 'G') let ieee64 = float From 37092edbfa37ac3c04e9e7c349a55b757defb662 Mon Sep 17 00:00:00 2001 From: AviAvni Date: Fri, 10 Jun 2016 14:41:00 +0300 Subject: [PATCH 254/334] add negative tests --- .../Constants/E_UnderscoreLiterals.fs | 32 +++++++++++++++++++ .../BasicGrammarElements/Constants/env.lst | 1 + 2 files changed, 33 insertions(+) create mode 100644 tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/E_UnderscoreLiterals.fs diff --git a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/E_UnderscoreLiterals.fs b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/E_UnderscoreLiterals.fs new file mode 100644 index 00000000000..6e1ba665f93 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/E_UnderscoreLiterals.fs @@ -0,0 +1,32 @@ +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//Missing qualification after '.' +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include +//This is not a valid numeric literal. Valid numeric literals include + +let pi1 = 3_.1415F +let pi2 = 3._1415F +let socialSecurityNumber1 = 999_99_9999_L +let x1 = _52 +let x2 = 52_ +let x3 = 0_x52 +let x4 = 0x_52 +let x5 = 0x52_ +let x6 = 052_ +let x7 = 0_o52 +let x8 = 0o_52 +let x9 = 0o52_ +let x10 = 2.1_e2F +let x11 = 2.1e_2F +let x12 = 1.0_F \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/env.lst b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/env.lst index 83cd11faab1..500d42d77e1 100644 --- a/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/env.lst +++ b/tests/fsharpqa/Source/Conformance/BasicGrammarElements/Constants/env.lst @@ -13,3 +13,4 @@ NOMONO,NoMT SOURCE=E_BasicConstantsBigNum40.fsx SCFLAGS="--test:ErrorRanges" # E SOURCE=DecimalLiterals02.fs # DecimalLiterals02.fs SOURCE=FullSetOfEscapeCharacters.fs # FullSetOfEscapeCharacters.fs + SOURCE=E_UnderscoreLiterals.fs SCFLAGS="--test:ErrorRanges" # E_UnderscoreLiterals.fs \ No newline at end of file From b276c96b5e3e6b0a682847e9e35c3e4fd2423ce7 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Fri, 10 Jun 2016 16:16:25 +0300 Subject: [PATCH 255/334] add tests --- .../Imported/CallerInfo/CallerMemberName.fs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index ee73b3f795e..9814a5b045d 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -16,6 +16,8 @@ type MyTy() = let typeLetFuncNested () = let nestedFunc () = MyTy.GetCallerMemberName() nestedFunc () + let anonymousLambda = (fun () -> MyTy.GetCallerMemberName()) () + let asyncVal = async { return MyTy.GetCallerMemberName() } |> Async.RunSynchronously do MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), "primary ctor") @@ -45,6 +47,8 @@ type MyTy() = |> List.head MyTy.Check(result, Some("CheckMembers"), "lambda") MyTy.Check(functionVal (), Some("functionVal"), "functionVal") + MyTy.Check(anonymousLambda, Some("anonymousLambda"), "anonymousLambda") + MyTy.Check(asyncVal, Some("asyncVal"), "asyncVal") () static member GetCallerMemberName([] ?memberName : string) = @@ -76,6 +80,13 @@ type Extensions = static member DotNetExtensionMeth(instance : System.DateTime) = MyTy.GetCallerMemberName() +type IMyInterface = + abstract member MyInterfaceMethod : unit -> string option + +[] +type MyAbstractTy() = + abstract MyAbstractMethod : unit -> string option + module Program = type System.String with member __.StringExtensionMeth() = @@ -147,4 +158,11 @@ module Program = MyTy.Check(1 +++ 2 |> snd, Some("op_PlusPlusPlus"), "operator") + let obj = { new IMyInterface with + member this.MyInterfaceMethod() = MyTy.GetCallerMemberName() } + MyTy.Check(obj.MyInterfaceMethod(), Some("MyInterfaceMethod"), "MyInterfaceMethod") + + let obj1 = { new MyAbstractTy() with member x.MyAbstractMethod() = MyTy.GetCallerMemberName() } + MyTy.Check(obj1.MyAbstractMethod(), Some("MyAbstractMethod"), "MyAbstractMethod") + 0 \ No newline at end of file From 425a1c56049511c2db9a07ffd02fdda33f66cde8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 10 Jun 2016 22:23:59 +0100 Subject: [PATCH 256/334] ilx cleanup part 7 --- src/absil/il.fs | 930 ++++----------------------------------- src/absil/il.fsi | 231 ++-------- src/absil/ilmorph.fs | 166 ++----- src/absil/ilmorph.fsi | 4 +- src/absil/ilprint.fs | 71 +-- src/absil/ilread.fs | 89 ++-- src/absil/ilreflect.fs | 189 ++++---- src/absil/ilwrite.fs | 309 ++++++------- src/fsharp/IlxGen.fs | 189 ++++---- src/fsharp/fsc.fs | 4 +- src/ilx/EraseClosures.fs | 21 +- src/ilx/EraseUnions.fs | 87 ++-- src/ilx/EraseUnions.fsi | 4 +- src/update.cmd | 7 +- 14 files changed, 571 insertions(+), 1730 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 3070688ceaa..8287cfb3aa1 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -1062,8 +1062,8 @@ type ILInstr = | I_br of ILCodeLabel | I_jmp of ILMethodSpec - | I_brcmp of ILComparisonInstr * ILCodeLabel * ILCodeLabel (* second label is fall-through *) - | I_switch of (ILCodeLabel list * ILCodeLabel) (* last label is fallthrough *) + | I_brcmp of ILComparisonInstr * ILCodeLabel + | I_switch of ILCodeLabel list | I_ret | I_call of ILTailcall * ILMethodSpec * ILVarArgs @@ -1126,40 +1126,40 @@ type ILInstr = | EI_ldlen_multi of int32 * int32 -type ILDebugMapping = - { LocalIndex: int; - LocalName: string; } -type ILBasicBlock = - { Label: ILCodeLabel; - Instructions: ILInstr[] } - member bb.LastInstruction = - let n = bb.Instructions.Length - if n = 0 then failwith "last_of_bblock: empty bblock"; - bb.Instructions.[n - 1] +[] +type ILExceptionClause = + | Finally of (ILCodeLabel * ILCodeLabel) + | Fault of (ILCodeLabel * ILCodeLabel) + | FilterCatch of (ILCodeLabel * ILCodeLabel) * (ILCodeLabel * ILCodeLabel) + | TypeCatch of ILType * (ILCodeLabel * ILCodeLabel) - member x.Fallthrough = - match x.LastInstruction with - | I_br l | I_brcmp (_,_,l) | I_switch (_,l) -> Some l - | _ -> None +[] +type ILExceptionSpec = + { Range: (ILCodeLabel * ILCodeLabel); + Clause: ILExceptionClause } + +/// Indicates that a particular local variable has a particular source +/// language name within a given set of ranges. This does not effect local +/// variable numbering, which is global over the whole method. +[] +type ILLocalDebugMapping = + { LocalIndex: int; + LocalName: string; } +[] +type ILLocalDebugInfo = + { Range: (ILCodeLabel * ILCodeLabel); + DebugMappings: ILLocalDebugMapping list } +[] type ILCode = - | ILBasicBlock of ILBasicBlock - | GroupBlock of ILDebugMapping list * ILCode list - | RestrictBlock of ILCodeLabel list * ILCode - | TryBlock of ILCode * ILExceptionBlock - -and ILExceptionBlock = - | FaultBlock of ILCode - | FinallyBlock of ILCode - | FilterCatchBlock of (ILFilterBlock * ILCode) list + { Labels: Dictionary + Instrs:ILInstr[] + Exceptions: ILExceptionSpec list + Locals: ILLocalDebugInfo list } -and ILFilterBlock = - | TypeFilter of ILType - | CodeFilter of ILCode - -[] +[] type ILLocal = { Type: ILType; IsPinned: bool; @@ -1169,7 +1169,7 @@ type ILLocals = ILList let emptyILLocals = (ILList.empty : ILLocals) let mkILLocals xs = (match xs with [] -> emptyILLocals | _ -> ILList.ofList xs) -[] +[] type ILMethodBody = { IsZeroInit: bool; MaxStack: int32; @@ -1188,8 +1188,7 @@ type ILMemberAccess = | Private | Public -[] -[] +[] type ILFieldInit = | String of string | Bool of bool @@ -1212,8 +1211,7 @@ type ILFieldInit = // correspond yet to the ECMA Spec (Partition II, 7.4). // -------------------------------------------------------------------- -[] -[] +[] type ILNativeType = | Empty | Custom of Guid * string * string * byte[] (* guid,nativeTypeName,custMarshallerName,cookieString *) @@ -1254,7 +1252,9 @@ type ILNativeType = | VariantBool -and ILNativeVariant = +and + [] + ILNativeVariant = | Empty | Null | Variant @@ -1300,7 +1300,9 @@ and ILNativeVariant = | Int | UInt -type ILSecurityAction = +type + [] + ILSecurityAction = | Request | Demand | Assert @@ -1320,9 +1322,11 @@ type ILSecurityAction = | InheritanceDemandChoice | DemandChoice +[] type ILPermission = | PermissionSet of ILSecurityAction * byte[] +[] type ILPermissions = | SecurityDecls of ILPermission list | SecurityDeclsLazy of Lazy @@ -1356,7 +1360,7 @@ type PInvokeCharEncoding = | Unicode | Auto -[] +[] type PInvokeMethod = { Where: ILModuleRef; Name: string; @@ -1367,6 +1371,7 @@ type PInvokeMethod = ThrowOnUnmappableChar: PInvokeThrowOnUnmappableChar; CharBestFit: PInvokeCharBestFit } +[] type ILParameter = { Name: string option; Type: ILType; @@ -1382,6 +1387,7 @@ let emptyILParameters = (ILList.empty : ILParameters) let mkILParametersRaw x = (match x with [] -> emptyILParameters | _ -> ILList.ofList x) +[] type ILReturn = { Marshal: ILNativeType option; Type: ILType; @@ -1992,191 +1998,11 @@ let mkILComputedCustomAttrs f = ILAttributes f let andTailness x y = match x with Tailcall when y -> Tailcall | _ -> Normalcall -// -------------------------------------------------------------------- -// ILAttributes on code blocks (esp. debug info) -// -------------------------------------------------------------------- - -let formatCodeLabel (x:int) = "L"+string x - -module CodeLabels = - let insert (e:ILCodeLabel) l = Zset.add e l - let remove e l = Zset.remove e l - let fold f s acc = Zset.fold f s acc - let add s x = Zset.add s x - let addList s xs = Zset.addList s xs - let diff l1 l2 = Zset.diff l1 l2 - let union l1 l2 = Zset.union l1 l2 - let inter (l1:Zset) l2 = Zset.inter l1 l2 - let subset (l1:Zset) l2 = Zset.subset l1 l2 - let empty = Zset.empty int_order - let isNonEmpty s = not (Zset.isEmpty s) - let ofList l = Zset.addList l empty - let toList l = Zset.elements l - // -------------------------------------------------------------------- // Basic operations on code. // -------------------------------------------------------------------- -let destinationsOfInstr i = - match i with - | I_leave l | I_br l -> [l] - | I_brcmp (_,l1,l2) -> [l1; l2] - | I_switch (ls,l) -> CodeLabels.toList (CodeLabels.ofList (l::ls)) - | I_endfinally | I_endfilter | I_ret | I_throw | I_rethrow - | I_call (Tailcall,_,_)| I_callvirt (Tailcall,_,_)| I_callconstraint (Tailcall,_,_,_) - | I_calli (Tailcall,_,_) -> [] - | _ -> [] - -let destinationsOfBasicBlock (bblock:ILBasicBlock) = destinationsOfInstr bblock.LastInstruction - -let instrIsTailcall i = - match i with - | I_call (Tailcall,_,_)| I_callvirt (Tailcall,_,_) | I_callconstraint (Tailcall,_,_,_) | I_calli (Tailcall,_,_) -> true - | _ -> false - -let instrIsBasicBlockEnd i = - instrIsTailcall i || - match i with - | I_leave _ | I_br _ | I_brcmp _ | I_switch _ | I_endfinally - | I_endfilter | I_ret | I_throw | I_rethrow -> true - | _ -> false - -let checks = false -let _ = if checks then dprintn "Warning - Il.checks is on" - -let rec accEntriesOfCode c acc = - match c with - | ILBasicBlock bb -> CodeLabels.add bb.Label acc - | GroupBlock (_,l) -> List.foldBack accEntriesOfCode l acc - | RestrictBlock (ls,c) -> CodeLabels.union acc (CodeLabels.diff (entriesOfCodeAsSet c) (CodeLabels.ofList ls)) - | TryBlock (l,_r) -> accEntriesOfCode l acc - -and entriesOfCodeAsSet c = - accEntriesOfCode c CodeLabels.empty - -let rec accExitsOfCode c acc = - let basicOutsideLabels = - match c with - | ILBasicBlock bblock -> CodeLabels.addList (destinationsOfBasicBlock bblock) acc - | GroupBlock (_,l) -> List.foldBack accExitsOfCode l acc - | RestrictBlock (ls,c) -> CodeLabels.union acc (CodeLabels.diff (exitsOfCodeAsSet c) (CodeLabels.ofList ls)) - | TryBlock (l,_r) -> accExitsOfCode l acc - CodeLabels.diff basicOutsideLabels (entriesOfCodeAsSet c) - -and exitsOfCodeAsSet c = accExitsOfCode c CodeLabels.empty - -let entriesOfCode c = CodeLabels.toList (entriesOfCodeAsSet c) -let exitsOfCode c = CodeLabels.toList (exitsOfCodeAsSet c) - -/// Finds all labels defined within this code block, seeing through restrictions. -/// This assumes that labels are unique within the code blocks, even if hidden behind restrictions. -/// -/// Repeats in the list indicate this invariant is broken. -let rec accLabelsOfCode acc c = - match c with - | ILBasicBlock bb -> bb.Label::acc - | GroupBlock (_,l) -> List.fold accLabelsOfCode acc l - | RestrictBlock (_ls,c) -> accLabelsOfCode acc c - | TryBlock (l,r) -> let acc = accLabelsOfCode acc l - let acc = accLabelsOfSEH acc r - acc -and accLabelsOfSEH acc = function - | FaultBlock code -> accLabelsOfCode acc code - | FinallyBlock code -> accLabelsOfCode acc code - | FilterCatchBlock fcodes -> List.fold accLabelsOfFilterCode acc fcodes - -and accLabelsOfFilterCode acc = function - | TypeFilter _,code -> accLabelsOfCode acc code - | CodeFilter test,code -> let accA = accLabelsOfCode acc code - let accB = accLabelsOfCode accA test - accB - -let labelsOfCode code = accLabelsOfCode [] code - -(* - -From the ECMA spec: - -There are only two ways to enter a try block from outside its lexical body: - - Branching to or falling into the try block's first instruction. The branch may be made using a 37 -conditional branch, an unconditional branch, or a leave instruction. 38 - - Using a leave instruction from that try's catch block. In this case, correct CIL code may 39 -branch to any instruction within the try block, not just its first instruction, so long as that 40 -branch target is not protected by yet another try, nested withing the first -*) - - -let checkILCode code = - if checks then - match code with - | RestrictBlock (ls,c') -> - (* - if not (CodeLabels.subset ls (entriesOfCode c')) then begin - dprintn ("* warning: Restricting labels that are not declared in block, e.g. "+ (List.head (CodeLabels.diff ls (entriesOfCode c')))); - dprintn ("* warning: Labels in block are: "+ (String.concat "," (entriesOfCode c'))); - dprintn ("* warning: Labels being restricted are: "+ (String.concat "," ls)); - end; - *) - let cls = (CodeLabels.inter (CodeLabels.ofList ls) (exitsOfCodeAsSet c')) - if (CodeLabels.isNonEmpty cls) then - dprintn ("* warning: restricting unsatisfied exits from a block, e.g. "+ formatCodeLabel (List.head (CodeLabels.toList cls))); - | TryBlock (_l,r) -> - begin match r with - | FaultBlock b | FinallyBlock b -> - if (CodeLabels.isNonEmpty (CodeLabels.inter (exitsOfCodeAsSet b) (entriesOfCodeAsSet b))) then - dprintn "* warning: exits from fault or finally blocks must leave the block"; - let n = List.length (entriesOfCode b) - if not (n = 1) then dprintn "* warning: zero or more than one entry to a fault or finally block"; - | FilterCatchBlock r -> - List.iter - (fun (flt,z) -> - let m = List.length (entriesOfCode z) - if not (m = 1) then dprintn "* warning: zero or more than one entry to a catch block"; - match flt with - | CodeFilter y -> - if (CodeLabels.isNonEmpty (exitsOfCodeAsSet y)) then dprintn "* warning: exits exist from filter block - you must always exit using endfinally"; - let n = List.length (entriesOfCode y) - if not (n = 1) then dprintn "* warning: zero or more than one entry to a filter block"; - | TypeFilter _ty -> ()) - r; - end; - | ILBasicBlock bb -> - if (Array.length bb.Instructions) = 0 then dprintn ("* warning: basic block " + formatCodeLabel bb.Label + " is empty") - elif not (instrIsBasicBlockEnd (bb.Instructions.[Array.length bb.Instructions - 1])) then failwith "* warning: bblock does not end in an appropriate instruction"; - - | _ -> () - match code with - | RestrictBlock (labs,c) when (isNil labs) -> c - | GroupBlock ([],[c]) -> c - | _ -> code - - -let mkBasicBlock bb = ILBasicBlock bb -let mkScopeBlock (a,b) = GroupBlock (a,[checkILCode b]) -let mkGroupBlockFromCode (internals,codes) = RestrictBlock (internals,checkILCode (GroupBlock ([],codes))) -let mkGroupBlock (internals,blocks) = mkGroupBlockFromCode (internals,List.map checkILCode blocks) - -let mkRestrictBlock lab c = RestrictBlock (CodeLabels.toList (CodeLabels.remove lab (entriesOfCodeAsSet c)),c) -let mkTryFinallyBlock (tryblock, enterFinallyLab, finallyBlock) = - TryBlock(checkILCode tryblock, FinallyBlock (checkILCode (mkRestrictBlock enterFinallyLab (checkILCode finallyBlock)))) - -let mkTryFaultBlock (tryblock, entarFaultLab, faultBlock) = - TryBlock(checkILCode tryblock, FaultBlock (checkILCode (mkRestrictBlock entarFaultLab (checkILCode faultBlock)))) - -let mkTryMultiFilterCatchBlock (tryblock, clauses) = - TryBlock - (checkILCode tryblock, - FilterCatchBlock - (clauses |> List.map (fun (flt, (enter_catch_lab, catchblock)) -> - let fltcode = - match flt with - | Choice1Of2 (enter_filter_lab, filterblock) -> - CodeFilter (checkILCode (mkRestrictBlock enter_filter_lab (checkILCode filterblock))) - | Choice2Of2 ty -> - TypeFilter ty - fltcode, - checkILCode (mkRestrictBlock enter_catch_lab (checkILCode catchblock))))) - +let formatCodeLabel (x:int) = "L"+string x let new_generator () = let i = ref 0 @@ -2187,61 +2013,34 @@ let new_generator () = let codeLabelGenerator = (new_generator () : unit -> ILCodeLabel) let generateCodeLabel x = codeLabelGenerator x -let uniqueEntryOfCode c = - match entriesOfCode c with - | [] -> failwith ("uniqueEntryOfCode: no entries to code") - | [inlab] -> inlab - | labs -> failwith ("uniqueEntryOfCode: need one entry to code, found: "+String.concat "," (List.map formatCodeLabel labs)) - -let uniqueExitOfCode c = - match exitsOfCode c with - | [] -> failwith ("uniqueExitOfCode: no exits from code") - | [outlab] -> outlab - | labs -> failwith ("uniqueExitOfCode: need one exit from code, found: "+String.concat "," (List.map formatCodeLabel labs)) - -let mkNonBranchingInstrs inplab instrs = - checkILCode (mkBasicBlock {Label=inplab; Instructions= Array.ofList instrs}) -let mkNonBranchingInstrsThen inplab instrs instr = - if nonNil instrs && instrIsBasicBlockEnd (List.last instrs) then failwith "mkNonBranchingInstrsThen: bblock already terminates with a control flow instruction"; - mkNonBranchingInstrs inplab (instrs @ [ instr ]) - -let mkNonBranchingInstrsThenRet inplab instrs = - mkNonBranchingInstrsThen inplab instrs I_ret +let instrIsRet i = + match i with + | I_ret -> true + | _ -> false -let mkNonBranchingInstrsThenBr inplab instrs lab = - mkNonBranchingInstrsThen inplab instrs (I_br lab) +let nonBranchingInstrsToCode instrs : ILCode = + let instrs = Array.ofList instrs + let instrs = + if instrs.Length <> 0 && instrIsRet (Array.last instrs) then instrs + else Array.append instrs [| I_ret |] -let nonBranchingInstrsToCode instrs = - let inplab = generateCodeLabel () - if nonNil instrs && instrIsBasicBlockEnd (List.last instrs) then - mkNonBranchingInstrs inplab instrs - else - mkNonBranchingInstrsThenRet inplab instrs + { Labels = Dictionary() + Instrs = instrs + Exceptions = [] + Locals = [] } -let joinCode code1 code2 = - if not (uniqueExitOfCode code1 = uniqueEntryOfCode code2) then - dprintn "* warning: joinCode: exit of code1 is not entry of code 2"; - checkILCode - (RestrictBlock ([uniqueExitOfCode code1], - (checkILCode (mkGroupBlock ([],[ code1; code2 ]))))) // -------------------------------------------------------------------- -// Security declarations (2) +// // -------------------------------------------------------------------- -let emptyILSecurityDecls = SecurityDecls [] -let mkILSecurityDecls l = match l with [] -> emptyILSecurityDecls | _ -> SecurityDecls l -let mkILLazySecurityDecls l = SecurityDeclsLazy l - - -// -------------------------------------------------------------------- -// ILX stuff -// -------------------------------------------------------------------- +let emptyILSecurityDecls = ILPermissions.SecurityDecls [] +let mkILSecurityDecls l = match l with [] -> emptyILSecurityDecls | _ -> ILPermissions.SecurityDecls l +let mkILLazySecurityDecls l = ILPermissions.SecurityDeclsLazy l let mkILTyvarTy tv = ILType.TypeVar tv - let mkILSimpleTypar nm = { Name=nm; Constraints=emptyILTypes; @@ -2288,8 +2087,6 @@ let emptyILTypeDefs = mkILTypeDefsFromArray [| |] // -------------------------------------------------------------------- // Operations on method tables. -// -// REVIEW: this data structure looks substandard // -------------------------------------------------------------------- let mkILMethodsFromArray xs = ILMethodDefs (fun () -> xs) @@ -2300,7 +2097,6 @@ let emptyILMethods = mkILMethodsFromArray [| |] let filterILMethodDefs f (mdefs: ILMethodDefs) = ILMethodDefs (fun () -> mdefs.AsArray |> Array.filter f) - // -------------------------------------------------------------------- // Operations and defaults for modules, assemblies etc. // -------------------------------------------------------------------- @@ -2937,7 +2733,7 @@ let instILType i t = instILTypeAux 0 i t // MS-IL: Parameters, Return types and Locals // -------------------------------------------------------------------- -let mkILParam (name,ty) = +let mkILParam (name,ty) : ILParameter = { Name=name; Default=None; Marshal=None; @@ -2954,7 +2750,7 @@ let mkILReturn ty : ILReturn = Type=ty; CustomAttrs=emptyILCustomAttrs } -let mkILLocal ty dbgInfo = +let mkILLocal ty dbgInfo : ILLocal = { IsPinned=false; Type=ty; DebugInfo=dbgInfo } @@ -2968,12 +2764,12 @@ type ILFieldSpec with // Make a method mbody // -------------------------------------------------------------------- -let mkILMethodBody (zeroinit,locals,maxstack,code,tag) = - { IsZeroInit=zeroinit; - MaxStack=maxstack; - NoInlining=false; - Locals= locals ; - Code= code; +let mkILMethodBody (zeroinit,locals,maxstack,code,tag) : ILMethodBody = + { IsZeroInit=zeroinit + MaxStack=maxstack + NoInlining=false + Locals= locals + Code= code SourceMarker=tag } let mkMethodBody (zeroinit,locals,maxstack,code,tag) = MethodBody.IL (mkILMethodBody (zeroinit,locals,maxstack,code,tag)) @@ -3170,7 +2966,7 @@ let mkILNonGenericInstanceMethod (nm,access,args,ret,impl) = // if one doesn't exist already. // -------------------------------------------------------------------- -let ilmbody_code2code f il = +let ilmbody_code2code f (il: ILMethodBody) = {il with Code = f il.Code} let mdef_code2code f md = @@ -3181,10 +2977,11 @@ let mdef_code2code f md = let b = MethodBody.IL (ilmbody_code2code f il) {md with mdBody= mkMethBodyAux b } -let prependInstrsToCode c1 c2 = - let internalLab = generateCodeLabel () - joinCode (checkILCode (mkBasicBlock {Label=internalLab; - Instructions=Array.ofList (c1 @ [ I_br (uniqueEntryOfCode c2)])})) c2 +let prependInstrsToCode (instrs: ILInstr list) (c2: ILCode) = + let instrs = Array.ofList instrs + let n = instrs.Length + { c2 with Labels = Dictionary.ofList [ for kvp in c2.Labels -> (kvp.Key, kvp.Value + n) ] + Instrs = Array.append instrs c2.Instrs } let prependInstrsToMethod new_code md = mdef_code2code (prependInstrsToCode new_code) md @@ -3432,20 +3229,6 @@ let mkILSimpleModule assname modname dll subsystemVersion useHighEntropyVA tdefs } -//----------------------------------------------------------------------- -// Intermediate parsing structure for exception tables.... -//----------------------------------------------------------------------- - -type ILExceptionClause = - | Finally of (ILCodeLabel * ILCodeLabel) - | Fault of (ILCodeLabel * ILCodeLabel) - | FilterCatch of (ILCodeLabel * ILCodeLabel) * (ILCodeLabel * ILCodeLabel) - | TypeCatch of ILType * (ILCodeLabel * ILCodeLabel) - -type ILExceptionSpec = - { exnRange: (ILCodeLabel * ILCodeLabel); - exnClauses: ILExceptionClause list } - //----------------------------------------------------------------------- // [instructions_to_code] makes the basic block structure of code from // a primitive array of instructions. We @@ -3454,536 +3237,16 @@ type ILExceptionSpec = // [bbstartToCodeLabelMap]. //----------------------------------------------------------------------- -type ILLocalSpec = - { locRange: (ILCodeLabel * ILCodeLabel); - locInfos: ILDebugMapping list } - -type structspec = SEH of ILExceptionSpec | LOCAL of ILLocalSpec - -let delayInsertedToWorkaroundKnownNgenBug _s f = - (* Some random code to prevent inlining of this function *) - let mutable res = 10 - for i = 0 to 2 do - res <- res + 1; - //printf "------------------------executing NGEN bug delay '%s', calling 'f' --------------\n" s; - let res = f() - //printf "------------------------exiting NGEN bug delay '%s' --------------\n" s; - res - - -let popRangeM lo hi (m:Zmap<'Key,'U>) = - let collect k v (rvs,m) = (v :: rvs) , Zmap.remove k m - let rvs,m = Zmap.foldSection lo hi collect m ([],m) - List.rev rvs,m - -type BasicBlockStartsToCodeLabelsMap(instrs,tryspecs,localspecs,lab2pc) = - - // Find all the interesting looking labels that form the boundaries of basic blocks. - // These are the destinations of branches and the boundaries of both exceptions and - // those blocks where locals are live. - let bbstartToCodeLabelMap = - let res = ref CodeLabels.empty - let add_range (a,b) = res := CodeLabels.insert a (CodeLabels.insert b !res) - instrs |> Array.iter (fun i -> res := CodeLabels.addList (destinationsOfInstr i) !res); - - tryspecs |> List.iter (fun espec -> - add_range espec.exnRange; - List.iter (function - | Finally r1 | Fault r1 | TypeCatch (_,r1)-> add_range r1 - | FilterCatch (r1,r2) -> add_range r1; add_range r2) espec.exnClauses); - - localspecs |> List.iter (fun l -> add_range l.locRange) ; - - !res - - // Construct a map that gives a unique ILCodeLabel for each label that - // might be a boundary of a basic block. These will be the labels - // for the basic blocks we end up creating. - let lab2clMap = Dictionary<_,_>(10, HashIdentity.Structural) - let pc2clMap = Dictionary<_,_>(10, HashIdentity.Structural) - let addBBstartPc pc pcs cls = - if pc2clMap.ContainsKey pc then - pc2clMap.[pc], pcs, cls - else - let cl = generateCodeLabel () - pc2clMap.[pc] <- cl; - cl, pc::pcs, CodeLabels.insert cl cls - - let bbstartPcs, bbstart_code_labs = - CodeLabels.fold - (fun bbstart_lab (pcs, cls) -> - let pc = lab2pc bbstart_lab - if logging then dprintf "bblock starts with label %s at pc %d\n" (formatCodeLabel bbstart_lab) pc; - let cl,pcs',cls' = addBBstartPc pc pcs cls - lab2clMap.[bbstart_lab] <- cl; - pcs', - cls') - bbstartToCodeLabelMap - ([], CodeLabels.empty) - let cl0,bbstartPcs, bbstart_code_labs = addBBstartPc 0 bbstartPcs bbstart_code_labs - - - member c.InitialCodeLabel = cl0 - member c.BasicBlockStartPositions = bbstartPcs - member c.BasicBlockStartCodeLabels = bbstart_code_labs - - member c.lab2cl bbLab = - try - lab2clMap.[bbLab] - with :? KeyNotFoundException -> failwith ("basic block label "+formatCodeLabel bbLab+" not declared") - - member c.pc2cl pc = - try - pc2clMap.[pc] - with :? KeyNotFoundException -> - failwith ("internal error while mapping pc "+string pc+" to code label") - - member c.remapLabels i = - match i with - | I_leave l -> I_leave(c.lab2cl l) - | I_br l -> I_br (c.lab2cl l) - | I_brcmp (x,l1,l2) -> I_brcmp(x,c.lab2cl l1, c.lab2cl l2) - | I_switch (ls,l) -> I_switch(List.map c.lab2cl ls, c.lab2cl l) - | _ -> i - -let disjoint_range (start_pc1,end_pc1) (start_pc2,end_pc2) = - ((start_pc1 : int) < start_pc2 && end_pc1 <= start_pc2) || - (start_pc1 >= end_pc2 && end_pc1 > end_pc2) - -let merge_ranges (start_pc1,end_pc1) (start_pc2,end_pc2) = - (min (start_pc1:int) start_pc2, max (end_pc1:int) end_pc2) - -let rangeInsideRange (start_pc1,end_pc1) (start_pc2,end_pc2) = - (start_pc1:int) >= start_pc2 && start_pc1 < end_pc2 && - (end_pc1:int) > start_pc2 && end_pc1 <= end_pc2 - -let lranges_of_clause cl = - match cl with - | Finally r1 -> [r1] - | Fault r1 -> [r1] - | FilterCatch (r1,r2) -> [r1;r2] - | TypeCatch (_ty,r1) -> [r1] - - -type CodeOffsetViewOfLabelledItems(lab2pc) = - member x.labelsToRange p = let (l1,l2) = p in lab2pc l1, lab2pc l2 - - member x.lrange_inside_lrange ls1 ls2 = - rangeInsideRange (x.labelsToRange ls1) (x.labelsToRange ls2) - - member x.disjoint_lranges ls1 ls2 = - disjoint_range (x.labelsToRange ls1) (x.labelsToRange ls2) - - member x.clause_inside_lrange cl lr = - List.forall (fun lr1 -> x.lrange_inside_lrange lr1 lr) (lranges_of_clause cl) - - member x.clauses_inside_lrange cls lr = - List.forall - (fun cl -> x.clause_inside_lrange cl lr) - cls - - member x.tryspec_inside_lrange tryspec1 lr = - (x.lrange_inside_lrange tryspec1.exnRange lr && - x.clauses_inside_lrange tryspec1.exnClauses lr) - - member x.tryspec_inside_clause tryspec1 cl = - List.exists (fun lr -> x.tryspec_inside_lrange tryspec1 lr) (lranges_of_clause cl) - - member x.locspec_inside_clause locspec1 cl = - List.exists (fun lr -> x.lrange_inside_lrange locspec1.locRange lr) (lranges_of_clause cl) - - member x.tryspec_inside_tryspec tryspec1 tryspec2 = - x.tryspec_inside_lrange tryspec1 tryspec2.exnRange || - List.exists (fun c2 -> x.tryspec_inside_clause tryspec1 c2) tryspec2.exnClauses - - member x.locspec_inside_tryspec locspec1 tryspec2 = - x.lrange_inside_lrange locspec1.locRange tryspec2.exnRange || - List.exists (fun c2 -> x.locspec_inside_clause locspec1 c2) tryspec2.exnClauses - - member x.tryspec_inside_locspec tryspec1 locspec2 = - x.tryspec_inside_lrange tryspec1 locspec2.locRange - - member x.disjoint_clause_and_lrange cl lr = - List.forall (fun lr1 -> x.disjoint_lranges lr1 lr) (lranges_of_clause cl) - - member x.disjoint_clauses_and_lrange cls lr = - List.forall (fun cl -> x.disjoint_clause_and_lrange cl lr) cls - - member x.disjoint_tryspec_and_lrange tryspec1 lr = - (x.disjoint_lranges tryspec1.exnRange lr && - x.disjoint_clauses_and_lrange tryspec1.exnClauses lr) - - member x.disjoint_tryspec_and_clause tryspec1 cl = - List.forall (fun lr -> x.disjoint_tryspec_and_lrange tryspec1 lr) (lranges_of_clause cl) - - member x.tryspec_disjoint_from_tryspec tryspec1 tryspec2 = - x.disjoint_tryspec_and_lrange tryspec1 tryspec2.exnRange && - List.forall (fun c2 -> x.disjoint_tryspec_and_clause tryspec1 c2) tryspec2.exnClauses - - member x.tryspec_disjoint_from_locspec tryspec1 locspec2 = - x.disjoint_tryspec_and_lrange tryspec1 locspec2.locRange - - member x.locspec_disjoint_from_locspec locspec1 locspec2 = - x.disjoint_lranges locspec1.locRange locspec2.locRange - - member x.locspec_inside_locspec locspec1 locspec2 = - x.lrange_inside_lrange locspec1.locRange locspec2.locRange - - member x.structspec_inside_structspec specA specB = (* only for sanity checks, then can be removed *) - match specA,specB with - | SEH tryspecA,SEH tryspecB -> x.tryspec_inside_tryspec tryspecA tryspecB - | SEH tryspecA,LOCAL locspecB -> x.tryspec_inside_locspec tryspecA locspecB - | LOCAL locspecA,SEH tryspecB -> x.locspec_inside_tryspec locspecA tryspecB - | LOCAL locspecA,LOCAL locspecB -> x.locspec_inside_locspec locspecA locspecB - - // extent (or size) is the sum of range extents - // We want to build in increasing containment-order, that's a partial order. - // Size-order implies containment-order, and size-order is a total order. - member x.extent_structspec ss = - let extent_range (start_pc,end_pc) = end_pc - start_pc - let extent_lrange lrange = extent_range (x.labelsToRange lrange) - let extent_locspec locspec = extent_lrange locspec.locRange - let extent_list extent_item items = List.fold (fun acc item -> acc + extent_item item) 0 items - let extent_list2 extent_item items = List.fold (fun acc item -> acc + extent_item item) 0 items - let extent_clause cl = extent_list extent_lrange (lranges_of_clause cl) - let extent_tryspec tryspec = extent_lrange tryspec.exnRange + (extent_list2 extent_clause tryspec.exnClauses) - - match ss with - | LOCAL locspec -> extent_locspec locspec - | SEH tryspec -> extent_tryspec tryspec - - (* DIAGNOSTICS: START ------------------------------ *) - member x.string_of_structspec ss = - let stringOfRange (l1,l2) = - let pc1,pc2 = x.labelsToRange ((l1,l2)) - formatCodeLabel l1+"("+string pc1+")-"+ formatCodeLabel l2+"("+string pc2+")" - let string_of_clause cl = String.concat "+" (List.map stringOfRange (lranges_of_clause cl)) - let string_of_tryspec tryspec = "tryspec"+ stringOfRange tryspec.exnRange + "--" + String.concat " / " (List.map string_of_clause tryspec.exnClauses) - let string_of_locspec locspec = "local "+(String.concat ";" (locspec.locInfos |> List.map (fun l -> l.LocalName)))+": "+ stringOfRange locspec.locRange - match ss with - | SEH tryspec -> string_of_tryspec tryspec - | LOCAL locspec -> string_of_locspec locspec - - - -// Stage 2b - Given an innermost tryspec, collect together the -// blocks covered by it. Preserve the essential ordering of blocks. -let blockForInnerTrySpec (codeOffsetView:CodeOffsetViewOfLabelledItems, - coverageOfCodes, - addBlocks, - computeCoveredBlocks, - bbstartToCodeLabelMap:BasicBlockStartsToCodeLabelsMap) tryspec state0 = - - let (blocks, remainingBasicBlockStarts) = state0 - let tryBlocks, otherBlocks = computeCoveredBlocks (codeOffsetView.labelsToRange tryspec.exnRange) blocks - if isNil tryBlocks then (dprintn "try block specification covers no real code"; state0) else - let getClause r otherBlocks = - let clauseBlocks, otherBlocks = computeCoveredBlocks (codeOffsetView.labelsToRange r) otherBlocks - if isNil clauseBlocks then - failwith "clause block specification covers no real code"; - (* The next line computes the code label for the entry to the clause *) - let clauseEntryLabel = bbstartToCodeLabelMap.lab2cl (fst r) - // Now compute the overall clause, with labels still visible. - let clauseBlock = mkGroupBlock ([],List.map snd clauseBlocks) - (* if logging then dprintf "-- clause entry label is %s" clauseEntryLabel; *) - (clauseEntryLabel, clauseBlocks, clauseBlock), otherBlocks - let tryCodeBlocks = List.map snd tryBlocks - let tryEntryLabel = bbstartToCodeLabelMap.lab2cl (fst tryspec.exnRange) - let tryHiddn = CodeLabels.remove tryEntryLabel (List.foldBack (entriesOfCodeAsSet >> CodeLabels.union) tryCodeBlocks CodeLabels.empty) - let tryBlock = mkGroupBlock (CodeLabels.toList tryHiddn,tryCodeBlocks) - - match tryspec.exnClauses with - | Finally _ :: _ :: _ -> failwith "finally clause combined with others" - | [ Finally r ] | [ Fault r ] -> - - let maker = - match tryspec.exnClauses with - [ Finally _ ] -> mkTryFinallyBlock - | [ Fault _ ] -> mkTryFaultBlock - | _ -> failwith "" - - let (clauseEntryLabel, clauseBlocks, clauseBlock), otherBlocks = getClause r otherBlocks - let newBlockRange = coverageOfCodes (tryBlocks@clauseBlocks) - // The next construction joins the blocks together. - // It automatically hides any internal labels used in the - // clause blocks. Only the entry to the clause is kept visible. - // We hide the entries to the try block up above. - let newBlock = maker (tryBlock,clauseEntryLabel,clauseBlock) - // None of the entries to the clause block are visible outside the - // entire try-clause construct, nor the other entries to the try block - // apart from the one at the top. - let newStarts = CodeLabels.diff remainingBasicBlockStarts (CodeLabels.union tryHiddn (entriesOfCodeAsSet clauseBlock)) - // Now return the new block, the remaining blocks and the new set - // of entries. - addBlocks otherBlocks [(newBlockRange, newBlock)], newStarts - - | clauses when clauses |> List.forall (function | FilterCatch _ -> true | TypeCatch _ -> true | _ -> false) -> - - let clause_infos, otherBlocks (*(prior,posterior)*) = - List.fold - (fun (sofar,otherBlocks) cl -> - match cl with - | FilterCatch(r1,r2) -> - let ((lab1,_,bl1) as _info1),otherBlocks = getClause r1 otherBlocks - let info2,otherBlocks = getClause r2 otherBlocks - (sofar@[(Choice1Of2 (lab1,bl1),info2)]), otherBlocks - | TypeCatch(typ,r2) -> - let info2,otherBlocks = getClause r2 otherBlocks - (sofar@[(Choice2Of2 typ,info2)]), otherBlocks - | _ -> failwith "internal error") - ([],otherBlocks) - clauses - let newBlockRange = - // Ignore filter blocks when computing this range - // REVIEW: They must always come before the catch blocks. - coverageOfCodes - (tryBlocks@ - ((List.collect (fun (_,(_,blocks2,_)) -> blocks2) clause_infos))) - - // The next construction joins the blocks together. - // It automatically hides any internal labels used in the - // clause blocks. Only the entry to the clause is kept visible. - let newBlock = - mkTryMultiFilterCatchBlock - (tryBlock, - List.map - (fun (choice,(lab2,_,bl2)) -> choice, (lab2,bl2)) - clause_infos) - // None of the entries to the filter or catch blocks are - // visible outside the entire exception construct. - let newStarts = - CodeLabels.diff remainingBasicBlockStarts - (CodeLabels.union tryHiddn - (List.foldBack - (fun (flt,(_,_,ctch_blck)) acc -> - CodeLabels.union - (match flt with - | Choice1Of2 (_,flt_block) -> entriesOfCodeAsSet flt_block - | Choice2Of2 _ -> CodeLabels.empty) - (CodeLabels.union (entriesOfCodeAsSet ctch_blck) acc)) - clause_infos - CodeLabels.empty)) - // Now return the new block, the remaining blocks and the new set - // of entries. - addBlocks otherBlocks [ (newBlockRange, newBlock)], newStarts - | _ -> failwith "invalid pattern of exception constructs" - - - -let doStructure' (codeOffsetView:CodeOffsetViewOfLabelledItems, - computeCoveredBlocks, - coverageOfCodes, - addBlocks, - bbstartToCodeLabelMap:BasicBlockStartsToCodeLabelsMap) - structspecs - blockState = - - (* Stage 2b - Given an innermost tryspec, collect together the *) - (* blocks covered by it. Preserve the essential ordering of blocks. *) - let blockForInnerLocSpec locspec ((blocks, remainingBasicBlockStarts) as state0) = - let scopeBlocks, otherBlocks (*(prior,posterior)*) = computeCoveredBlocks (codeOffsetView.labelsToRange locspec.locRange) blocks - if isNil scopeBlocks then (dprintn "scope block specification covers no real code"; state0) else - let newBlock = mkScopeBlock (locspec.locInfos,mkGroupBlock ([],List.map snd scopeBlocks)) - let newBlockRange = coverageOfCodes scopeBlocks - addBlocks otherBlocks [ (newBlockRange, newBlock)], remainingBasicBlockStarts - - // Require items by increasing inclusion-order. - // Order by size/extent. - // a) size-ordering implies containment-ordering. - // b) size-ordering is total, so works with List.sort - let buildOrder = Order.orderOn codeOffsetView.extent_structspec int_order - - (* checkOrder: checking is O(n^2) *) -(* - let rec checkOrder = function - | [] -> () - | sA::sBs -> List.iter (fun sB -> - if codeOffsetView.structspec_inside_structspec sB sA && not (codeOffsetView.structspec_inside_structspec sA sB) then ( - dprintf "sA = %s\n" (codeOffsetView.string_of_structspec sA); - dprintf "sB = %s\n" (codeOffsetView.string_of_structspec sB); - assert false - )) sBs; - checkOrder sBs -*) - - let structspecs = List.sortWithOrder buildOrder structspecs - - (* if sanity_check_order then checkOrder structspecs; *) (* note: this check is n^2 *) - let buildBlock blockState = function - | SEH tryspec -> blockForInnerTrySpec (codeOffsetView,coverageOfCodes,addBlocks,computeCoveredBlocks,bbstartToCodeLabelMap) tryspec blockState - | LOCAL locspec -> blockForInnerLocSpec locspec blockState - List.fold buildBlock blockState structspecs - // REVIEW: this function shows up on performance traces. If we eliminated the last ILX->IL rewrites from the // F# compiler we could get rid of this structured code representation from Abstract IL altogether and // never convert F# code into this form. -let buildILCode methName lab2pc instrs tryspecs localspecs = - - let bbstartToCodeLabelMap = BasicBlockStartsToCodeLabelsMap(instrs,tryspecs,localspecs,lab2pc) - let codeOffsetView = CodeOffsetViewOfLabelledItems(lab2pc) - - let basicInstructions = Array.map bbstartToCodeLabelMap.remapLabels instrs - - (* DIAGNOSTICS: END -------------------------------- *) - - let buildCodeFromInstructionArray instrs = - - // Consume instructions until we hit the end of the basic block, either - // by hitting a control-flow instruction or by hitting the start of the - // next basic block by fall-through. - let rec consumeBBlockInstrs instrs rinstrs (pc:int) nextBBstartPc = - (* rinstrs = accumulates instructions in reverse order *) - if pc = (Array.length instrs) then - dprintn "* WARNING: basic block at end of method ends without a leave, branch, return or throw. Adding throw\n"; - pc,List.rev (I_throw :: rinstrs) - // The next test is for drop-through at end of bblock, when we just insert - // a branch to the next bblock. - elif (match nextBBstartPc with Some pc' -> pc = pc' | _ -> false) then - if logging then dprintf "-- pushing br, pc = nextBBstartPc = %d\n" pc; - pc,List.rev (I_br (bbstartToCodeLabelMap.pc2cl pc) :: rinstrs) - else - // Otherwise bblocks end with control-flow. - let i = instrs.[pc] - let pc' = pc + 1 - if instrIsBasicBlockEnd i then - if instrIsTailcall i then - if pc' = instrs.Length || (match instrs.[pc'] with I_ret -> false | _ -> true) then - failwithf "a tailcall must be followed by a return, instrs = %A" instrs - elif (match nextBBstartPc with Some pc'' -> pc' = pc'' | _ -> false) then - // In this obscure case, someone branches to the return instruction - // following the tailcall, so we'd better build a basic block - // containing just that return instruction. - pc', List.rev (i :: rinstrs) - else - // Otherwise skip the return instruction, but keep the tailcall. - pc'+1, List.rev (i :: rinstrs) - else - pc', List.rev (i :: rinstrs) - else - // recursive case - consumeBBlockInstrs instrs (i::rinstrs) pc' nextBBstartPc - - (* type block = (int * int) * Code // a local type (alias) would be good, good for intelisense too *) - let rec consumeOneBlock bbstartPc nextBBstartPc currentPc = - if currentPc = (Array.length instrs) then None - elif bbstartPc < currentPc then failwith "internal error: bad basic block structure (missing bblock start marker?)" - elif bbstartPc > currentPc then - (* dprintn ("* ignoring unreachable instruction in method: "^ methName); *) - consumeOneBlock bbstartPc nextBBstartPc (currentPc + 1) - else - let pc', bblockInstrs = consumeBBlockInstrs instrs [] bbstartPc nextBBstartPc - if logging then dprintf "-- making bblock, entry label is %s, length = %d, bbstartPc = %d\n" (formatCodeLabel (bbstartToCodeLabelMap.pc2cl bbstartPc)) (List.length bblockInstrs) bbstartPc; - let bblock = mkBasicBlock {Label= bbstartToCodeLabelMap.pc2cl bbstartPc; Instructions=Array.ofList bblockInstrs} - - let bblockRange = (bbstartPc, pc') - // Return the bblock and the range of instructions that the bblock covered. - // Also return any remaining instructions and the pc' for the first - // such instruction. - Some ((bblockRange, bblock), pc') - - let fetchBasicBlocks bbstartToCodeLabelMap currentPc = - let rec loop bbstartToCodeLabelMap currentPc acc = - match bbstartToCodeLabelMap with - | [] -> - (* if currentPc <> Array.length instrs then - dprintn ("* ignoring instructions at end of method: "+ methName); *) - List.rev acc - | h::t -> - let h2 = match t with [] -> None | h2:: _ -> assert (not (h = h2)); Some h2 - match consumeOneBlock h h2 currentPc with - | None -> List.rev acc - | Some (bblock, currentPc') -> loop t currentPc' (bblock :: acc) - loop bbstartToCodeLabelMap currentPc [] - - let inside range (brange,_) = - if rangeInsideRange brange range then true else - if disjoint_range brange range then false else - failwith "exception block specification overlaps the range of a basic block" - - (* A "blocks" contain blocks, ordered on startPC. - * Recall, a block is (range,code) where range=(pcStart,pcLast+1). *) - let addBlock m (((startPC,_endPC),_code) as block) = - match Zmap.tryFind startPC m with - | None -> Zmap.add startPC [block] m - | Some blocks -> Zmap.add startPC (block :: blocks) m in (* NOTE: may reverse block *) - - let addBlocks m blocks = List.fold addBlock m blocks - - let mkBlocks blocks = - let emptyBlocks = (Zmap.empty int_order : Zmap) - List.fold addBlock emptyBlocks blocks - - let sanityCheck = false (* linear check - REVIEW: set false and elim checks *) - - let computeCoveredBlocks ((start_pc,end_pc) as range) (blocks: Zmap ) = - // It is assumed that scopes never overlap. - // locinfo scopes could overlap if there is a bug elsewhere. - // If overlaps are discovered, an exception is raised. see NOTE: #overlap. - let pcCovered,blocks = popRangeM start_pc (end_pc - 1) blocks - let coveredBlocks = pcCovered |> List.concat - // Look for bad input, e.g. overlapping locinfo scopes. - let overlapBlocks = List.filter (inside range >> not) coveredBlocks - if not (isNil overlapBlocks) then notFound(); (* see NOTE: #overlap *) - if sanityCheck then ( - let assertIn block = assert (inside range block) - let assertOut block = assert (not (inside range block)) - List.iter assertIn coveredBlocks; - Zmap.iter (fun _ bs -> List.iter assertOut bs) blocks - ); - coveredBlocks,blocks - - let coverageOfCodes blocks = - match blocks with - | [] -> failwith "start_of_codes" - | [(r,_)] -> r - | ((r,_)::t) -> List.foldBack (fun (x,_) acc -> merge_ranges x acc) t r - - delayInsertedToWorkaroundKnownNgenBug "Delay4i3" <| fun () -> +let buildILCode (_methName:string) lab2pc instrs tryspecs localspecs : ILCode = + { Labels = lab2pc + Instrs = instrs + Exceptions = tryspecs + Locals = localspecs } - let doStructure = doStructure' (codeOffsetView, computeCoveredBlocks,coverageOfCodes,addBlocks,bbstartToCodeLabelMap) - - (* Apply stage 1. Compute the blocks not taking exceptions into account. *) - let bblocks = - fetchBasicBlocks (List.sort bbstartToCodeLabelMap.BasicBlockStartPositions) 0 - - let bblocks = mkBlocks bblocks - (* Apply stage 2. Compute the overall morphed blocks. *) - let morphedBlocks,remaining_entries = - let specs1 = List.map (fun x -> SEH x) tryspecs - let specs2 = List.map (fun x -> LOCAL x) localspecs - - try - doStructure (specs1 @ specs2) (bblocks,bbstartToCodeLabelMap.BasicBlockStartCodeLabels) - with :? KeyNotFoundException-> - // NOTE: #overlap. - // Here, "Not_found" indicates overlapping scopes were found. - // Maybe the calling code got the locspecs scopes wrong. - // Try recovery by discarding locspec info... - let string_of_tryspec _tryspec = "tryspec" - let stringOfRange (l1,l2) = - let pc1,pc2 = codeOffsetView.labelsToRange ((l1,l2)) - formatCodeLabel l1+"("+string pc1+")-"+ formatCodeLabel l2+"("+string pc2+")" - let string_of_locspec locspec = "local "+(String.concat ";" (locspec.locInfos |> List.map (fun l -> l.LocalName)))+": "+ stringOfRange locspec.locRange - - dprintf "\nERROR: could not find an innermost exception block or local scope, specs = \n%s\nTrying again without locals." - (String.concat "\n" (List.map string_of_tryspec tryspecs @ List.map string_of_locspec localspecs)); - doStructure specs1 (bblocks,bbstartToCodeLabelMap.BasicBlockStartCodeLabels) - - delayInsertedToWorkaroundKnownNgenBug "Delay4k" <| fun () -> - - let morphedBlocks = Zmap.values morphedBlocks |> List.concat in (* NOTE: may mixup order *) - (* Now join up all the remaining blocks into one block with one entry. *) - if logging then dprintn "-- computing entry label"; - if logging then dprintn ("-- entry label is "+formatCodeLabel bbstartToCodeLabelMap.InitialCodeLabel); - mkGroupBlock - (CodeLabels.toList (CodeLabels.remove bbstartToCodeLabelMap.InitialCodeLabel remaining_entries),List.map snd morphedBlocks) - - - try buildCodeFromInstructionArray basicInstructions - with e -> - dprintn ("* error while converting instructions to code for method: " + methName); - reraise() // -------------------------------------------------------------------- // Detecting Delegates @@ -4475,7 +3738,7 @@ let mkPermissionSet (ilg: ILGlobals) (action,attributes: list<(ILTypeRef * (stri yield! z_unsigned_int bytes.Length; yield! bytes |] - PermissionSet(action,bytes) + ILPermission.PermissionSet(action,bytes) // Parse an IL type signature argument within a custom attribute blob @@ -4844,27 +4107,14 @@ and refs_of_instr s x = | I_seqpoint _ | EI_ldlen_multi _ -> () -and refs_of_il_block s c = - match c with - | ILBasicBlock bb -> Array.iter (refs_of_instr s) bb.Instructions - | GroupBlock (_,l) -> List.iter (refs_of_il_code s) l - | RestrictBlock (_nms,c) -> refs_of_il_code s c - | TryBlock (l,r) -> - refs_of_il_code s l; - match r with - | FaultBlock flt -> refs_of_il_code s flt - | FinallyBlock flt -> refs_of_il_code s flt - | FilterCatchBlock clauses -> - clauses |> List.iter (fun (flt,ctch) -> - refs_of_il_code s ctch; - match flt with - | CodeFilter fltcode -> refs_of_il_code s fltcode - | TypeFilter ty -> refs_of_typ s ty) - -and refs_of_il_code s c = refs_of_il_block s c - -and refs_of_ilmbody s il = - ILList.iter (refs_of_local s) il.Locals; +and refs_of_il_code s (c: ILCode) = + c.Instrs |> Array.iter (refs_of_instr s) + c.Exceptions |> List.iter (fun e -> e.Clause |> (function + | ILExceptionClause.TypeCatch (ilty, _) -> refs_of_typ s ilty + | _ -> ())) + +and refs_of_ilmbody s (il: ILMethodBody) = + ILList.iter (refs_of_local s) il.Locals refs_of_il_code s il.Code and refs_of_local s loc = refs_of_typ s loc.Type diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 6c31d8a0c4c..4a81afa084f 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -577,8 +577,8 @@ type ILInstr = // Control transfer | I_br of ILCodeLabel | I_jmp of ILMethodSpec - | I_brcmp of ILComparisonInstr * ILCodeLabel * ILCodeLabel // second label is fall-through - | I_switch of (ILCodeLabel list * ILCodeLabel) // last label is fallthrough + | I_brcmp of ILComparisonInstr * ILCodeLabel + | I_switch of ILCodeLabel list | I_ret // Method call @@ -667,174 +667,38 @@ type ILInstr = | EI_ilzero of ILType | EI_ldlen_multi of int32 * int32 -/// A list of instructions ending in an unconditionally -/// branching instruction. A basic block has a label which must be unique -/// within the method it is located in. Only the first instruction of -/// a basic block can be the target of a branch. -// -// Details: The last instruction is always a control flow instruction, -// i.e. branch, tailcall, throw etc. -// -// For example -// B1: ldarg 1 -// pop -// ret -// -// will be one basic block: -// ILBasicBlock("B1", [| I_ldarg(1); I_arith(AI_pop); I_ret |]) -type ILBasicBlock = - { Label: ILCodeLabel; - Instructions: ILInstr[] } - member Fallthrough: ILCodeLabel option +[] +type ILExceptionClause = + | Finally of (ILCodeLabel * ILCodeLabel) + | Fault of (ILCodeLabel * ILCodeLabel) + | FilterCatch of (ILCodeLabel * ILCodeLabel) * (ILCodeLabel * ILCodeLabel) + | TypeCatch of ILType * (ILCodeLabel * ILCodeLabel) +[] +type ILExceptionSpec = + { Range: (ILCodeLabel * ILCodeLabel); + Clause: ILExceptionClause } /// Indicates that a particular local variable has a particular source -/// language name within a GroupBlock. This does not effect local +/// language name within a given set of ranges. This does not effect local /// variable numbering, which is global over the whole method. -type ILDebugMapping = +[] +type ILLocalDebugMapping = { LocalIndex: int; LocalName: string; } -/// ILCode -/// -/// The code for a method is made up of a "code" object. Each "code" -/// object gives the contents of the method in a "semi-structured" form, i.e. -/// 1. The structure implicit in the IL exception handling tables -/// has been made explicit -/// 2. No relative offsets are used in the code: all branches and -/// switch targets are made explicit as labels. -/// 3. All "fallthroughs" from one basic block to the next have -/// been made explicit, by adding extra "branch" instructions to -/// the end of basic blocks which simply fallthrough to another basic -/// block. -/// -/// You can convert a straight-line sequence of instructions to structured -/// code by using buildILCode and -/// Most of the interesting code is contained in BasicBlocks. If you're -/// just interested in getting started with the format then begin -/// by simply considering methods which do not contain any branch -/// instructions, or methods which do not contain any exception handling -/// constructs. -/// -/// The above format has the great advantage that you can insert and -/// delete new code blocks without needing to fixup relative offsets -/// or exception tables. -/// -/// ILBasicBlock(bblock) -/// See above -/// -/// GroupBlock(localDebugInfo, blocks) -/// A set of blocks, with interior branching between the blocks. For example -/// B1: ldarg 1 -/// br B2 -/// -/// B2: pop -/// ret -/// -/// will be two basic blocks -/// let b1 = ILBasicBlock("B1", [| I_ldarg(1); I_br("B2") |]) -/// let b2 = ILBasicBlock("B2", [| I_arith(AI_pop); I_ret |]) -/// GroupBlock([], [b1; b2]) -/// -/// A GroupBlock can include a list of debug info records for locally -/// scoped local variables. These indicate that within the given blocks -/// the given local variables are used for the given Debug info -/// will only be recorded for local variables -/// declared in these nodes, and the local variable will only appear live -/// in the debugger for the instructions covered by this node. So if you -/// omit or erase these nodes then no debug info will be emitted for local -/// variables. If necessary you can have one outer ScopeBlock which specifies -/// the information for all the local variables -/// -/// Not all the destination labels used within a group of blocks need -/// be satisfied by that group alone. For example, the interior "try" code -/// of "try"-"catch" construct may be: -/// B1: ldarg 1 -/// br B2 -/// -/// B2: pop -/// leave B3 -/// -/// Again there will be two basic blocks grouped together: -/// let b1 = ILBasicBlock("B1", [| I_ldarg(1); I_br("B2") |]) -/// let b2 = ILBasicBlock("B2", [| I_arith(AI_pop); I_leave("B3") |]) -/// GroupBlock([], [b1; b2]) -/// Here the code must be embedded in a method where "B3" is a label -/// somewhere in the method. -/// -/// RestrictBlock(labels,code) -/// This block hides labels, i.e. the given set of labels represent -/// wiring which is purely internal to the given code block, and may not -/// be used as the target of a branch by any blocks which this block -/// is placed alongside. -/// -/// For example, if a method is made up of: -/// B1: ldarg 1 -/// br B2 -/// -/// B2: ret -/// -/// then the label "B2" is internal. The overall code will -/// be two basic blocks grouped together, surrounded by a RestrictBlock. -/// The label "B1" is then the only remaining visible entry to the method -/// and execution will begin at that label. -/// -/// let b1 = ILBasicBlock("B1", [| I_ldarg(1); I_br("B2") |]) -/// let b2 = ILBasicBlock("B2", [| I_arith(AI_pop); I_leave("B3") |]) -/// let gb1 = GroupBlock([], [b1; b2]) -/// RestrictBlock(["B2"], gb1) -/// -/// RestrictBlock is necessary to build well-formed code. -/// -/// TryBlock(trycode,seh) -/// -/// A try-catch, try-finally or try-fault block. -/// If an exception is raised while executing -/// an instruction in 'trycode' then the exception handler given by -/// 'seh' is executed. -/// -/// Well-formedness conditions for code: -/// -/// Well-formed code includes nodes which explicitly "hide" interior labels. -/// For example, the code object for a method may have only one entry -/// label which is not hidden, and this label will be the label where -/// execution begins. -/// -/// Both filter and catch blocks must have one -/// and only one entry. These entry labels are not visible -/// outside the filter and catch blocks. Filter has no -/// exits (it always uses endfilter), catch may have exits. -/// The "try" block can have multiple entries, i.e. you can branch -/// into a try from outside. They can have multiple exits, each of -/// which will be a "leave". -/// -type ILCode = - | ILBasicBlock of ILBasicBlock - | GroupBlock of ILDebugMapping list * ILCode list - | RestrictBlock of ILCodeLabel list * ILCode - | TryBlock of ILCode * ILExceptionBlock - -/// The 'seh' specification can have several forms: -/// -/// FilterCatchBlock -/// A multi-try-filter-catch block. Execute the -/// filters in order to determine which 'catch' block to catch the -/// exception with. There are two kinds of filters - one for -/// filtering exceptions by type and one by an instruction sequence. -/// Note that filter blocks can't contain any exception blocks. -/// -and ILExceptionBlock = - | FaultBlock of ILCode - | FinallyBlock of ILCode - | FilterCatchBlock of (ILFilterBlock * ILCode) list - -and ILFilterBlock = - | TypeFilter of ILType - | CodeFilter of ILCode +[] +type ILLocalDebugInfo = + { Range: (ILCodeLabel * ILCodeLabel); + DebugMappings: ILLocalDebugMapping list } -val labelsOfCode: ILCode -> ILCodeLabel list -val uniqueEntryOfCode: ILCode -> ILCodeLabel +[] +type ILCode = + { Labels: Dictionary + Instrs:ILInstr[] + Exceptions: ILExceptionSpec list + Locals: ILLocalDebugInfo list } /// Field Init @@ -855,7 +719,7 @@ type ILFieldInit = | Double of double | Null -[] +[] type ILNativeVariant = | Empty | Null @@ -947,7 +811,7 @@ type ILNativeType = /// Local variables -[] +[] type ILLocal = { Type: ILType; IsPinned: bool; @@ -957,7 +821,7 @@ type ILLocal = type ILLocals = ILList /// IL method bodies -[] +[] type ILMethodBody = { IsZeroInit: bool; /// strictly speakin should be a uint16 @@ -1015,6 +879,7 @@ type ILAttributes = /// Method parameters and return values. +[] type ILParameter = { Name: string option; Type: ILType; @@ -1032,6 +897,7 @@ val typesOfILParamsRaw : ILParameters -> ILTypes val typesOfILParamsList : ILParameter list -> ILType list /// Method return values. +[] type ILReturn = { Marshal: ILNativeType option; Type: ILType; @@ -1098,7 +964,7 @@ type PInvokeThrowOnUnmappableChar = | Enabled | Disabled -[] +[] type PInvokeMethod = { Where: ILModuleRef; Name: string; @@ -1885,7 +1751,6 @@ val mkILCustomAttribute: val mkPermissionSet : ILGlobals -> ILSecurityAction * (ILTypeRef * (string * ILType * ILAttribElem) list) list -> ILPermission /// Making code. -val checkILCode: ILCode -> ILCode val generateCodeLabel: unit -> ILCodeLabel val formatCodeLabel : ILCodeLabel -> string @@ -1893,18 +1758,6 @@ val formatCodeLabel : ILCodeLabel -> string /// The function will add a "return" if the last instruction is not an exiting instruction. val nonBranchingInstrsToCode: ILInstr list -> ILCode -/// Make some code that is a straight line sequence of instructions, then do -/// some control flow. The first code label is the entry label of the generated code. -val mkNonBranchingInstrsThen: ILCodeLabel -> ILInstr list -> ILInstr -> ILCode -val mkNonBranchingInstrsThenBr: ILCodeLabel -> ILInstr list -> ILCodeLabel -> ILCode - -/// Make a basic block. The final instruction must be control flow. -val mkNonBranchingInstrs: ILCodeLabel -> ILInstr list -> ILCode - -/// Some more primitive helpers. -val mkBasicBlock: ILBasicBlock -> ILCode -val mkGroupBlock: ILCodeLabel list * ILCode list -> ILCode - /// Helpers for codegen: scopes for allocating new temporary variables. type ILLocalsAllocator = new : preAlloc: int -> ILLocalsAllocator @@ -2123,20 +1976,6 @@ val rescopeILFieldRef: ILScopeRef -> ILFieldRef -> ILFieldRef // The ILCode Builder utility. //---------------------------------------------------------------------- -[] -type ILExceptionClause = - | Finally of (ILCodeLabel * ILCodeLabel) - | Fault of (ILCodeLabel * ILCodeLabel) - | FilterCatch of (ILCodeLabel * ILCodeLabel) * (ILCodeLabel * ILCodeLabel) - | TypeCatch of ILType * (ILCodeLabel * ILCodeLabel) - -type ILExceptionSpec = - { exnRange: (ILCodeLabel * ILCodeLabel); - exnClauses: ILExceptionClause list } - -type ILLocalSpec = - { locRange: (ILCodeLabel * ILCodeLabel); - locInfos: ILDebugMapping list } /// buildILCode: Build code from a sequence of instructions. /// @@ -2164,13 +2003,7 @@ type ILLocalSpec = /// The input can be badly formed in many ways: exception handlers might /// overlap, or scopes of local variables may overlap badly with /// exception handlers. -val buildILCode: - string -> - (ILCodeLabel -> int) -> - ILInstr[] -> - ILExceptionSpec list -> - ILLocalSpec list -> - ILCode +val buildILCode: string -> lab2pc: Dictionary -> instrs:ILInstr[] -> ILExceptionSpec list -> ILLocalDebugInfo list -> ILCode // -------------------------------------------------------------------- // The instantiation utilities. diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index daffb812576..b166a1303df 100644 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -2,112 +2,48 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Morphs +open System.Collections.Generic open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Diagnostics -open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types open Microsoft.FSharp.Compiler.AbstractIL.IL -type 'T morph = 'T -> 'T - -type EnclosingTypeDefs = ILTypeDef list * ILTypeDef - -let checking = false -let notlazy v = Lazy.CreateFromValue v - let mutable morphCustomAttributeData = false -let enablemorphCustomAttributeData() = +let enableMorphCustomAttributeData() = morphCustomAttributeData <- true -let disablemorphCustomAttributeData() = +let disableMorphCustomAttributeData() = morphCustomAttributeData <- false -let mdef_code2code f md = - let code = - match md.mdBody.Contents with - | MethodBody.IL il-> il - | _ -> failwith "mdef_code2code - method not IL" - let code' = MethodBody.IL {code with Code = f code.Code} - {md with mdBody= mkMethBodyAux code'} - -let code_block2block f (c:ILCode) = checkILCode (f c) - -let bblock_instr2instr f bb = - let instrs = bb.Instructions - let len = Array.length instrs - let res = Array.zeroCreate len - for i = 0 to len - 1 do - res.[i] <- f instrs.[i] - {bb with Instructions=res} - -// This is quite performance critical -let bblock_instr2instrs f bb = - let instrs = bb.Instructions - let mutable codebuf = Array.zeroCreate (Array.length instrs) - let mutable codebuf_size = 0 +let code_instr2instr f (code: ILCode) = {code with Instrs= Array.map f code.Instrs} + +let code_instr2instrs f (code: ILCode) = + let instrs = code.Instrs + let codebuf = ResizeArray() + let adjust = Dictionary() + let mutable old = 0 + let mutable nw = 0 for instr in instrs do + adjust.[old] <- nw let instrs : list<_> = f instr for instr2 in instrs do - let sz = codebuf_size - let old_buf_size = Array.length codebuf - let new_size = sz + 1 - if new_size > old_buf_size then - let old = codebuf - let new' = Array.zeroCreate (max new_size (old_buf_size * 4)) - Array.blit old 0 new' 0 sz - codebuf <- new' - - codebuf.[sz] <- instr2 - codebuf_size <- codebuf_size + 1 - - {bb with Instructions = Array.sub codebuf 0 codebuf_size} - -let rec block_bblock2code_typ2typ ((fbb,fty) as f) x = - match x with - | ILBasicBlock bblock -> fbb bblock - | GroupBlock (locs,l) -> GroupBlock(locs,List.map (code_bblock2code_typ2typ f) l) - | TryBlock (tryb,seh) -> - let seh = - match seh with - | FaultBlock b -> FaultBlock (code_bblock2code_typ2typ f b) - | FinallyBlock b -> FinallyBlock (code_bblock2code_typ2typ f b) - | FilterCatchBlock clsl -> - FilterCatchBlock - (List.map (fun (flt,ctch) -> - (match flt with - CodeFilter fltcode -> CodeFilter (code_bblock2code_typ2typ f fltcode) - | TypeFilter ty -> TypeFilter (fty ty)), - code_bblock2code_typ2typ f ctch) clsl) - TryBlock (code_bblock2code_typ2typ f tryb,seh) - | RestrictBlock (ls,c) -> RestrictBlock (ls,code_bblock2code_typ2typ f c) - -and code_bblock2code_typ2typ f (c:ILCode) = checkILCode (block_bblock2code_typ2typ f c) -let topcode_bblock2code_typ2typ f (c:ILCode) = code_bblock2code_typ2typ f c - -let rec block_bblock2code f x = - match x with - | ILBasicBlock bblock -> f bblock - | GroupBlock (locs,l) -> GroupBlock(locs,List.map (code_bblock2code f) l) - | TryBlock (tryb,seh) -> - TryBlock (code_bblock2code f tryb, - begin match seh with - | FaultBlock b -> FaultBlock (code_bblock2code f b) - | FinallyBlock b -> FinallyBlock (code_bblock2code f b) - | FilterCatchBlock clsl -> - FilterCatchBlock - (List.map (fun (flt,ctch) -> - (match flt with - |CodeFilter fltcode -> CodeFilter (code_bblock2code f fltcode) - | TypeFilter _ty -> flt), - code_bblock2code f ctch) clsl) - end) - | RestrictBlock (ls,c) -> RestrictBlock (ls,code_bblock2code f c) - -and code_bblock2code f (c:ILCode) = checkILCode (block_bblock2code f c) -let topcode_bblock2code f (c:ILCode) = code_bblock2code f c + codebuf.Add instr2 + nw <- nw + 1 + old <- old + 1 + adjust.[old] <- nw + { code with + Instrs = codebuf.ToArray() + Labels = Dictionary.ofList [ for kvp in code.Labels -> kvp.Key, adjust.[kvp.Value] ] } + + + +let code_instr2instr_typ2typ (finstr,fty) (c:ILCode) = + let c = code_instr2instr finstr c + { c with + Exceptions = c.Exceptions |> List.map (fun e -> { e with Clause = e.Clause |> (function ILExceptionClause.TypeCatch (ilty, b) -> ILExceptionClause.TypeCatch (fty ilty, b) | cl -> cl) }) } // -------------------------------------------------------------------- // Standard morphisms - mapping types etc. @@ -171,10 +107,10 @@ let mref_typ2typ (f: ILType -> ILType) (x:ILMethodRef) = returnType= f x.ReturnType) -type formal_scopeCtxt = Choice +type formal_scopeCtxt = Choice let mspec_typ2typ (((factualty : ILType -> ILType) , (fformalty: formal_scopeCtxt -> ILType -> ILType))) (x: ILMethodSpec) = - mkILMethSpecForMethRefInTyRaw(mref_typ2typ (fformalty (Choice1Of3 x)) x.MethodRef, + mkILMethSpecForMethRefInTyRaw(mref_typ2typ (fformalty (Choice1Of2 x)) x.MethodRef, factualty x.EnclosingType, typs_typ2typ factualty x.GenericArgs) @@ -183,7 +119,7 @@ let fref_typ2typ (f: ILType -> ILType) x = Type= f x.Type } let fspec_typ2typ ((factualty,(fformalty : formal_scopeCtxt -> ILType -> ILType))) x = - { FieldRef=fref_typ2typ (fformalty (Choice2Of3 x)) x.FieldRef; + { FieldRef=fref_typ2typ (fformalty (Choice2Of2 x)) x.FieldRef; EnclosingType= factualty x.EnclosingType } let rec celem_typ2typ f celem = @@ -217,18 +153,8 @@ let cattrs_typ2typ ilg f (cs: ILAttributes) = let fdef_typ2typ ilg ftype (fd: ILFieldDef) = {fd with Type=ftype fd.Type; CustomAttrs=cattrs_typ2typ ilg ftype fd.CustomAttrs} -let altfdef_typ2typ ilg ftype (fd: IlxUnionField) = - IlxUnionField( fdef_typ2typ ilg ftype fd.ILField) - -let alts_typ2typ ilg f alts = - Array.map (fun alt -> { alt with altFields = Array.map (altfdef_typ2typ ilg f) alt.altFields; - altCustomAttrs = cattrs_typ2typ ilg f alt.altCustomAttrs }) alts - -let curef_typ2typ ilg f (IlxUnionRef(s,alts,nullPermitted,helpers)) = - IlxUnionRef(s,alts_typ2typ ilg f alts,nullPermitted,helpers) let local_typ2typ f (l: ILLocal) = {l with Type = f l.Type} -let freevar_typ2typ f l = {l with fvType = f l.fvType} let varargs_typ2typ f (varargs: ILVarArgs) = Option.map (ILList.map f) varargs (* REVIEW: convert varargs *) let morphILTypesInILInstr ((factualty,fformalty)) i = @@ -280,13 +206,11 @@ let fdefs_fdef2fdef f (m:ILFieldDefs) = mkILFields (List.map f m.AsList) let morphILTypeDefs f (m: ILTypeDefs) = mkILTypeDefsFromArray (Array.map f m.AsArray) let locals_typ2typ f ls = ILList.map (local_typ2typ f) ls -let freevars_typ2typ f ls = Array.map (freevar_typ2typ f) ls -let ilmbody_bblock2code_typ2typ_maxstack2maxstack fs il = - let (finstr,ftype,fmaxstack) = fs - {il with Code=topcode_bblock2code_typ2typ (finstr,ftype) il.Code; - Locals = locals_typ2typ ftype il.Locals; - MaxStack = fmaxstack il.MaxStack } +let ilmbody_instr2instr_typ2typ fs (il: ILMethodBody) = + let (finstr,ftype) = fs + {il with Code=code_instr2instr_typ2typ (finstr,ftype) il.Code; + Locals = locals_typ2typ ftype il.Locals } let morphILMethodBody (filmbody) (x: ILLazyMethodBody) = let c = @@ -312,9 +236,6 @@ let fdefs_typ2typ ilg f x = fdefs_fdef2fdef (fdef_typ2typ ilg f) x let mdefs_typ2typ_ilmbody2ilmbody ilg fs x = morphILMethodDefs (mdef_typ2typ_ilmbody2ilmbody ilg fs) x -let cuinfo_typ2typ ilg ftype cud = - { cud with cudAlternatives = alts_typ2typ ilg ftype cud.cudAlternatives; } - let mimpl_typ2typ f e = { Overrides = ospec_typ2typ f e.Overrides; OverrideBy = mspec_typ2typ (f,(fun _ -> f)) e.OverrideBy; } @@ -368,31 +289,24 @@ and tdefs_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg enc fs tdefs = let manifest_typ2typ ilg f (m : ILAssemblyManifest) = { m with CustomAttrs = cattrs_typ2typ ilg f m.CustomAttrs } -let morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg - ((ftype: ILModuleDef -> (ILTypeDef list * ILTypeDef) option -> ILMethodDef option -> ILType -> ILType), - fmdefs) m = +let morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg ((ftype: ILModuleDef -> (ILTypeDef list * ILTypeDef) option -> ILMethodDef option -> ILType -> ILType),fmdefs) m = - let ftdefs = - tdefs_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg [] - (ftype m, - fmdefs m) + let ftdefs = tdefs_typ2typ_ilmbody2ilmbody_mdefs2mdefs ilg [] (ftype m,fmdefs m) { m with TypeDefs=ftdefs m.TypeDefs; CustomAttrs=cattrs_typ2typ ilg (ftype m None None) m.CustomAttrs; Manifest=Option.map (manifest_typ2typ ilg (ftype m None None)) m.Manifest } -let module_bblock2code_typ2typ_maxstack2maxstack ilg fs x = - let (fbblock,ftype,fmaxstack) = fs - let filmbody modCtxt tdefCtxt mdefCtxt = ilmbody_bblock2code_typ2typ_maxstack2maxstack (fbblock modCtxt tdefCtxt mdefCtxt, ftype modCtxt (Some tdefCtxt) mdefCtxt, fmaxstack modCtxt tdefCtxt mdefCtxt) +let module_instr2instr_typ2typ ilg fs x = + let (fcode,ftype) = fs + let filmbody modCtxt tdefCtxt mdefCtxt = ilmbody_instr2instr_typ2typ (fcode modCtxt tdefCtxt mdefCtxt, ftype modCtxt (Some tdefCtxt) mdefCtxt) let fmdefs modCtxt tdefCtxt = mdefs_typ2typ_ilmbody2ilmbody ilg (ftype modCtxt (Some tdefCtxt), filmbody modCtxt tdefCtxt) morphILTypeInILModule_ilmbody2ilmbody_mdefs2mdefs ilg (ftype, fmdefs) x -let module_bblock2code_typ2typ ilg (f1,f2) x = - module_bblock2code_typ2typ_maxstack2maxstack ilg (f1, f2, (fun _modCtxt _tdefCtxt _mdefCtxt x -> x)) x let morphILInstrsAndILTypesInILModule ilg (f1,f2) x = - module_bblock2code_typ2typ ilg ((fun modCtxt tdefCtxt mdefCtxt i -> mkBasicBlock (bblock_instr2instr (f1 modCtxt tdefCtxt mdefCtxt) i)), f2) x + module_instr2instr_typ2typ ilg (f1, f2) x -let morphILInstrsInILCode f x = topcode_bblock2code (fun i -> mkBasicBlock (bblock_instr2instrs f i)) x +let morphILInstrsInILCode f x = code_instr2instrs f x let morphILTypeInILModule ilg ftype y = let finstr modCtxt tdefCtxt mdefCtxt = diff --git a/src/absil/ilmorph.fsi b/src/absil/ilmorph.fsi index 1d55dbbcd84..953025cec3a 100644 --- a/src/absil/ilmorph.fsi +++ b/src/absil/ilmorph.fsi @@ -21,5 +21,5 @@ val morphILScopeRefsInILModuleMemoized: ILGlobals -> (ILScopeRef -> ILScopeRef) val morphILInstrsInILCode: (ILInstr -> ILInstr list) -> ILCode -> ILCode -val enablemorphCustomAttributeData : unit -> unit -val disablemorphCustomAttributeData : unit -> unit +val enableMorphCustomAttributeData : unit -> unit +val disableMorphCustomAttributeData : unit -> unit diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 6112fd5b5ff..819cfdb74ee 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -577,7 +577,7 @@ let rec goutput_instr env os inst = match inst with | si when isNoArgInstr si -> output_lid os (wordsOfNoArgInstr si) - | I_brcmp (cmp,tg1,_tg2) -> + | I_brcmp (cmp,tg1) -> output_string os (match cmp with | BI_beq -> "beq" @@ -640,7 +640,7 @@ let rec goutput_instr env os inst = output_string os "stind."; output_basic_type os dt | I_stloc u16 -> output_string os "stloc"; output_short_u16 os u16 - | I_switch (l,_dflt) -> output_string os "switch "; output_parens (output_seq "," output_code_label) os l + | I_switch l -> output_string os "switch "; output_parens (output_seq "," output_code_label) os l | I_callvirt (tl,mspec,varargs) -> output_tailness os tl; output_string os "callvirt "; @@ -759,81 +759,16 @@ let rec goutput_instr env os inst = output_string os "" -let goutput_ilmbody env os il = +let goutput_ilmbody env os (il: ILMethodBody) = if il.IsZeroInit then output_string os " .zeroinit\n"; output_string os " .maxstack "; output_i32 os il.MaxStack; output_string os "\n"; - let output_susp os susp = - match susp with - | Some s -> - output_string os "\nbr "; output_code_label os s; output_string os "\n" - | _ -> () - let commit_susp os susp lab = - match susp with - | Some s when s <> lab -> output_susp os susp - | _ -> () if il.Locals.Length <> 0 then output_string os " .locals("; output_seq ",\n " (goutput_local env) os il.Locals output_string os ")\n" - // Print the code by left-to-right traversal - let rec goutput_block env os (susp,block) = - match block with - | ILBasicBlock bb -> - commit_susp os susp bb.Label; - output_code_label os bb.Label; output_string os ": \n" ; - Array.iter (fun i -> goutput_instr env os i; output_string os "\n") bb.Instructions; - bb.Fallthrough - | GroupBlock (_,l) -> - let new_susp = ref susp - List.iter (fun c -> new_susp := goutput_code env os (!new_susp,c)) l; - !new_susp - | RestrictBlock (_,c) -> goutput_code env os (susp,c) - | TryBlock (c,seh) -> - - commit_susp os susp (uniqueEntryOfCode c); - output_string os " .try {\n"; - let susp = goutput_code env os (None,c) - if (susp <> None) then output_string os "// warning: fallthrough at end of try\n"; - output_string os "\n}"; - match seh with - | FaultBlock flt -> - output_string os "fault {\n"; - output_susp os (goutput_code env os (None,flt)); - output_string os "\n}" - | FinallyBlock flt -> - output_string os "finally {\n"; - output_susp os (goutput_code env os (None,flt)); - output_string os "\n}"; - | FilterCatchBlock clauses -> - List.iter - (fun (flt,ctch) -> - match flt with - | TypeFilter typ -> - output_string os " catch "; - goutput_typ_with_shortened_class_syntax env os typ; - output_string os "{\n"; - output_susp os (goutput_code env os (None,ctch)); - output_string os "\n}" - | CodeFilter fltcode -> - output_string os "filter {\n"; - output_susp os (goutput_code env os (None,fltcode)); - output_string os "\n} catch {\n"; - output_susp os (goutput_code env os (None,ctch)); - output_string os "\n}";) - clauses - None - - and goutput_code env os (susp,code) = - goutput_block env os (susp,code) - - let goutput_topcode env os code = - let final_susp = goutput_code env os (Some (uniqueEntryOfCode code),code) - (match final_susp with Some s -> output_string os "\nbr "; output_code_label os s; output_string os "\n" | _ -> ()) - - goutput_topcode env os il.Code; let goutput_mbody is_entrypoint env os md = match md.mdCodeKind with diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index da96862e43c..b5cebc17372 100644 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -483,10 +483,10 @@ type ILInstrDecoder = | I_method_instr of (ILInstrPrefixesRegister -> ILMethodSpec * ILVarArgs -> ILInstr) | I_unconditional_i32_instr of (ILInstrPrefixesRegister -> ILCodeLabel -> ILInstr) | I_unconditional_i8_instr of (ILInstrPrefixesRegister -> ILCodeLabel -> ILInstr) - | I_conditional_i32_instr of (ILInstrPrefixesRegister -> ILCodeLabel * ILCodeLabel -> ILInstr) - | I_conditional_i8_instr of (ILInstrPrefixesRegister -> ILCodeLabel * ILCodeLabel -> ILInstr) + | I_conditional_i32_instr of (ILInstrPrefixesRegister -> ILCodeLabel -> ILInstr) + | I_conditional_i8_instr of (ILInstrPrefixesRegister -> ILCodeLabel -> ILInstr) | I_string_instr of (ILInstrPrefixesRegister -> string -> ILInstr) - | I_switch_instr of (ILInstrPrefixesRegister -> ILCodeLabel list * ILCodeLabel -> ILInstr) + | I_switch_instr of (ILInstrPrefixesRegister -> ILCodeLabel list -> ILInstr) | I_tok_instr of (ILInstrPrefixesRegister -> ILToken -> ILInstr) | I_sig_instr of (ILInstrPrefixesRegister -> ILCallingSignature * ILVarArgs -> ILInstr) | I_type_instr of (ILInstrPrefixesRegister -> ILType -> ILInstr) @@ -549,30 +549,30 @@ let instrs () = i_br_s, I_unconditional_i8_instr (noPrefixes I_br); i_leave, I_unconditional_i32_instr (noPrefixes (fun x -> I_leave x)); i_br, I_unconditional_i32_instr (noPrefixes I_br); - i_brtrue_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_brtrue,x,y))); - i_brfalse_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_brfalse,x,y))); - i_beq_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_beq,x,y))); - i_blt_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_blt,x,y))); - i_blt_un_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_blt_un,x,y))); - i_ble_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_ble,x,y))); - i_ble_un_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_ble_un,x,y))); - i_bgt_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bgt,x,y))); - i_bgt_un_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bgt_un,x,y))); - i_bge_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bge,x,y))); - i_bge_un_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bge_un,x,y))); - i_bne_un_s, I_conditional_i8_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bne_un,x,y))); - i_brtrue, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_brtrue,x,y))); - i_brfalse, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_brfalse,x,y))); - i_beq, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_beq,x,y))); - i_blt, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_blt,x,y))); - i_blt_un, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_blt_un,x,y))); - i_ble, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_ble,x,y))); - i_ble_un, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_ble_un,x,y))); - i_bgt, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bgt,x,y))); - i_bgt_un, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bgt_un,x,y))); - i_bge, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bge,x,y))); - i_bge_un, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bge_un,x,y))); - i_bne_un, I_conditional_i32_instr (noPrefixes (fun (x,y) -> I_brcmp (BI_bne_un,x,y))); + i_brtrue_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_brtrue,x))); + i_brfalse_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_brfalse,x))); + i_beq_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_beq,x))); + i_blt_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_blt,x))); + i_blt_un_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_blt_un,x))); + i_ble_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_ble,x))); + i_ble_un_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_ble_un,x))); + i_bgt_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_bgt,x))); + i_bgt_un_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_bgt_un,x))); + i_bge_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_bge,x))); + i_bge_un_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_bge_un,x))); + i_bne_un_s, I_conditional_i8_instr (noPrefixes (fun x -> I_brcmp (BI_bne_un,x))); + i_brtrue, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_brtrue,x))); + i_brfalse, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_brfalse,x))); + i_beq, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_beq,x))); + i_blt, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_blt,x))); + i_blt_un, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_blt_un,x))); + i_ble, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_ble,x))); + i_ble_un, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_ble_un,x))); + i_bgt, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_bgt,x))); + i_bgt_un, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_bgt_un,x))); + i_bge, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_bge,x))); + i_bge_un, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_bge_un,x))); + i_bne_un, I_conditional_i32_instr (noPrefixes (fun x -> I_brcmp (BI_bne_un,x))); i_ldstr, I_string_instr (noPrefixes I_ldstr); i_switch, I_switch_instr (noPrefixes I_switch); i_ldtoken, I_tok_instr (noPrefixes I_ldtoken); @@ -2090,9 +2090,8 @@ and sigptrGetLocal ctxt numtypars bytes sigptr = else false, sigptr let typ, sigptr = sigptrGetTy ctxt numtypars bytes sigptr - { IsPinned = pinned; - Type = typ; - DebugInfo = None }, sigptr + let loc : ILLocal = { IsPinned = pinned; Type = typ; DebugInfo = None } + loc, sigptr and readBlobHeapAsMethodSig ctxt numtypars blobIdx = ctxt.readBlobHeapAsMethodSig (BlobAsMethodSigIdx (numtypars,blobIdx)) @@ -2362,7 +2361,7 @@ and seekReadMethod ctxt numtypars (idx:int) = and seekReadParams ctxt (retty,argtys) pidx1 pidx2 = let retRes : ILReturn ref = ref { Marshal=None; Type=retty; CustomAttrs=emptyILCustomAttrs } - let paramsRes = + let paramsRes : ILParameter [] = argtys |> ILList.toArray |> Array.map (fun ty -> @@ -2803,14 +2802,12 @@ and seekReadTopCode ctxt numtypars (sz:int) start seqpoints = let offsDest = (seekReadInt32 ctxt.is (start + (!curr))) curr := !curr + 4; let dest = !curr + offsDest - let next = !curr - f prefixes (rawToLabel dest, rawToLabel next) + f prefixes (rawToLabel dest) | I_conditional_i8_instr f -> let offsDest = int (seekReadSByte ctxt.is (start + (!curr))) curr := !curr + 1; let dest = !curr + offsDest - let next = !curr - f prefixes (rawToLabel dest, rawToLabel next) + f prefixes (rawToLabel dest) | I_unconditional_i32_instr f -> let offsDest = (seekReadInt32 ctxt.is (start + (!curr))) curr := !curr + 4; @@ -2852,18 +2849,13 @@ and seekReadTopCode ctxt numtypars (sz:int) start seqpoints = curr := !curr + 4; i) let dests = List.map (fun offs -> rawToLabel (!curr + offs)) offsets - let next = rawToLabel !curr - f prefixes (dests,next) + f prefixes dests ibuf.Add instr done; // Finished reading instructions - mark the end of the instruction stream in case the PDB information refers to it. markAsInstructionStart !curr ibuf.Count; // Build the function that maps from raw labels (offsets into the bytecode stream) to indexes in the AbsIL instruction stream - let lab2pc lab = - try - ilOffsetsOfLabels.[lab] - with :? KeyNotFoundException-> - failwith ("branch destination "+formatCodeLabel lab+" not found in code") + let lab2pc = ilOffsetsOfLabels // Some offsets used in debug info refer to the end of an instruction, rather than the // start of the subsequent instruction. But all labels refer to instruction starts, @@ -2933,7 +2925,7 @@ and seekReadMethodRVA ctxt (idx,nm,_internalcall,noinline,numtypars) rva = |> List.filter (fun l -> let k,_idx = pdbVariableGetAddressAttributes l k = 1 (* ADDR_IL_OFFSET *)) - let ilinfos = + let ilinfos : ILLocalDebugMapping list = ilvs |> List.map (fun ilv -> let _k,idx = pdbVariableGetAddressAttributes ilv let n = pdbVariableGetName ilv @@ -2942,9 +2934,8 @@ and seekReadMethodRVA ctxt (idx,nm,_internalcall,noinline,numtypars) rva = let thisOne = (fun raw2nextLab -> - { locRange= (raw2nextLab a,raw2nextLab b); - locInfos = ilinfos }) - // this scope covers IL range: "+string a+"-"+string b) + { Range= (raw2nextLab a,raw2nextLab b); + DebugMappings = ilinfos } : ILLocalDebugInfo ) let others = List.foldBack (scopes >> (@)) (Array.toList (pdbScopeGetChildren scp)) [] thisOne :: others let localPdbInfos = [] (* scopes fail for mscorlib scopes rootScope *) @@ -2965,7 +2956,7 @@ and seekReadMethodRVA ctxt (idx,nm,_internalcall,noinline,numtypars) rva = let instrs,_,lab2pc,raw2nextLab = seekReadTopCode ctxt numtypars codeSize codeBase seqpoints (* Convert the linear code format to the nested code format *) let localPdbInfos2 = List.map (fun f -> f raw2nextLab) localPdbInfos - let code = checkILCode (buildILCode nm lab2pc instrs [] localPdbInfos2) + let code = buildILCode nm lab2pc instrs [] localPdbInfos2 MethodBody.IL { IsZeroInit=false; MaxStack= 8; @@ -3079,7 +3070,7 @@ and seekReadMethodRVA ctxt (idx,nm,_internalcall,noinline,numtypars) rva = else sehMap.[key] <- [clause]) clauses; - Seq.fold (fun acc (KeyValue(key,bs)) -> {exnRange=key; exnClauses=bs} :: acc) [] sehMap + ([],sehMap) ||> Seq.fold (fun acc (KeyValue(key,bs)) -> [ for b in bs -> {Range=key; Clause=b} : ILExceptionSpec ] @ acc) seh := sehClauses; moreSections := (sectionFlag &&& e_CorILMethod_Sect_MoreSects) <> 0x0uy; nextSectionBase := sectionBase + sectionSize; @@ -3089,7 +3080,7 @@ and seekReadMethodRVA ctxt (idx,nm,_internalcall,noinline,numtypars) rva = if logging then dprintn ("doing localPdbInfos2"); let localPdbInfos2 = List.map (fun f -> f raw2nextLab) localPdbInfos if logging then dprintn ("done localPdbInfos2, checking code..."); - let code = checkILCode (buildILCode nm lab2pc instrs !seh localPdbInfos2) + let code = buildILCode nm lab2pc instrs !seh localPdbInfos2 if logging then dprintn ("done checking code."); MethodBody.IL { IsZeroInit=initlocals; diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 564e8e7b724..ce080f66b52 100644 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -79,7 +79,7 @@ type System.Reflection.Emit.ModuleBuilder with #else member modB.DefineDocumentAndLog(file,lang,vendor,doctype) = let symDoc = modB.DefineDocument(file,lang,vendor,doctype) - if logRefEmitCalls then printfn "let docWriter%d = moduleBuilder%d.DefineDocument(%A,System.Guid(\"%A\"),System.Guid(\"%A\"),System.Guid(\"%A\"))" (abs <| hash symDoc) (abs <| hash modB) file lang vendor doctype + if logRefEmitCalls then printfn "let docWriter%d = moduleBuilder%d.DefineDocument(@%A,System.Guid(\"%A\"),System.Guid(\"%A\"),System.Guid(\"%A\"))" (abs <| hash symDoc) (abs <| hash modB) file lang vendor doctype symDoc #endif member modB.GetTypeAndLog(nameInModule,flag1,flag2) = @@ -170,19 +170,20 @@ type System.Reflection.Emit.TypeBuilder with member typB.DefineConstructorAndLog(attrs,cconv,parms) = let consB = typB.DefineConstructor(attrs,cconv,parms) - if logRefEmitCalls then printfn "let constructorBuilder%d = typeBuilder%d.DefineConstructor(enum %d,%A,%A)" (abs <| hash consB) (abs <| hash typB) (LanguagePrimitives.EnumToValue attrs) cconv parms + if logRefEmitCalls then printfn "let constructorBuilder%d = typeBuilder%d.DefineConstructor(enum %d,CallingConventions.%A,%A)" (abs <| hash consB) (abs <| hash typB) (LanguagePrimitives.EnumToValue attrs) cconv parms consB member typB.DefineFieldAndLog(nm,ty:System.Type,attrs) = - if logRefEmitCalls then printfn "typeBuilder%d.DefineField(\"%s\",typeof<%s>,enum %d)" (abs <| hash typB) nm ty.FullName (LanguagePrimitives.EnumToValue attrs) - typB.DefineField(nm,ty,attrs) + let fieldB = typB.DefineField(nm,ty,attrs) + if logRefEmitCalls then printfn "let fieldBuilder%d = typeBuilder%d.DefineField(\"%s\",typeof<%s>,enum %d)" (abs <| hash fieldB) (abs <| hash typB) nm ty.FullName (LanguagePrimitives.EnumToValue attrs) + fieldB - member typB.DefinePropertyAndLog(nm,attrs,ty,args) = - if logRefEmitCalls then printfn "typeBuilder%d.DefineProperty(\"%A\",enum %d,%A,%A)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty args + member typB.DefinePropertyAndLog(nm,attrs,ty:System.Type,args) = + if logRefEmitCalls then printfn "typeBuilder%d.DefineProperty(\"%A\",enum %d,typeof<%s>,%A)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty.FullName args typB.DefineProperty(nm,attrs,ty,args) - member typB.DefineEventAndLog(nm,attrs,ty) = - if logRefEmitCalls then printfn "typeBuilder%d.DefineEvent(\"%A\",enum %d,%A)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty + member typB.DefineEventAndLog(nm,attrs,ty:System.Type) = + if logRefEmitCalls then printfn "typeBuilder%d.DefineEvent(\"%A\",enum %d,typeof<%A>)" (abs <| hash typB) nm (LanguagePrimitives.EnumToValue attrs) ty.FullName typB.DefineEvent(nm,attrs,ty) member typB.SetParentAndLog(ty:System.Type) = @@ -271,16 +272,16 @@ type System.Reflection.Emit.ILGenerator with if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, %d)" (abs <| hash x) op.RefEmitName v; x.Emit(op,v) member x.EmitAndLog (op:OpCode,v:MethodInfo) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, meth_%s)" (abs <| hash x) op.RefEmitName v.Name; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, methodBuilder%d) // method %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name; x.Emit(op,v) member x.EmitAndLog (op:OpCode,v:string) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s,\"%s\")" (abs <| hash x) op.RefEmitName v; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s,\"@%s\")" (abs <| hash x) op.RefEmitName v; x.Emit(op,v) member x.EmitAndLog (op:OpCode,v:Type) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, typeof<%s>)" (abs <| hash x) op.RefEmitName v.FullName; x.Emit(op,v) member x.EmitAndLog (op:OpCode,v:FieldInfo) = - if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, field_%s)" (abs <| hash x) op.RefEmitName v.Name; + if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s, fieldBuilder%d) // field %s" (abs <| hash x) op.RefEmitName (abs <| hash v) v.Name; x.Emit(op,v) member x.EmitAndLog (op:OpCode,v:ConstructorInfo) = if logRefEmitCalls then printfn "ilg%d.Emit(OpCodes.%s,constructor_%s)" (abs <| hash x) op.RefEmitName v.DeclaringType.Name; @@ -803,19 +804,13 @@ let convConstructorSpec cenv emEnv (mspec:ILMethodSpec) = queryableTypeGetConstructor cenv emEnv parentTI mref //---------------------------------------------------------------------------- -// emitLabelMark, defineLabel +// emitLabelMark //---------------------------------------------------------------------------- let emitLabelMark emEnv (ilG:ILGenerator) (label:ILCodeLabel) = let lab = envGetLabel emEnv label ilG.MarkLabelAndLog(lab) - -let defineLabel (ilG:ILGenerator) emEnv (label:ILCodeLabel) = - let lab = ilG.DefineLabelAndLog() - envSetLabel emEnv label lab - - //---------------------------------------------------------------------------- // emitInstr cenv - I_arith //---------------------------------------------------------------------------- @@ -1033,10 +1028,10 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | DT_U8 -> ilG.EmitAndLog(OpCodes.Stind_I8) // NOTE: unsigned -> int conversion | DT_REF -> ilG.EmitAndLog(OpCodes.Stind_Ref)) | I_stloc u16 -> ilG.EmitAndLog(OpCodes.Stloc,int16 u16) - | I_br _ -> () + | I_br targ -> ilG.EmitAndLog(OpCodes.Br,envGetLabel emEnv targ) | I_jmp mspec -> ilG.EmitAndLog(OpCodes.Jmp,convMethodSpec cenv emEnv mspec) - | I_brcmp (comp,targ,_) -> emitInstrCompare emEnv ilG comp targ - | I_switch (labels,_) -> ilG.Emit(OpCodes.Switch,Array.ofList (List.map (envGetLabel emEnv) labels)); + | I_brcmp (comp,targ) -> emitInstrCompare emEnv ilG comp targ + | I_switch labels -> ilG.Emit(OpCodes.Switch,Array.ofList (List.map (envGetLabel emEnv) labels)); | I_ret -> ilG.EmitAndLog(OpCodes.Ret) | I_call (tail,mspec,varargs) -> emitSilverlightCheck ilG emitInstrCall cenv emEnv ilG OpCodes.Call tail mspec varargs @@ -1059,14 +1054,14 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = | I_ldftn mspec -> ilG.EmitAndLog(OpCodes.Ldftn,convMethodSpec cenv emEnv mspec) | I_newobj (mspec,varargs) -> emitInstrNewobj cenv emEnv ilG mspec varargs | I_throw -> ilG.EmitAndLog(OpCodes.Throw) - | I_endfinally -> ilG.EmitAndLog(OpCodes.Endfinally) (* capitalization! *) - | I_endfilter -> () (* ilG.EmitAndLog(OpCodes.Endfilter) *) + | I_endfinally -> ilG.EmitAndLog(OpCodes.Endfinally) + | I_endfilter -> ilG.EmitAndLog(OpCodes.Endfilter) | I_leave label -> ilG.EmitAndLog(OpCodes.Leave,envGetLabel emEnv label) - | I_ldsfld (vol,fspec) -> emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Ldsfld ,convFieldSpec cenv emEnv fspec) + | I_ldsfld (vol,fspec) -> emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Ldsfld ,convFieldSpec cenv emEnv fspec) | I_ldfld (align,vol,fspec) -> emitInstrAlign ilG align; emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Ldfld ,convFieldSpec cenv emEnv fspec) - | I_ldsflda fspec -> ilG.EmitAndLog(OpCodes.Ldsflda,convFieldSpec cenv emEnv fspec) - | I_ldflda fspec -> ilG.EmitAndLog(OpCodes.Ldflda ,convFieldSpec cenv emEnv fspec) - | I_stsfld (vol,fspec) -> emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Stsfld ,convFieldSpec cenv emEnv fspec) + | I_ldsflda fspec -> ilG.EmitAndLog(OpCodes.Ldsflda,convFieldSpec cenv emEnv fspec) + | I_ldflda fspec -> ilG.EmitAndLog(OpCodes.Ldflda ,convFieldSpec cenv emEnv fspec) + | I_stsfld (vol,fspec) -> emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Stsfld ,convFieldSpec cenv emEnv fspec) | I_stfld (align,vol,fspec) -> emitInstrAlign ilG align; emitInstrVolatile ilG vol; ilG.EmitAndLog(OpCodes.Stfld ,convFieldSpec cenv emEnv fspec) | I_ldstr s -> ilG.EmitAndLog(OpCodes.Ldstr ,s) | I_isinst typ -> ilG.EmitAndLog(OpCodes.Isinst ,convType cenv emEnv typ) @@ -1202,74 +1197,58 @@ let rec emitInstr cenv (modB : ModuleBuilder) emEnv (ilG:ILGenerator) instr = emitInstr cenv modB emEnv ilG (mkNormalCall(mkILNonGenericMethSpecInTy(cenv.ilg.typ_Array, ILCallingConv.Instance, "GetLength", [cenv.ilg.typ_int32], cenv.ilg.typ_int32))) | i -> Printf.failwithf "the IL instruction %s cannot be emitted" (i.ToString()) -//---------------------------------------------------------------------------- -// emitCode -//---------------------------------------------------------------------------- - -let emitBasicBlock cenv modB emEnv (ilG:ILGenerator) bblock = - emitLabelMark emEnv ilG bblock.Label; - Array.iter (emitInstr cenv modB emEnv ilG) bblock.Instructions; -let emitCode cenv modB emEnv (ilG:ILGenerator) code = - // pre define labels pending determining their actual marks - let labels = labelsOfCode code - let emEnv = List.fold (defineLabel ilG) emEnv labels +let emitCode cenv modB emEnv (ilG:ILGenerator) (code: ILCode) = + // Pre-define the labels pending determining their actual marks + let pc2lab = Dictionary() + let emEnv = + (emEnv, code.Labels) ||> Seq.fold (fun emEnv (KeyValue(label,pc)) -> + let lab = ilG.DefineLabelAndLog() + pc2lab.[pc] <- (if pc2lab.ContainsKey pc then lab :: pc2lab.[pc] else [lab]) + envSetLabel emEnv label lab) - let emitSusp susp = - match susp with - | Some dest -> ilG.EmitAndLog(OpCodes.Br, envGetLabel emEnv dest) - | _ -> () - - let commitSusp susp lab = - match susp with - | Some dest when dest <> lab -> emitSusp susp - | _ -> () - - let rec emitter susp code = - match code with - | ILBasicBlock bblock -> - commitSusp susp bblock.Label; - emitBasicBlock cenv modB emEnv ilG bblock - bblock.Fallthrough - | GroupBlock (_localDebugInfos,codes)-> - List.fold emitter susp codes - | RestrictBlock (_labels,code) -> - code |> emitter susp (* restrictions ignorable: code_labels unique *) - | TryBlock (code,seh) -> - commitSusp susp (uniqueEntryOfCode code); - let _endExBlockL = ilG.BeginExceptionBlockAndLog() - code |> emitter None |> emitSusp - //ilG.MarkLabel endExBlockL; - emitHandler seh; - ilG.EndExceptionBlockAndLog(); - None - and emitHandler seh = - match seh with - | FaultBlock code -> - ilG.BeginFaultBlockAndLog(); - emitter None code |> emitSusp - | FinallyBlock code -> - ilG.BeginFinallyBlockAndLog(); - emitter None code |> emitSusp - | FilterCatchBlock fcodes -> - let emitFilter (filter,code) = - match filter with - | TypeFilter typ -> - ilG.BeginCatchBlockAndLog (convType cenv emEnv typ); - emitter None code |> emitSusp - - | CodeFilter test -> - ilG.BeginExceptFilterBlockAndLog(); - emitter None test |> emitSusp - ilG.BeginCatchBlockAndLog null; - emitter None code |> emitSusp - fcodes |> List.iter emitFilter - let initialSusp = Some (uniqueEntryOfCode code) - emitter initialSusp code |> emitSusp - -//---------------------------------------------------------------------------- -// emitILMethodBody -//---------------------------------------------------------------------------- + // Build a table that contains the operations that define where exception handlers are + let pc2action = Dictionary() + let lab2pc = code.Labels + let add lab action = + let pc = lab2pc.[lab] + pc2action.[pc] <- (if pc2action.ContainsKey pc then pc2action.[pc] @ [ action ] else [ action ]) + + for e in code.Exceptions do + let (startTry,_endTry) = e.Range + + add startTry (fun () -> ilG.BeginExceptionBlockAndLog() |> ignore) + + match e.Clause with + | ILExceptionClause.Finally(startHandler,endHandler) -> + add startHandler ilG.BeginFinallyBlockAndLog + add endHandler ilG.EndExceptionBlockAndLog + | ILExceptionClause.Fault(startHandler,endHandler) -> + add startHandler ilG.BeginFaultBlockAndLog + add endHandler ilG.EndExceptionBlockAndLog + | ILExceptionClause.FilterCatch((startFilter,_),(startHandler,endHandler)) -> + add startFilter ilG.BeginExceptFilterBlockAndLog + add startHandler (fun () -> ilG.BeginCatchBlockAndLog null) + add endHandler ilG.EndExceptionBlockAndLog + | ILExceptionClause.TypeCatch(typ, (startHandler,endHandler)) -> + add startHandler (fun () -> ilG.BeginCatchBlockAndLog (convType cenv emEnv typ)) + add endHandler ilG.EndExceptionBlockAndLog + + // Emit the instructions + let instrs = code.Instrs + + for pc = 0 to instrs.Length do + if pc2action.ContainsKey pc then + for action in pc2action.[pc] do + action() + if pc2lab.ContainsKey pc then + for lab in pc2lab.[pc] do + ilG.MarkLabelAndLog lab + if pc < instrs.Length then + match instrs.[pc] with + | I_br l when code.Labels.[l] = pc + 1 -> () // compress I_br to next instruction + | i -> emitInstr cenv modB emEnv ilG i + let emitLocal cenv emEnv (ilG : ILGenerator) (local: ILLocal) = let ty = convType cenv emEnv local.Type @@ -1282,20 +1261,12 @@ let emitLocal cenv emEnv (ilG : ILGenerator) (local: ILLocal) = #endif locBuilder -let emitILMethodBody cenv modB emEnv (ilG:ILGenerator) ilmbody = - // XXX - REVIEW: - // NoInlining: bool; - // SourceMarker: source option } - // emit locals and record emEnv +let emitILMethodBody cenv modB emEnv (ilG:ILGenerator) (ilmbody: ILMethodBody) = let localBs = Array.map (emitLocal cenv emEnv ilG) (ILList.toArray ilmbody.Locals) let emEnv = envSetLocals emEnv localBs emitCode cenv modB emEnv ilG ilmbody.Code -//---------------------------------------------------------------------------- -// emitMethodBody -//---------------------------------------------------------------------------- - let emitMethodBody cenv modB emEnv ilG _name (mbody: ILLazyMethodBody) = match mbody.Contents with | MethodBody.IL ilmbody -> emitILMethodBody cenv modB emEnv (ilG()) ilmbody @@ -1303,11 +1274,6 @@ let emitMethodBody cenv modB emEnv ilG _name (mbody: ILLazyMethodBody) = | MethodBody.Abstract -> () (* printf "EMIT: abstract method %s\n" name *) (* XXX - check *) | MethodBody.Native -> failwith "emitMethodBody cenv: native" (* XXX - gap *) - -//---------------------------------------------------------------------------- -// emitCustomAttrs -//---------------------------------------------------------------------------- - let convCustomAttr cenv emEnv cattr = let methInfo = match convConstructorSpec cenv emEnv cattr.Method with @@ -1369,16 +1335,17 @@ let buildGenParamsPass1b cenv emEnv (genArgs : Type array) (gps : ILGenericParam // emitParameter //---------------------------------------------------------------------------- -let emitParameter cenv emEnv (defineParameter : int * ParameterAttributes * string -> ParameterBuilder) i param = +let emitParameter cenv emEnv (defineParameter : int * ParameterAttributes * string -> ParameterBuilder) i (param: ILParameter) = // -Type: typ; // -Default: ILFieldInit option; // -Marshal: NativeType option; (* Marshalling map for parameters. COM Interop only. *) let attrs = flagsIf param.IsIn ParameterAttributes.In ||| flagsIf param.IsOut ParameterAttributes.Out ||| flagsIf param.IsOptional ParameterAttributes.Optional - let name = match param.Name with - | Some name -> name - | None -> "X"^string(i+1) + let name = + match param.Name with + | Some name -> name + | None -> "X" + string(i+1) let parB = defineParameter(i,attrs,name) emitCustomAttrs cenv emEnv (wrapCustomAttr parB.SetCustomAttribute) param.CustomAttrs diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 44e3273b1af..ac8b23f5b14 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -1604,7 +1604,7 @@ type CodeBuffer = member codebuf.RecordAvailBrFixup tg = codebuf.availBrFixups.[tg] <- codebuf.code.Position -module Codebuf = begin +module Codebuf = // -------------------------------------------------------------------- // Applying branch fixups. Use short versions of instructions // wherever possible. Sadly we can only determine if we can use a short @@ -1785,8 +1785,7 @@ module Codebuf = begin // We then emit the exception handling specs separately. // nb. ECMA spec says the SEH blocks must be returned inside-out type SEHTree = - | Tip - | Node of (ExceptionClauseSpec option * SEHTree list) list + | Node of ExceptionClauseSpec option * SEHTree list // -------------------------------------------------------------------- @@ -1850,8 +1849,8 @@ module Codebuf = begin let emitTailness (cenv: cenv) codebuf tl = if tl = Tailcall && cenv.emitTailcalls then emitInstrCode codebuf i_tail - let emitAfterTailcall codebuf tl = - if tl = Tailcall then emitInstrCode codebuf i_ret + //let emitAfterTailcall codebuf tl = + // if tl = Tailcall then emitInstrCode codebuf i_ret let emitVolatility codebuf tl = if tl = Volatile then emitInstrCode codebuf i_volatile @@ -1871,24 +1870,24 @@ module Codebuf = begin match instr with | si when isNoArgInstr si -> emitInstrCode codebuf (encodingsOfNoArgInstr si) - | I_brcmp (cmp,tg1,_) -> + | I_brcmp (cmp,tg1) -> codebuf.RecordReqdBrFixup ((Lazy.force ILCmpInstrMap).[cmp], Some (Lazy.force ILCmpInstrRevMap).[cmp]) tg1 - | I_br _ -> () + | I_br tg -> codebuf.RecordReqdBrFixup (i_br,Some i_br_s) tg | I_seqpoint s -> codebuf.EmitSeqPoint cenv s | I_leave tg -> codebuf.RecordReqdBrFixup (i_leave,Some i_leave_s) tg | I_call (tl,mspec,varargs) -> emitTailness cenv codebuf tl emitMethodSpecInstr cenv codebuf env i_call (mspec,varargs) - emitAfterTailcall codebuf tl + //emitAfterTailcall codebuf tl | I_callvirt (tl,mspec,varargs) -> emitTailness cenv codebuf tl emitMethodSpecInstr cenv codebuf env i_callvirt (mspec,varargs) - emitAfterTailcall codebuf tl + //emitAfterTailcall codebuf tl | I_callconstraint (tl,ty,mspec,varargs) -> emitTailness cenv codebuf tl emitConstrained cenv codebuf env ty emitMethodSpecInstr cenv codebuf env i_callvirt (mspec,varargs) - emitAfterTailcall codebuf tl + //emitAfterTailcall codebuf tl | I_newobj (mspec,varargs) -> emitMethodSpecInstr cenv codebuf env i_newobj (mspec,varargs) | I_ldftn mspec -> @@ -1900,7 +1899,7 @@ module Codebuf = begin emitTailness cenv codebuf tl emitInstrCode codebuf i_calli codebuf.EmitUncodedToken (getUncodedToken TableNames.StandAloneSig (GetCallsigAsStandAloneSigIdx cenv env (callsig,varargs))) - emitAfterTailcall codebuf tl + //emitAfterTailcall codebuf tl | I_ldarg u16 -> emitShortUInt16Instr codebuf (i_ldarg_s,i_ldarg) u16 | I_starg u16 -> emitShortUInt16Instr codebuf (i_starg_s,i_starg) u16 @@ -1992,7 +1991,7 @@ module Codebuf = begin | DT_REF -> i_stind_ref | _ -> failwith "stelem") - | I_switch (labs,_) -> codebuf.RecordReqdBrFixups (i_switch,None) labs + | I_switch labs -> codebuf.RecordReqdBrFixups (i_switch,None) labs | I_ldfld (al,vol,fspec) -> emitAlignment codebuf al @@ -2093,165 +2092,143 @@ module Codebuf = begin | _ -> failwith "an IL instruction cannot be emitted" - let mkScopeNode cenv (localSigs: _[]) (a,b,ls,ch) = - if (isNil ls || not cenv.generatePdb) then ch + let mkScopeNode cenv (localSigs: _[]) (startOffset,endOffset,ls: ILLocalDebugMapping list,childScopes) = + if (isNil ls || not cenv.generatePdb) then childScopes else - [ { Children= Array.ofList ch - StartOffset=a - EndOffset=b + [ { Children= Array.ofList childScopes + StartOffset=startOffset + EndOffset=endOffset Locals= - Array.ofList - (List.map - (fun x -> { Name=x.LocalName - Signature= (try localSigs.[x.LocalIndex] with _ -> failwith ("local variable index "+string x.LocalIndex+"in debug info does not reference a valid local")) - Index= x.LocalIndex } ) - (List.filter (fun v -> v.LocalName <> "") ls)) } ] + ls |> List.filter (fun v -> v.LocalName <> "") + |> List.map (fun x -> + { Name=x.LocalName + Signature= (try localSigs.[x.LocalIndex] with _ -> failwith ("local variable index "+string x.LocalIndex+"in debug info does not reference a valid local")) + Index= x.LocalIndex } ) + |> Array.ofList } ] - let rec emitCode cenv localSigs codebuf env (susp,code) = - match code with - | TryBlock (c,seh) -> - commitSusp codebuf susp (uniqueEntryOfCode c) - let tryStart = codebuf.code.Position - let susp,child1,scope1 = emitCode cenv localSigs codebuf env (None,c) - commitSuspNoDest codebuf susp - let tryFinish = codebuf.code.Position - let exnBranches = - match seh with - | FaultBlock flt -> - let handlerStart = codebuf.code.Position - let susp,child2,scope2 = emitCode cenv localSigs codebuf env (None,flt) - commitSuspNoDest codebuf susp - let handlerFinish = codebuf.code.Position - [ Some (tryStart,(tryFinish - tryStart), - handlerStart,(handlerFinish - handlerStart), - FaultClause), - [(child2,scope2)] ] - - | FinallyBlock flt -> - let handlerStart = codebuf.code.Position - let susp,child2,scope2 = emitCode cenv localSigs codebuf env (None,flt) - commitSuspNoDest codebuf susp - let handlerFinish = codebuf.code.Position - [ Some (tryStart,(tryFinish - tryStart), - handlerStart,(handlerFinish - handlerStart), - FinallyClause), - [(child2,scope2)] ] - - | FilterCatchBlock clauses -> - clauses |> List.map (fun (flt,ctch) -> - match flt with - | TypeFilter typ -> - let handlerStart = codebuf.code.Position - let susp,child2,scope2 = emitCode cenv localSigs codebuf env (None,ctch) - commitSuspNoDest codebuf susp - let handlerFinish = codebuf.code.Position - Some (tryStart,(tryFinish - tryStart), - handlerStart,(handlerFinish - handlerStart), - TypeFilterClause (getTypeDefOrRefAsUncodedToken (GetTypeAsTypeDefOrRef cenv env typ))), - [(child2,scope2)] - | CodeFilter fltcode -> - - let filterStart = codebuf.code.Position - let susp,child2,scope2 = emitCode cenv localSigs codebuf env (None,fltcode) - commitSuspNoDest codebuf susp - let handlerStart = codebuf.code.Position - let susp,child3,scope3 = emitCode cenv localSigs codebuf env (None,ctch) - commitSuspNoDest codebuf susp - let handlerFinish = codebuf.code.Position - - Some (tryStart, - (tryFinish - tryStart), - handlerStart, - (handlerFinish - handlerStart), - FilterClause filterStart), - [(child2,scope2); (child3,scope3)]) - - (None, - Node((None,[child1])::List.map (fun (a,b) -> (a,List.map fst b)) exnBranches), - scope1 @ List.concat ((List.collect (fun (_,b) -> List.map snd b) exnBranches))) - - | RestrictBlock _ | GroupBlock _ -> - // NOTE: ensure tailcalls for critical linear loop using standard continuation technique - let rec emitCodeLinear (susp,b) cont = - match b with - | RestrictBlock (_,code2) -> - emitCodeLinear (susp,code2) cont - | GroupBlock (locs,codes) -> - let start = codebuf.code.Position - - // Imperative collectors for the sub-blocks - let newSusp = ref susp - let childSEH = ref [] - let childScopes = ref [] - // Push the results of collecting one sub-block into the reference cells - let collect (susp,seh,scopes) = - newSusp := susp - childSEH := seh :: !childSEH - childScopes := scopes :: !childScopes - // Close the collection by generating the (susp,node,scope-node) triple - let close () = - let fin = codebuf.code.Position - (!newSusp, - Node([(None,(List.rev !childSEH))]), - mkScopeNode cenv localSigs (start,fin,locs,List.concat (List.rev !childScopes))) - - match codes with - | [c] -> - // emitCodeLinear sequence of nested blocks - emitCodeLinear (!newSusp,c) (fun results -> - collect results - cont (close())) - - | codes -> - // Multiple blocks: leave the linear sequence and process each seperately - codes |> List.iter (fun c -> collect (emitCode cenv localSigs codebuf env (!newSusp,c))) - cont(close()) - | c -> - // leave the linear sequence - cont (emitCode cenv localSigs codebuf env (susp,c)) - - // OK, process the linear sequence - emitCodeLinear (susp,code) (fun x -> x) - - | ILBasicBlock bb -> - // Leaf case: one basic block - commitSusp codebuf susp bb.Label - codebuf.RecordAvailBrFixup bb.Label - let instrs = bb.Instructions - for i = 0 to instrs.Length - 1 do - emitInstr cenv codebuf env instrs.[i] - bb.Fallthrough, Tip, [] - - and brToSusp (codebuf: CodeBuffer) dest = codebuf.RecordReqdBrFixup (i_br,Some i_br_s) dest - - and commitSusp codebuf susp lab = - match susp with - | Some dest when dest <> lab -> brToSusp codebuf dest - | _ -> () - - and commitSuspNoDest codebuf susp = - match susp with - | Some dest -> brToSusp codebuf dest - | _ -> () - - // Flatten the SEH tree - let rec emitExceptionHandlerTree codebuf sehTree = - match sehTree with - | Tip -> () - | Node clauses -> List.iter (emitExceptionHandlerTree2 codebuf) clauses - and emitExceptionHandlerTree2 (codebuf: CodeBuffer) (x,childSEH) = + // Used to put local debug scopes and exception handlers into a tree form + let rangeInsideRange (start_pc1,end_pc1) (start_pc2,end_pc2) = + (start_pc1:int) >= start_pc2 && start_pc1 < end_pc2 && + (end_pc1:int) > start_pc2 && end_pc1 <= end_pc2 + + let lranges_of_clause cl = + match cl with + | ILExceptionClause.Finally r1 -> [r1] + | ILExceptionClause.Fault r1 -> [r1] + | ILExceptionClause.FilterCatch (r1,r2) -> [r1;r2] + | ILExceptionClause.TypeCatch (_ty,r1) -> [r1] + + + let labelsToRange (lab2pc : Dictionary) p = let (l1,l2) = p in lab2pc.[l1], lab2pc.[l2] + + let lrange_inside_lrange lab2pc ls1 ls2 = + rangeInsideRange (labelsToRange lab2pc ls1) (labelsToRange lab2pc ls2) + + let findRoots contains vs = + // For each item, either make it a root or make it a child of an existing root + let addToRoot roots x = + // Look to see if 'x' is inside one of the roots + let roots, found = + (false, roots) ||> List.mapFold (fun found (r,children) -> + if found then ((r,children),true) + elif contains x r then ((r,x::children),true) + else ((r,children),false)) + + if found then roots + else + // Find the ones that 'x' encompasses and collapse them + let yes, others = roots |> List.partition (fun (r,_) -> contains r x) + (x, yes |> List.collect (fun (r,ch) -> r :: ch)) :: others + + ([], vs) ||> List.fold addToRoot + + let rec makeSEHTree cenv env (pc2pos: int[]) (lab2pc : Dictionary) (exs : ILExceptionSpec list) = + + let clause_inside_lrange cl lr = + List.forall (fun lr1 -> lrange_inside_lrange lab2pc lr1 lr) (lranges_of_clause cl) + + let tryspec_inside_lrange (tryspec1: ILExceptionSpec) lr = + (lrange_inside_lrange lab2pc tryspec1.Range lr && clause_inside_lrange tryspec1.Clause lr) + + let tryspec_inside_clause tryspec1 cl = + List.exists (fun lr -> tryspec_inside_lrange tryspec1 lr) (lranges_of_clause cl) + + let tryspec_inside_tryspec tryspec1 (tryspec2: ILExceptionSpec) = + tryspec_inside_lrange tryspec1 tryspec2.Range || + tryspec_inside_clause tryspec1 tryspec2.Clause + + let roots = findRoots tryspec_inside_tryspec exs + let trees = + roots |> List.map (fun (cl,ch) -> + let r1 = labelsToRange lab2pc cl.Range + let conv ((s1,e1),(s2,e2)) x = pc2pos.[s1], pc2pos.[e1] - pc2pos.[s1], pc2pos.[s2], pc2pos.[e2] - pc2pos.[s2], x + let children = makeSEHTree cenv env pc2pos lab2pc ch + let n = + match cl.Clause with + | ILExceptionClause.Finally r2 -> + conv (r1,labelsToRange lab2pc r2) ExceptionClauseKind.FinallyClause + | ILExceptionClause.Fault r2 -> + conv (r1,labelsToRange lab2pc r2) ExceptionClauseKind.FaultClause + | ILExceptionClause.FilterCatch ((filterStart,_),r3) -> + conv (r1,labelsToRange lab2pc r3) (ExceptionClauseKind.FilterClause (pc2pos.[lab2pc.[filterStart]])) + | ILExceptionClause.TypeCatch (typ,r2) -> + conv (r1,labelsToRange lab2pc r2) (TypeFilterClause (getTypeDefOrRefAsUncodedToken (GetTypeAsTypeDefOrRef cenv env typ))) + SEHTree.Node (Some n, children) ) + + trees + + let rec makeLocalsTree cenv localSigs (pc2pos: int[]) (lab2pc : Dictionary) (exs : ILLocalDebugInfo list) = + let locspec_inside_locspec (locspec1: ILLocalDebugInfo) (locspec2: ILLocalDebugInfo) = + lrange_inside_lrange lab2pc locspec1.Range locspec2.Range + + let roots = findRoots locspec_inside_locspec exs + + let trees = + roots |> List.collect (fun (cl,ch) -> + let (s1,e1) = labelsToRange lab2pc cl.Range + let (s1,e1) = pc2pos.[s1], pc2pos.[e1] + let children = makeLocalsTree cenv localSigs pc2pos lab2pc ch + mkScopeNode cenv localSigs (s1,e1,cl.DebugMappings,children)) + trees + + + // Emit the SEH tree + let rec emitExceptionHandlerTree (codebuf: CodeBuffer) (Node (x,childSEH)) = List.iter (emitExceptionHandlerTree codebuf) childSEH // internal first - match x with - | None -> () - | Some clause -> codebuf.EmitExceptionClause clause + x |> Option.iter codebuf.EmitExceptionClause + + let emitCode cenv localSigs (codebuf: CodeBuffer) env (code: ILCode) = + let instrs = code.Instrs + + // Build a table mapping Abstract IL pcs to positions in the generated code buffer + let pc2pos = Array.zeroCreate (instrs.Length+1) + let pc2labs = Dictionary() + for (KeyValue(lab,pc)) in code.Labels do + if pc2labs.ContainsKey pc then pc2labs.[pc] <- lab :: pc2labs.[pc] else pc2labs.[pc] <- [lab] + + // Emit the instructions + for pc = 0 to instrs.Length do + if pc2labs.ContainsKey pc then + for lab in pc2labs.[pc] do + codebuf.RecordAvailBrFixup lab + pc2pos.[pc] <- codebuf.code.Position + if pc < instrs.Length then + match instrs.[pc] with + | I_br l when code.Labels.[l] = pc + 1 -> () // compress I_br to next instruction + | i -> emitInstr cenv codebuf env i + + // Build the exceptions and locals information, ready to emit + let SEHTree = makeSEHTree cenv env pc2pos code.Labels code.Exceptions + List.iter (emitExceptionHandlerTree codebuf) SEHTree + + // Build the locals information, ready to emit + let localsTree = makeLocalsTree cenv localSigs pc2pos code.Labels code.Locals + localsTree let EmitTopCode cenv localSigs env nm code = let codebuf = CodeBuffer.Create nm - let finalSusp, SEHTree, origScopes = - emitCode cenv localSigs codebuf env (Some (uniqueEntryOfCode code),code) - (match finalSusp with Some dest -> brToSusp codebuf dest | _ -> ()) - emitExceptionHandlerTree codebuf SEHTree + let origScopes = emitCode cenv localSigs codebuf env code let origCode = codebuf.code.Close() let origExnClauses = List.rev codebuf.seh let origReqdStringFixups = codebuf.reqdStringFixupsInMethod @@ -2270,8 +2247,6 @@ module Codebuf = begin (newReqdStringFixups,newExnClauses, newCode, newSeqPoints, rootScope) -end - // -------------------------------------------------------------------- // ILMethodBody --> bytes // -------------------------------------------------------------------- @@ -2491,7 +2466,7 @@ and GenGenericParamPass4 cenv env idx owner gp = // param and return --> Param Row // -------------------------------------------------------------------- -let rec GetParamAsParamRow cenv _env seq param = +let rec GetParamAsParamRow cenv _env seq (param: ILParameter) = let flags = (if param.IsIn then 0x0001 else 0x0000) ||| (if param.IsOut then 0x0002 else 0x0000) ||| @@ -2504,7 +2479,7 @@ let rec GetParamAsParamRow cenv _env seq param = UShort (uint16 seq) StringE (GetStringHeapIdxOption cenv param.Name) |] -and GenParamPass3 cenv env seq param = +and GenParamPass3 cenv env seq (param: ILParameter) = if param.IsIn=false && param.IsOut=false && param.IsOptional=false && isNone param.Default && isNone param.Name && isNone param.Marshal then () else diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 2007bf457eb..e7f357eb825 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -79,12 +79,8 @@ let ChooseParamNames fieldNamesAndTypes = let markup s = s |> Seq.mapi (fun i x -> i,x) // Approximation for purposes of optimization and giving a warning when compiling definition-only files as EXEs -let rec CheckCodeDoesSomething code = - match code with - | ILBasicBlock bb -> Array.fold (fun x i -> x || match i with (AI_ldnull | AI_nop | AI_pop) | I_ret | I_seqpoint _ -> false | _ -> true) false bb.Instructions - | GroupBlock (_,codes) -> List.exists CheckCodeDoesSomething codes - | RestrictBlock (_,code) -> CheckCodeDoesSomething code - | TryBlock _ -> true +let rec CheckCodeDoesSomething (code: ILCode) = + code.Instrs |> Array.exists (function AI_ldnull | AI_nop | AI_pop | I_ret | I_seqpoint _ -> false | _ -> true) let ChooseFreeVarNames takenNames ts = let tns = List.map (fun t -> (t,None)) ts @@ -1292,10 +1288,10 @@ type CodeGenBuffer(m:range, let codeLabelToPC : Dictionary = new Dictionary<_,_>(10) let codeLabelToCodeLabel : Dictionary = new Dictionary<_,_>(10) - let rec computeCodeLabelToPC n lbl = + let rec lab2pc n lbl = if n = System.Int32.MaxValue then error(InternalError("recursive label graph",m)) if codeLabelToCodeLabel.ContainsKey lbl then - computeCodeLabelToPC (n+1) codeLabelToCodeLabel.[lbl] + lab2pc (n+1) codeLabelToCodeLabel.[lbl] else codeLabelToPC.[lbl] @@ -1460,7 +1456,8 @@ type CodeGenBuffer(m:range, instrs ResizeArray.toList locals , maxStack, - (computeCodeLabelToPC 0), + (Dictionary.ofList [ for kvp in codeLabelToPC -> (kvp.Key, lab2pc 0 kvp.Key) + for kvp in codeLabelToCodeLabel -> (kvp.Key, lab2pc 0 kvp.Key) ] ), instrs, ResizeArray.toList exnSpecs, isSome seqpoint @@ -1557,15 +1554,15 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee liveLocals=IntMap.empty(); innerVals = innerVals}; - let locals,maxStack,computeCodeLabelToPC,code,exnSpecs,hasSequencePoints = cgbuf.Close() + let locals,maxStack,lab2pc,code,exnSpecs,hasSequencePoints = cgbuf.Close() - let localDebugSpecs = + let localDebugSpecs : ILLocalDebugInfo list = locals |> List.mapi (fun i (nms,_) -> List.map (fun nm -> (i,nm)) nms) |> List.concat |> List.map (fun (i,(nm,(start,finish))) -> - { locRange=(start.CodeLabel, finish.CodeLabel); - locInfos= [{ LocalIndex=i; LocalName=nm }] }) + { Range=(start.CodeLabel, finish.CodeLabel); + DebugMappings= [{ LocalIndex=i; LocalName=nm }] }) let ilLocals = locals @@ -1583,27 +1580,19 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee (ilLocals, maxStack, - computeCodeLabelToPC, + lab2pc, code, exnSpecs, localDebugSpecs, hasSequencePoints) let CodeGenMethod cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,codeGenFunction,m) = - (* Codegen the method. REVIEW: change this to generate the AbsIL code tree directly... *) - let locals,maxStack,computeCodeLabelToPC,instrs,exns,localDebugSpecs,hasSequencePoints = + let locals,maxStack,lab2pc,instrs,exns,localDebugSpecs,hasSequencePoints = CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,eenv,alreadyUsedArgs,alreadyUsedLocals,codeGenFunction,m) - let dump() = - instrs |> Array.iteri (fun i instr -> dprintf "%s: %d: %A\n" methodName i instr); - - let lab2pc lbl = try computeCodeLabelToPC lbl with _ -> errorR(Error(FSComp.SR.ilLabelNotFound(formatCodeLabel lbl),m)); dump(); 676767 - let code = IL.buildILCode methodName lab2pc instrs exns localDebugSpecs - let code = IL.checkILCode code - // Attach a source range to the method. Only do this is it has some sequence points, because .NET 2.0/3.5 // ILDASM has issues if you emit symbols with a source range but without any sequence points let sourceRange = if hasSequencePoints then GenPossibleILSourceMarker cenv m else None @@ -2756,8 +2745,8 @@ and GenTryCatch cenv cgbuf eenv (e1,vf:Val,ef,vh:Val,eh,m,resty,spTry,spWith) se ILExceptionClause.TypeCatch(cenv.g.ilg.typ_Object, handlerMarks) cgbuf.EmitExceptionClause - { exnClauses = [ seh ]; - exnRange= tryMarks } ; + { Clause = seh; + Range= tryMarks } ; CG.SetMarkToHere cgbuf afterHandler; CG.SetStack cgbuf []; @@ -2792,16 +2781,16 @@ and GenTryFinally cenv cgbuf eenv (bodyExpr,handlerExpr,m,resty,spTry,spFinally) let endOfHandler = CG.GenerateMark cgbuf "endOfHandler" let handlerMarks = (startOfHandler.CodeLabel, endOfHandler.CodeLabel) cgbuf.EmitExceptionClause - { exnClauses = [ ILExceptionClause.Finally(handlerMarks) ]; - exnRange = tryMarks } ; + { Clause = ILExceptionClause.Finally(handlerMarks) + Range = tryMarks } - CG.SetMarkToHere cgbuf afterHandler; - CG.SetStack cgbuf []; + CG.SetMarkToHere cgbuf afterHandler + CG.SetStack cgbuf [] // Restore the stack and load the result - cgbuf.EmitStartOfHiddenCode(); - EmitRestoreStack cgbuf stack; - EmitGetLocal cgbuf ilResultTy whereToSave; + cgbuf.EmitStartOfHiddenCode() + EmitRestoreStack cgbuf stack + EmitGetLocal cgbuf ilResultTy whereToSave GenSequel cenv eenv.cloc cgbuf sequel ) @@ -2845,7 +2834,7 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = EmitSetLocal cgbuf finishIdx EmitGetLocal cgbuf cenv.g.ilg.typ_int32 finishIdx GenGetLocalVal cenv cgbuf eenvinner e2.Range v None; - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp ((if isUp then BI_blt else BI_bgt),finish.CodeLabel,inner.CodeLabel)); + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp ((if isUp then BI_blt else BI_bgt),finish.CodeLabel)); else CG.EmitInstr cgbuf (pop 0) Push0 (I_br test.CodeLabel); @@ -2870,7 +2859,7 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = CG.EmitSeqPoint cgbuf e2.Range; GenGetLocalVal cenv cgbuf eenvinner e2.Range v None; let cmp = match dir with FSharpForLoopUp | FSharpForLoopDown -> BI_bne_un | CSharpForLoopUp -> BI_blt - let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp,inner.CodeLabel,finish.CodeLabel) ])); + let e2Sequel = (CmpThenBrOrContinue (pop 2, [ I_brcmp(cmp,inner.CodeLabel) ])); if isFSharpStyle then EmitGetLocal cgbuf cenv.g.ilg.typ_int32 finishIdx @@ -2893,7 +2882,6 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = and GenWhileLoop cenv cgbuf eenv (spWhile,e1,e2,m) sequel = let finish = CG.GenerateDelayMark cgbuf "while_finish" - let inner = CG.GenerateDelayMark cgbuf "while_inner" let startTest = CG.GenerateMark cgbuf "startTest" match spWhile with @@ -2901,8 +2889,7 @@ and GenWhileLoop cenv cgbuf eenv (spWhile,e1,e2,m) sequel = | NoSequencePointAtWhileLoop -> () // SEQUENCE POINTS: Emit a sequence point to cover all of 'while e do' - GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, [ I_brcmp(BI_brfalse,finish.CodeLabel,inner.CodeLabel) ])); - CG.SetMarkToHere cgbuf inner; + GenExpr cenv cgbuf eenv SPSuppress e1 (CmpThenBrOrContinue (pop 1, [ I_brcmp(BI_brfalse,finish.CodeLabel) ])); GenExpr cenv cgbuf eenv SPAlways e2 (DiscardThen (Br startTest)); CG.SetMarkToHere cgbuf finish; @@ -2997,11 +2984,11 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = // For these we can just generate the argument and change the test (from a brfalse to a brtrue and vice versa) | ([ AI_ceq ], [arg1; Expr.Const((Const.Bool false | Const.SByte 0y| Const.Int16 0s | Const.Int32 0 | Const.Int64 0L | Const.Byte 0uy| Const.UInt16 0us | Const.UInt32 0u | Const.UInt64 0UL),_,_) ], - CmpThenBrOrContinue(1, [I_brcmp (((BI_brfalse | BI_brtrue) as bi) , label1,label2) ]), + CmpThenBrOrContinue(1, [I_brcmp (((BI_brfalse | BI_brtrue) as bi),label1) ]), _) -> let bi = match bi with BI_brtrue -> BI_brfalse | _ -> BI_brtrue - GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1, [ I_brcmp (bi, label1,label2) ])) + GenExpr cenv cgbuf eenv SPSuppress arg1 (CmpThenBrOrContinue(pop 1, [ I_brcmp (bi,label1) ])) // Query; when do we get a 'ret' in IL assembly code? | [ I_ret ], [arg1],sequel,[_ilRetTy] -> @@ -3031,8 +3018,7 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = let after1 = CG.GenerateDelayMark cgbuf ("fake_join") let after2 = CG.GenerateDelayMark cgbuf ("fake_join") let after3 = CG.GenerateDelayMark cgbuf ("fake_join") - CG.EmitInstrs cgbuf (pop 0) Push0 [mkLdcInt32 0; - I_brcmp (BI_brfalse,after2.CodeLabel,after1.CodeLabel); ]; + CG.EmitInstrs cgbuf (pop 0) Push0 [mkLdcInt32 0; I_brcmp (BI_brfalse,after2.CodeLabel); ]; CG.SetMarkToHere cgbuf after1; CG.EmitInstrs cgbuf (pop 0) (Push [ilRetTy]) [AI_ldnull; I_unbox_any ilRetTy; I_br after3.CodeLabel ]; @@ -3053,29 +3039,29 @@ and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = // NOTE: THESE ARE NOT VALID ON FLOATING POINT DUE TO NaN. Hence INLINE ASM ON FP. MUST BE CAREFULLY WRITTEN - | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge,label1,label2)); - | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble,label1, label2)); - | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge_un,label1,label2)); - | [ AI_cgt_un ], CmpThenBrOrContinue(1, [I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble_un,label1, label2)); - | [ AI_ceq ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1,label2) ]) when not (anyfpType (tyOfExpr g args.Head)) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bne_un,label1, label2)); + | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge,label1)); + | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble,label1)); + | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bge_un,label1)); + | [ AI_cgt_un ], CmpThenBrOrContinue(1, [I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_ble_un,label1)); + | [ AI_ceq ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brfalse, label1) ]) when not (anyfpType (tyOfExpr g args.Head)) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bne_un,label1)); // THESE ARE VALID ON FP w.r.t. NaN - | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt,label1, label2)); - | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt,label1, label2)); - | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt_un,label1, label2)); - | [ AI_cgt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1,label2) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt_un,label1, label2)); - | [ AI_ceq ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1,label2) ]) -> - CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_beq,label1, label2)); + | [ AI_clt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt,label1)); + | [ AI_cgt ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt,label1)); + | [ AI_clt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_blt_un,label1)); + | [ AI_cgt_un ], CmpThenBrOrContinue(1,[ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_bgt_un,label1)); + | [ AI_ceq ], CmpThenBrOrContinue(1, [ I_brcmp (BI_brtrue, label1) ]) -> + CG.EmitInstr cgbuf (pop 2) Push0 (I_brcmp(BI_beq,label1)); | _ -> // Failing that, generate the real IL leaving value(s) on the stack CG.EmitInstrs cgbuf (pop args.Length) (Push ilReturnTys) ilAfterInst; @@ -3315,7 +3301,7 @@ and GenGenericParam cenv eenv (tp:Typar) = // Generate object expressions as ILX "closures" //-------------------------------------------------------------------------- -and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs)) = +and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs)) : ILParameter = let inFlag2,outFlag2,optionalFlag2,paramMarshal2,attribs = GenParamAttribs cenv attribs { Name=nm; @@ -4136,7 +4122,7 @@ and GenMatch cenv cgbuf eenv (spBind,_exprm,tree,targets,m,ty) sequel = // Accumulate the decision graph as we go and GenDecisionTreeAndTargets cenv cgbuf stackAtTargets eenv tree targets repeatSP sequel = - let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf (CG.GenerateDelayMark cgbuf "start_dtree") stackAtTargets eenv tree targets repeatSP (IntMap.empty()) sequel + let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv tree targets repeatSP (IntMap.empty()) sequel GenPostponedDecisionTreeTargets cenv cgbuf stackAtTargets targetInfos sequel and TryFindTargetInfo targetInfos n = @@ -4144,11 +4130,15 @@ and TryFindTargetInfo targetInfos n = | Some (targetInfo,_) -> Some targetInfo | None -> None -and GenDecisionTreeAndTargetsInner cenv cgbuf inplab stackAtTargets eenv tree targets repeatSP targetInfos sequel = +/// When inplabOpt is None, we are assuming a branch or fallthrough to the current code location +/// +/// When inplabOpt is "Some inplab", we are assuming an existing branch to "inplab" and can optionally +/// set inplab to point to another location if no codegen is required. +and GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv tree targets repeatSP targetInfos sequel = CG.SetStack cgbuf stackAtTargets; // Set the expected initial stack. match tree with | TDBind(bind,rest) -> - CG.SetMarkToHere cgbuf inplab; + match inplabOpt with Some inplab -> CG.SetMarkToHere cgbuf inplab | None -> () let startScope,endScope as scopeMarks = StartDelayedLocalScope "dtreeBind" cgbuf let eenv = AllocStorageForBind cenv cgbuf scopeMarks eenv bind let sp = GenSequencePointForBind cenv cgbuf eenv bind @@ -4158,32 +4148,32 @@ and GenDecisionTreeAndTargetsInner cenv cgbuf inplab stackAtTargets eenv tree ta // we effectively lose an EndLocalScope for all dtrees that go to the same target // So we just pretend that the variable goes out of scope here. CG.SetMarkToHere cgbuf endScope; - let bodyLabel = CG.GenerateDelayMark cgbuf "decisionTreeBindBody" - CG.EmitInstr cgbuf (pop 0) Push0 (I_br bodyLabel.CodeLabel); - GenDecisionTreeAndTargetsInner cenv cgbuf bodyLabel stackAtTargets eenv rest targets repeatSP targetInfos sequel + GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv rest targets repeatSP targetInfos sequel | TDSuccess (es,targetIdx) -> - GenDecisionTreeSuccess cenv cgbuf inplab stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel + GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel | TDSwitch(e, cases, dflt,m) -> - GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel + GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases dflt m targets repeatSP targetInfos sequel and GetTarget (targets:_[]) n = if n >= targets.Length then failwith "GetTarget: target not found in decision tree"; targets.[n] -and GenDecisionTreeSuccess cenv cgbuf inplab stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel = +and GenDecisionTreeSuccess cenv cgbuf inplabOpt stackAtTargets eenv es targetIdx targets repeatSP targetInfos sequel = let (TTarget(vs,successExpr,spTarget)) = GetTarget targets targetIdx match TryFindTargetInfo targetInfos targetIdx with - | Some (_,targetMarkAfterBinds,eenvAtTarget,_,_,_,_,_,_,_) -> + | Some (_,targetMarkAfterBinds:Mark,eenvAtTarget,_,_,_,_,_,_,_) -> // If not binding anything we can go directly to the targetMarkAfterBinds point // This is useful to avoid lots of branches e.g. in match A | B | C -> e // In this case each case will just go straight to "e" if FlatList.isEmpty vs then - CG.SetMark cgbuf inplab targetMarkAfterBinds; + match inplabOpt with + | None -> CG.EmitInstr cgbuf (pop 0) Push0 (I_br targetMarkAfterBinds.CodeLabel); + | Some inplab -> CG.SetMark cgbuf inplab targetMarkAfterBinds; else - CG.SetMarkToHere cgbuf inplab; + match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab; repeatSP(); // It would be better not to emit any expressions here, and instead push these assignments into the postponed target // However not all targets are currently postponed (we only postpone in debug code), pending further testing of the performance @@ -4196,7 +4186,7 @@ and GenDecisionTreeSuccess cenv cgbuf inplab stackAtTargets eenv es targetIdx ta | None -> - CG.SetMarkToHere cgbuf inplab; + match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab; let targetMarkBeforeBinds = CG.GenerateDelayMark cgbuf "targetBeforeBinds" let targetMarkAfterBinds = CG.GenerateDelayMark cgbuf "targetAfterBinds" let startScope,endScope as scopeMarks = StartDelayedLocalScope "targetBinds" cgbuf @@ -4246,9 +4236,9 @@ and GenDecisionTreeTarget cenv cgbuf stackAtTargets _targetIdx (targetMarkBefore GenExpr cenv cgbuf eenvAtTarget spExpr successExpr (EndLocalScope(sequel,endScope)); -and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel = +and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defaultTargetOpt switchm targets repeatSP targetInfos sequel = let m = e.Range - CG.SetMarkToHere cgbuf inplab; + match inplabOpt with None -> () | Some inplab -> CG.SetMarkToHere cgbuf inplab; repeatSP(); match cases with @@ -4271,10 +4261,6 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT | _ -> let caseLabels = List.map (fun _ -> CG.GenerateDelayMark cgbuf "switch_case") cases - let defaultLabel = - match defaultTargetOpt with - | None -> List.head caseLabels - | Some _ -> CG.GenerateDelayMark cgbuf "switch_dflt" let firstDiscrim = cases.Head.Discriminator match firstDiscrim with // Iterated tests, e.g. exception constructors, nulltests, typetests and active patterns. @@ -4301,8 +4287,8 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT GenExpr cenv cgbuf eenv SPSuppress e Continue; BI_brtrue | _ -> failwith "internal error: GenDecisionTreeSwitch" - CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (bi,(List.head caseLabels).CodeLabel,defaultLabel.CodeLabel)); - GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos caseLabels cases defaultTargetOpt defaultLabel sequel + CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (bi,(List.head caseLabels).CodeLabel)); + GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel | Test.ActivePatternCase _ -> error(InternalError("internal error in codegen: Test.ActivePatternCase",switchm)) | Test.UnionCase (hdc,tyargs) -> @@ -4316,9 +4302,9 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT | _ -> failwith "error: mixed constructor/const test?") let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib hdc.TyconRef - EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers,cuspec,dests,defaultLabel.CodeLabel); + EraseUnions.emitDataSwitch cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers,cuspec,dests); CG.EmitInstrs cgbuf (pop 1) Push0 [ ] // push/pop to match the line above - GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos caseLabels cases defaultTargetOpt defaultLabel sequel + GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel | Test.Const c -> GenExpr cenv cgbuf eenv SPSuppress e Continue; @@ -4358,23 +4344,23 @@ and GenDecisionTreeSwitch cenv cgbuf inplab stackAtTargets eenv e cases defaultT if mn <> 0 then CG.EmitInstrs cgbuf (pop 0) (Push [cenv.g.ilg.typ_int32]) [ mkLdcInt32 mn]; CG.EmitInstrs cgbuf (pop 1) Push0 [ AI_sub ]; - CG.EmitInstr cgbuf (pop 1) Push0 (I_switch (destinationLabels, defaultLabel.CodeLabel)); + CG.EmitInstr cgbuf (pop 1) Push0 (I_switch destinationLabels); else error(InternalError("non-dense integer matches not implemented in codegen - these should have been removed by the pattern match compiler",switchm)); - GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos caseLabels cases defaultTargetOpt defaultLabel sequel + GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel | _ -> error(InternalError("these matches should never be needed",switchm)) -and GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos caseLabels cases defaultTargetOpt defaultLabel sequel = +and GenDecisionTreeCases cenv cgbuf stackAtTargets eenv targets repeatSP targetInfos defaultTargetOpt caseLabels cases sequel = assert(cgbuf.GetCurrentStack() = stackAtTargets); // cgbuf stack should be unchanged over tests. [bug://1750]. let targetInfos = match defaultTargetOpt with - | Some defaultTarget -> GenDecisionTreeAndTargetsInner cenv cgbuf defaultLabel stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel + | Some defaultTarget -> GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv defaultTarget targets repeatSP targetInfos sequel | None -> targetInfos let targetInfos = (targetInfos, caseLabels, cases) |||> List.fold2 (fun targetInfos caseLabel (TCase(_,caseTree)) -> - GenDecisionTreeAndTargetsInner cenv cgbuf caseLabel stackAtTargets eenv caseTree targets repeatSP targetInfos sequel) + GenDecisionTreeAndTargetsInner cenv cgbuf (Some caseLabel) stackAtTargets eenv caseTree targets repeatSP targetInfos sequel) targetInfos // Used for the peephole optimization below @@ -4412,27 +4398,26 @@ and GenDecisionTreeTest cenv cloc cgbuf stackAtTargets e tester eenv successTree | _ -> failwith "internal error: GenDecisionTreeTest during bool elim" | _ -> - let success = CG.GenerateDelayMark cgbuf "testSuccess" let failure = CG.GenerateDelayMark cgbuf "testFailure" - (match tester with + match tester with | None -> - (* generate the expression, then test it for "false" *) - GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, [ I_brcmp (BI_brfalse, failure.CodeLabel, success.CodeLabel) ])); + // generate the expression, then test it for "false" + GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, [ I_brcmp (BI_brfalse, failure.CodeLabel) ])); - (* Turn 'isdata' tests that branch into EI_brisdata tests *) + // Turn 'isdata' tests that branch into EI_brisdata tests | Some (_,_,Choice1Of2 (avoidHelpers,cuspec,idx)) -> - GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, EraseUnions.mkBrIsData cenv.g.ilg (avoidHelpers,cuspec, idx, success.CodeLabel, failure.CodeLabel))); + GenExpr cenv cgbuf eenv SPSuppress e (CmpThenBrOrContinue(pop 1, EraseUnions.mkBrIsNotData cenv.g.ilg (avoidHelpers,cuspec, idx, failure.CodeLabel))); | Some (pops,pushes,i) -> - GenExpr cenv cgbuf eenv SPSuppress e Continue; + GenExpr cenv cgbuf eenv SPSuppress e Continue match i with | Choice1Of2 (avoidHelpers,cuspec,idx) -> CG.EmitInstrs cgbuf pops pushes (EraseUnions.mkIsData cenv.g.ilg (avoidHelpers, cuspec, idx)) - | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i; - CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel, success.CodeLabel))); + | Choice2Of2 i -> CG.EmitInstr cgbuf pops pushes i + CG.EmitInstr cgbuf (pop 1) Push0 (I_brcmp (BI_brfalse, failure.CodeLabel)) - let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf success stackAtTargets eenv successTree targets repeatSP targetInfos sequel + let targetInfos = GenDecisionTreeAndTargetsInner cenv cgbuf None stackAtTargets eenv successTree targets repeatSP targetInfos sequel - GenDecisionTreeAndTargetsInner cenv cgbuf failure stackAtTargets eenv failureTree targets repeatSP targetInfos sequel + GenDecisionTreeAndTargetsInner cenv cgbuf (Some failure) stackAtTargets eenv failureTree targets repeatSP targetInfos sequel //------------------------------------------------------------------------- // Generate letrec bindings @@ -4881,7 +4866,7 @@ and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) (implVal | None -> None, takenNames - let param = + let param : ILParameter = { Name=nmOpt; Type= ilArgTy; Default=None; (* REVIEW: support "default" attributes *) diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index da17d60c132..344fc582482 100755 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -1570,7 +1570,7 @@ module StaticLinker = ReportTime tcConfig "Static link"; #if EXTENSIONTYPING - Morphs.enablemorphCustomAttributeData() + Morphs.enableMorphCustomAttributeData() let providerGeneratedILModules = FindProviderGeneratedILModules (tcImports, providerGeneratedAssemblies) // Transform the ILTypeRefs references in the IL of all provider-generated assemblies so that the references @@ -1692,7 +1692,7 @@ module StaticLinker = providerGeneratedILModules, ilxMainModule - Morphs.disablemorphCustomAttributeData() + Morphs.disableMorphCustomAttributeData() #else let providerGeneratedILModules = [] #endif diff --git a/src/ilx/EraseClosures.fs b/src/ilx/EraseClosures.fs index c4fd7a28de0..e49ac9ab343 100644 --- a/src/ilx/EraseClosures.fs +++ b/src/ilx/EraseClosures.fs @@ -281,21 +281,21 @@ let mkCallFunc cenv allocLocal numThisGenParams tl apps = buildApp true [] apps -// Fix up I_ret instruction. Generalise to selected instr. +// Fix up I_ret instruction. Generalise to selected instr. Remove tailcalls. let convReturnInstr ty instr = match instr with | I_ret -> [I_box ty;I_ret] + | I_call (_,mspec,varargs) -> [I_call (Normalcall,mspec,varargs)] + | I_callvirt (_,mspec,varargs) -> [I_callvirt (Normalcall,mspec,varargs)] + | I_callconstraint (_,ty,mspec,varargs) -> [I_callconstraint (Normalcall,ty,mspec,varargs)] + | I_calli (_,csig,varargs) -> [I_calli (Normalcall,csig,varargs)] | _ -> [instr] -let convILMethodBody (thisClo,boxReturnTy) il = - let tmps = ILLocalsAllocator il.Locals.Length - let locals = il.Locals - // Add a local to keep the result value of a thunk while storing it - // into the result field and returning it. - // Record the local slot number in the environment passed in thisClo +let convILMethodBody (thisClo,boxReturnTy) (il: ILMethodBody) = + // This increase in maxstack is historical, though it's harmless let newMax = match thisClo with - | Some _ -> il.MaxStack+2 (* for calls *) + | Some _ -> il.MaxStack+2 | None -> il.MaxStack let code = il.Code // Box before returning? e.g. in the case of a TyFunc returning a struct, which @@ -304,10 +304,7 @@ let convILMethodBody (thisClo,boxReturnTy) il = match boxReturnTy with | None -> code | Some ty -> morphILInstrsInILCode (convReturnInstr ty) code - {il with MaxStack=newMax; - IsZeroInit=true; - Code= code ; - Locals = ILList.ofList (ILList.toList locals @ tmps.Close()) } + {il with MaxStack=newMax; IsZeroInit=true; Code= code } let convMethodBody thisClo = function | MethodBody.IL il -> MethodBody.IL (convILMethodBody (thisClo,None) il) diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index d53a9591fb3..c27e17db5ca 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -7,6 +7,7 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.EraseUnions +open System.Collections.Generic open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.Internal @@ -240,8 +241,8 @@ let mkRuntimeTypeDiscriminate ilg avoidHelpers cuspec alt altName altTy = let mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy after = let useHelper = doesRuntimeTypeDiscriminateUseHelper avoidHelpers cuspec alt match after with - | I_brcmp (BI_brfalse,_,_) - | I_brcmp (BI_brtrue,_,_) when not useHelper -> + | I_brcmp (BI_brfalse,_) + | I_brcmp (BI_brtrue,_) when not useHelper -> [ I_isinst altTy; after ] | _ -> mkRuntimeTypeDiscriminate ilg avoidHelpers cuspec alt altName altTy @ [ after ] @@ -282,8 +283,8 @@ let mkGetTag ilg (cuspec: IlxUnionSpec) = let mkCeqThen after = match after with - | I_brcmp (BI_brfalse,a,b) -> [I_brcmp (BI_bne_un,a,b)] - | I_brcmp (BI_brtrue,a,b) -> [I_brcmp (BI_beq,a,b)] + | I_brcmp (BI_brfalse,a) -> [I_brcmp (BI_bne_un,a)] + | I_brcmp (BI_brtrue,a) -> [I_brcmp (BI_beq,a)] | _ -> [AI_ceq; after] @@ -377,50 +378,41 @@ type ICodeGen<'Mark> = abstract EmitInstrs : ILInstr list -> unit // TODO: this will be removed -let genWith g = - let blocks = ResizeArray() // all the blocks emitted so far - let instrs = ResizeArray() // the current block being emitted - let internalLabels = ResizeArray() - let firstLabel = generateCodeLabel() - let mutable label = firstLabel - let closeBock m = - blocks.Add (mkBasicBlock { Label = label; Instructions=instrs.ToArray() }) - internalLabels.Add label - label <- m - instrs.Clear() - let cg = - { new ICodeGen<_> with - member __.CodeLabel(m) = m - member __.GenerateDelayMark() = generateCodeLabel() - member __.GenLocal(ilty) = failwith "not needed" - member __.SetMarkToHere(m) = closeBock m - member __.EmitInstr x = instrs.Add x - member cg.EmitInstrs xs = for i in xs do cg.EmitInstr i } - g cg - closeBock (generateCodeLabel()) - let entry = generateCodeLabel() - // TODO: what about "I_ret" instruction??? - mkGroupBlock(internalLabels |> Seq.toList, mkBasicBlock { Label = entry; Instructions = [| I_br firstLabel |] } :: (blocks |> Seq.toList)) - - -let mkBrIsData ilg (avoidHelpers, cuspec,cidx,tg,failLab) = +let genWith g : ILCode = + let instrs = ResizeArray() + let lab2pc = Dictionary() + g { new ICodeGen with + member __.CodeLabel(m) = m + member __.GenerateDelayMark() = generateCodeLabel() + member __.GenLocal(ilty) = failwith "not needed" + member __.SetMarkToHere(m) = lab2pc.[m] <- instrs.Count + member __.EmitInstr x = instrs.Add x + member cg.EmitInstrs xs = for i in xs do cg.EmitInstr i } + + { Labels = lab2pc + Instrs = instrs.ToArray() + Exceptions = [] + Locals = [] } + + +let mkBrIsNotData ilg (avoidHelpers, cuspec,cidx,tg) = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let altName = alt.Name if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then - [ I_brcmp (BI_brtrue,failLab,tg) ] + [ I_brcmp (BI_brtrue,tg) ] elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then // in this case we can use a null test - [ I_brcmp (BI_brfalse,failLab,tg) ] + [ I_brcmp (BI_brfalse,tg) ] else match cuspecRepr.DiscriminationTechnique cuspec with - | SingleCase -> [ I_br tg ] - | RuntimeTypes -> mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy (I_brcmp (BI_brfalse,failLab,tg)) - | IntegerTag -> mkTagDiscriminateThen ilg cuspec cidx (I_brcmp (BI_brfalse,failLab,tg)) + | SingleCase -> [ ] + | RuntimeTypes -> mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy (I_brcmp (BI_brfalse,tg)) + | IntegerTag -> mkTagDiscriminateThen ilg cuspec cidx (I_brcmp (BI_brfalse,tg)) | TailOrNull -> match cidx with - | TagNil -> mkGetTailOrNull avoidHelpers cuspec @ [I_brcmp (BI_brtrue,failLab,tg)] - | TagCons -> mkGetTailOrNull avoidHelpers cuspec @ [ I_brcmp (BI_brfalse,failLab,tg)] + | TagNil -> mkGetTailOrNull avoidHelpers cuspec @ [I_brcmp (BI_brtrue,tg)] + | TagCons -> mkGetTailOrNull avoidHelpers cuspec @ [ I_brcmp (BI_brfalse,tg)] | _ -> failwith "unexpected" @@ -463,7 +455,7 @@ let emitLdDataTagPrim ilg ldOpt (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxU let internalLab = cg.GenerateDelayMark() let failLab = cg.GenerateDelayMark () let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) - let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),cg.CodeLabel failLab,cg.CodeLabel internalLab) + let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),cg.CodeLabel failLab) let testBlock = if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then [ test ] @@ -493,7 +485,7 @@ let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = if canfail then let outlab = cg.GenerateDelayMark () let internal1 = cg.GenerateDelayMark () - cg.EmitInstrs [AI_dup; I_brcmp (BI_brfalse, cg.CodeLabel outlab, cg.CodeLabel internal1) ]; + cg.EmitInstrs [AI_dup; I_brcmp (BI_brfalse, cg.CodeLabel outlab) ]; cg.SetMarkToHere internal1 cg.EmitInstrs [mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ] cg.SetMarkToHere outlab @@ -504,7 +496,7 @@ let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = let altTy = tyForAlt cuspec alt cg.EmitInstr (I_castclass altTy) -let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases, cont) = +let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases) = let baseTy = baseTyOfUnionSpec cuspec match cuspecRepr.DiscriminationTechnique cuspec with @@ -520,37 +512,38 @@ let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases, cont) let failLab = cg.GenerateDelayMark () let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) - let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg,cg.CodeLabel failLab) cg.EmitInstr (mkLdloc locn) + let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg) if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then cg.EmitInstr testInstr else cg.EmitInstrs (mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy testInstr) cg.SetMarkToHere failLab - cg.EmitInstr (I_br cont) | IntegerTag -> match cases with - | [] -> cg.EmitInstrs [ AI_pop; I_br cont ] + | [] -> cg.EmitInstrs [ AI_pop ] | _ -> // Use a dictionary to avoid quadratic lookup in case list let dict = System.Collections.Generic.Dictionary() for (i,case) in cases do dict.[i] <- case + let failLab = cg.GenerateDelayMark () let emitCase i _ = let mutable res = Unchecked.defaultof<_> let ok = dict.TryGetValue(i, &res) - if ok then res else cont + if ok then res else cg.CodeLabel failLab let dests = Array.mapi emitCase cuspec.AlternativesArray cg.EmitInstrs (mkGetTag ilg cuspec) - cg.EmitInstr (I_switch (Array.toList dests,cont)) + cg.EmitInstr (I_switch (Array.toList dests)) + cg.SetMarkToHere failLab | SingleCase -> match cases with | [(0,tg)] -> cg.EmitInstrs [ AI_pop; I_br tg ] - | [] -> cg.EmitInstrs [ AI_pop; I_br cont ] + | [] -> cg.EmitInstrs [ AI_pop; ] | _ -> failwith "unexpected: strange switch on single-case unions should not be present" | TailOrNull -> diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index 090061573db..8a411b6efdf 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -13,7 +13,7 @@ val mkNewData : ILGlobals -> IlxUnionSpec * int -> ILInstr list val mkIsData : ILGlobals -> bool * IlxUnionSpec * int -> ILInstr list val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list val mkStData : IlxUnionSpec * int * int -> ILInstr list -val mkBrIsData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel * ILCodeLabel -> ILInstr list +val mkBrIsNotData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel -> ILInstr list val mkClassUnionDef : ILGlobals -> ILTypeRef -> ILTypeDef -> IlxUnionInfo -> ILTypeDef val GetILTypeForAlternative : IlxUnionSpec -> int -> ILType @@ -27,4 +27,4 @@ type ICodeGen<'Mark> = val emitCastData : ILGlobals -> ICodeGen<'Mark> -> canfail: bool * IlxUnionSpec * int -> unit val emitLdDataTag : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec -> unit -val emitDataSwitch : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list * ILCodeLabel -> unit +val emitDataSwitch : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list -> unit diff --git a/src/update.cmd b/src/update.cmd index b41808454f1..74442338d1c 100644 --- a/src/update.cmd +++ b/src/update.cmd @@ -87,13 +87,14 @@ if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( ) if /i '%1' == 'signonly' goto :eof +if /i '%1' == 'debug' set NGEN_FLAGS=/Debug rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll if /i not "%2"=="-ngen" goto :donengen -"%NGEN32%" install "%BINDIR%\fsc.exe" /queue:1 -"%NGEN32%" install "%BINDIR%\fsi.exe" /queue:1 -"%NGEN32%" install "%BINDIR%\FSharp.Build.dll" /queue:1 +"%NGEN32%" install "%BINDIR%\fsc.exe" %NGEN_FLAGS% /queue:1 +"%NGEN32%" install "%BINDIR%\fsi.exe" %NGEN_FLAGS% /queue:1 +"%NGEN32%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 "%NGEN32%" executeQueuedItems 1 if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( From b372abd73e72e7ed9a50c949ca5f1064a3351821 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 11 Jun 2016 12:35:13 +0100 Subject: [PATCH 257/334] fix IL test baselines --- .../SeqExpressionSteppingTest7.il.bsl | 162 +++++++++--------- .../SeqExpressionSteppingTest7.il.netfx4.bsl | 96 ++++++----- .../ToplevelModule.il.bsl | 8 +- .../ToplevelModuleP.il.bsl | 14 +- .../ToplevelNamespace.il.bsl | 8 +- .../ToplevelNamespaceP.il.bsl | 16 +- .../TestFunctions/TestFunction3.il.netfx4.bsl | 32 ++-- .../TestFunction3b.il.netfx4.bsl | 51 +++--- .../TestFunction3c.il.netfx4.bsl | 51 +++--- .../TestFunctions/Testfunction3.il.bsl | 36 ++-- .../TestFunctions/Testfunction3b.il.bsl | 55 +++--- .../TestFunctions/Testfunction3c.il.bsl | 55 +++--- 12 files changed, 308 insertions(+), 276 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.bsl index 237634ce01a..1291f759594 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.bsl @@ -1,19 +1,19 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 3.5.30729.1 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. -// Metadata version: v2.0.50727 +// Metadata version: v4.0.30319 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. - .ver 2:0:0:0 + .ver 4:0:0:0 } .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 2:0:0:0 + .ver 4:4:1:0 } .assembly SeqExpressionSteppingTest7 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.SeqExpressionSteppingTest7 { - // Offset: 0x00000000 Length: 0x00000254 + // Offset: 0x00000000 Length: 0x00000272 } .mresource public FSharpOptimizationData.SeqExpressionSteppingTest7 { - // Offset: 0x00000258 Length: 0x00000098 + // Offset: 0x00000278 Length: 0x00000098 } -.module SeqExpressionSteppingTest7.dll -// MVID: {4D94A874-241E-0855-A745-038374A8944D} +.module SeqExpressionSteppingTest7.exe +// MVID: {575BE157-2432-93C3-A745-038357E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x006E0000 +// Image base: 0x00DE0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -51,7 +51,7 @@ extends [mscorlib]System.Object { .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) - .class auto autochar serializable sealed nested assembly beforefieldinit specialname f@4 + .class auto autochar serializable sealed nested assembly beforefieldinit specialname f@5 extends class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1 { .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 06 00 00 00 00 00 ) @@ -68,17 +68,17 @@ !a current) cil managed { // Code size 21 (0x15) - .maxstack 6 + .maxstack 8 IL_0000: ldarg.0 IL_0001: ldarg.1 - IL_0002: stfld int32 class SeqExpressionSteppingTest7/f@4::pc + IL_0002: stfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0007: ldarg.0 IL_0008: ldarg.2 - IL_0009: stfld !0 class SeqExpressionSteppingTest7/f@4::current + IL_0009: stfld !0 class SeqExpressionSteppingTest7/f@5::current IL_000e: ldarg.0 IL_000f: call instance void class [FSharp.Core]Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1::.ctor() IL_0014: ret - } // end of method f@4::.ctor + } // end of method f@5::.ctor .method public strict virtual instance int32 GenerateNext(class [mscorlib]System.Collections.Generic.IEnumerable`1& next) cil managed @@ -87,9 +87,9 @@ .maxstack 6 .locals init ([0] !a V_0) .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SeqExpressionStepping\\SeqExpressionSteppingTest7.fs' IL_0000: ldarg.0 - IL_0001: ldfld int32 class SeqExpressionSteppingTest7/f@4::pc + IL_0001: ldfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0006: ldc.i4.1 IL_0007: sub IL_0008: switch ( @@ -101,26 +101,26 @@ IL_0019: br.s IL_001e - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_001b: nop IL_001c: br.s IL_004e - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_001e: nop IL_001f: br.s IL_0059 - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_0021: nop - .line 4,4 : 14,36 + .line 5,5 : 14,36 '' IL_0022: nop - .line 4,4 : 18,24 + .line 5,5 : 18,24 '' IL_0023: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 SeqExpressionSteppingTest7::get_r() IL_0028: call void [FSharp.Core]Microsoft.FSharp.Core.Operators::Increment(class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1) IL_002d: nop - .line 4,4 : 26,30 + .line 5,5 : 26,30 '' IL_002e: ldc.i4.1 IL_002f: brfalse.s IL_0033 @@ -130,8 +130,8 @@ IL_0035: ldarg.0 IL_0036: ldc.i4.1 - IL_0037: stfld int32 class SeqExpressionSteppingTest7/f@4::pc - .line 4,4 : 44,55 + IL_0037: stfld int32 class SeqExpressionSteppingTest7/f@5::pc + .line 5,5 : 44,55 '' IL_003c: ldarg.1 IL_003d: ldstr "" IL_0042: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith>(string) @@ -139,45 +139,45 @@ IL_004c: ldc.i4.2 IL_004d: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_004e: nop IL_004f: br.s IL_0052 - .line 4,4 : 14,36 - .line 100001,100001 : 0,0 + .line 5,5 : 14,36 '' + .line 100001,100001 : 0,0 '' IL_0051: nop IL_0052: ldarg.0 IL_0053: ldc.i4.2 - IL_0054: stfld int32 class SeqExpressionSteppingTest7/f@4::pc + IL_0054: stfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0059: ldarg.0 IL_005a: ldloca.s V_0 IL_005c: initobj !a IL_0062: ldloc.0 - IL_0063: stfld !0 class SeqExpressionSteppingTest7/f@4::current + IL_0063: stfld !0 class SeqExpressionSteppingTest7/f@5::current IL_0068: ldc.i4.0 IL_0069: ret - } // end of method f@4::GenerateNext + } // end of method f@5::GenerateNext .method public strict virtual instance void Close() cil managed { // Code size 9 (0x9) - .maxstack 6 + .maxstack 8 IL_0000: nop IL_0001: ldarg.0 IL_0002: ldc.i4.2 - IL_0003: stfld int32 class SeqExpressionSteppingTest7/f@4::pc + IL_0003: stfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0008: ret - } // end of method f@4::Close + } // end of method f@5::Close .method public strict virtual instance bool get_CheckClose() cil managed { - // Code size 46 (0x2e) - .maxstack 5 + // Code size 47 (0x2f) + .maxstack 8 IL_0000: nop IL_0001: ldarg.0 - IL_0002: ldfld int32 class SeqExpressionSteppingTest7/f@4::pc + IL_0002: ldfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0007: switch ( IL_001a, IL_001c, @@ -191,21 +191,22 @@ IL_001e: br.s IL_0026 IL_0020: nop - IL_0021: br.s IL_002c + IL_0021: br.s IL_002d IL_0023: nop IL_0024: br.s IL_002a IL_0026: nop - IL_0027: br.s IL_002c + IL_0027: br.s IL_002d IL_0029: nop IL_002a: ldc.i4.0 IL_002b: ret - IL_002c: ldc.i4.0 - IL_002d: ret - } // end of method f@4::get_CheckClose + IL_002c: nop + IL_002d: ldc.i4.0 + IL_002e: ret + } // end of method f@5::get_CheckClose .method public strict virtual instance !a get_LastGenerated() cil managed @@ -213,12 +214,12 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) // Code size 8 (0x8) - .maxstack 5 + .maxstack 8 IL_0000: nop IL_0001: ldarg.0 - IL_0002: ldfld !0 class SeqExpressionSteppingTest7/f@4::current + IL_0002: ldfld !0 class SeqExpressionSteppingTest7/f@5::current IL_0007: ret - } // end of method f@4::get_LastGenerated + } // end of method f@5::get_LastGenerated .method public strict virtual instance class [mscorlib]System.Collections.Generic.IEnumerator`1 GetFreshEnumerator() cil managed @@ -233,19 +234,19 @@ IL_0002: ldloca.s V_0 IL_0004: initobj !a IL_000a: ldloc.0 - IL_000b: newobj instance void class SeqExpressionSteppingTest7/f@4::.ctor(int32, + IL_000b: newobj instance void class SeqExpressionSteppingTest7/f@5::.ctor(int32, !0) IL_0010: ret - } // end of method f@4::GetFreshEnumerator + } // end of method f@5::GetFreshEnumerator - } // end of class f@4 + } // end of class f@5 .method public specialname static class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 get_r() cil managed { // Code size 6 (0x6) - .maxstack 4 - IL_0000: ldsfld class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 ''.$SeqExpressionSteppingTest7::r@3 + .maxstack 8 + IL_0000: ldsfld class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 ''.$SeqExpressionSteppingTest7::r@4 IL_0005: ret } // end of method SeqExpressionSteppingTest7::get_r @@ -255,13 +256,13 @@ // Code size 24 (0x18) .maxstack 4 .locals init ([0] !!a V_0) - .line 4,4 : 12,57 + .line 5,5 : 12,57 '' IL_0000: nop IL_0001: ldc.i4.0 IL_0002: ldloca.s V_0 IL_0004: initobj !!a IL_000a: ldloc.0 - IL_000b: newobj instance void class SeqExpressionSteppingTest7/f@4::.ctor(int32, + IL_000b: newobj instance void class SeqExpressionSteppingTest7/f@5::.ctor(int32, !0) IL_0010: tail. IL_0012: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 [FSharp.Core]Microsoft.FSharp.Collections.SeqModule::ToList(class [mscorlib]System.Collections.Generic.IEnumerable`1) @@ -279,16 +280,16 @@ .class private abstract auto ansi sealed ''.$SeqExpressionSteppingTest7 extends [mscorlib]System.Object { - .field static assembly initonly class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 r@3 + .field static assembly class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 r@4 .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) .field static assembly int32 init@ .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) - .method private specialname rtspecialname static - void .cctor() cil managed + .method public static void main@() cil managed { - // Code size 100 (0x64) + .entrypoint + // Code size 109 (0x6d) .maxstack 4 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 r, [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit> V_1, @@ -296,29 +297,29 @@ [3] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 V_3, [4] class [mscorlib]System.Exception V_4, [5] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_5) - .line 3,3 : 1,14 + .line 4,4 : 1,14 '' IL_0000: nop IL_0001: ldc.i4.0 IL_0002: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 [FSharp.Core]Microsoft.FSharp.Core.Operators::Ref(!!0) IL_0007: dup - IL_0008: stsfld class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 ''.$SeqExpressionSteppingTest7::r@3 + IL_0008: stsfld class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 ''.$SeqExpressionSteppingTest7::r@4 IL_000d: stloc.0 IL_000e: ldstr "res = %A" IL_0013: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5,class [FSharp.Core]Microsoft.FSharp.Core.Unit>,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1>::.ctor(string) IL_0018: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine,class [FSharp.Core]Microsoft.FSharp.Core.Unit>>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_001d: stloc.1 - .line 5,5 : 1,53 + .line 6,6 : 1,53 '' IL_001e: nop - .line 5,5 : 21,24 + .line 6,6 : 21,24 '' .try { IL_001f: nop - .line 5,5 : 25,29 + .line 6,6 : 25,29 '' IL_0020: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 SeqExpressionSteppingTest7::f() IL_0025: stloc.3 - IL_0026: leave.s IL_0059 + IL_0026: leave.s IL_0062 - .line 5,5 : 30,34 + .line 6,6 : 30,34 '' } // end .try catch [mscorlib]System.Object { @@ -334,27 +335,32 @@ IL_003e: br.s IL_0057 - .line 5,5 : 48,52 + .line 6,6 : 48,52 '' IL_0040: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 SeqExpressionSteppingTest7::get_r() IL_0045: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::op_Dereference(class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1) IL_004a: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1::get_Empty() IL_004f: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1::Cons(!0, class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1) IL_0054: stloc.3 - IL_0055: leave.s IL_0059 + IL_0055: leave.s IL_0062 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0057: rethrow - .line 100001,100001 : 0,0 + IL_0059: ldnull + IL_005a: unbox.any class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 + IL_005f: stloc.3 + IL_0060: leave.s IL_0062 + + .line 100001,100001 : 0,0 '' } // end handler - IL_0059: ldloc.3 - IL_005a: stloc.2 - IL_005b: ldloc.1 - IL_005c: ldloc.2 - IL_005d: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::Invoke(!0) - IL_0062: pop - IL_0063: ret - } // end of method $SeqExpressionSteppingTest7::.cctor + IL_0062: ldloc.3 + IL_0063: stloc.2 + IL_0064: ldloc.1 + IL_0065: ldloc.2 + IL_0066: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::Invoke(!0) + IL_006b: pop + IL_006c: ret + } // end of method $SeqExpressionSteppingTest7::main@ } // end of class ''.$SeqExpressionSteppingTest7 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.netfx4.bsl index 1e826c008d2..1291f759594 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SeqExpressionStepping/SeqExpressionSteppingTest7.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly SeqExpressionSteppingTest7 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.SeqExpressionSteppingTest7 { - // Offset: 0x00000000 Length: 0x00000297 + // Offset: 0x00000000 Length: 0x00000272 } .mresource public FSharpOptimizationData.SeqExpressionSteppingTest7 { - // Offset: 0x000002A0 Length: 0x00000098 + // Offset: 0x00000278 Length: 0x00000098 } .module SeqExpressionSteppingTest7.exe -// MVID: {4DAC1467-2432-93C3-A745-03836714AC4D} +// MVID: {575BE157-2432-93C3-A745-038357E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000270000 +// Image base: 0x00DE0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -87,7 +87,7 @@ .maxstack 6 .locals init ([0] !a V_0) .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SeqExpressionStepping\\SeqExpressionSteppingTest7.fs' IL_0000: ldarg.0 IL_0001: ldfld int32 class SeqExpressionSteppingTest7/f@5::pc IL_0006: ldc.i4.1 @@ -101,26 +101,26 @@ IL_0019: br.s IL_001e - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_001b: nop IL_001c: br.s IL_004e - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_001e: nop IL_001f: br.s IL_0059 - .line 100001,100001 : 0,0 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' + .line 100001,100001 : 0,0 '' IL_0021: nop - .line 5,5 : 14,36 + .line 5,5 : 14,36 '' IL_0022: nop - .line 5,5 : 18,24 + .line 5,5 : 18,24 '' IL_0023: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 SeqExpressionSteppingTest7::get_r() IL_0028: call void [FSharp.Core]Microsoft.FSharp.Core.Operators::Increment(class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1) IL_002d: nop - .line 5,5 : 26,30 + .line 5,5 : 26,30 '' IL_002e: ldc.i4.1 IL_002f: brfalse.s IL_0033 @@ -131,7 +131,7 @@ IL_0035: ldarg.0 IL_0036: ldc.i4.1 IL_0037: stfld int32 class SeqExpressionSteppingTest7/f@5::pc - .line 5,5 : 44,55 + .line 5,5 : 44,55 '' IL_003c: ldarg.1 IL_003d: ldstr "" IL_0042: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith>(string) @@ -139,12 +139,12 @@ IL_004c: ldc.i4.2 IL_004d: ret - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_004e: nop IL_004f: br.s IL_0052 - .line 5,5 : 14,36 - .line 100001,100001 : 0,0 + .line 5,5 : 14,36 '' + .line 100001,100001 : 0,0 '' IL_0051: nop IL_0052: ldarg.0 IL_0053: ldc.i4.2 @@ -173,7 +173,7 @@ .method public strict virtual instance bool get_CheckClose() cil managed { - // Code size 46 (0x2e) + // Code size 47 (0x2f) .maxstack 8 IL_0000: nop IL_0001: ldarg.0 @@ -191,20 +191,21 @@ IL_001e: br.s IL_0026 IL_0020: nop - IL_0021: br.s IL_002c + IL_0021: br.s IL_002d IL_0023: nop IL_0024: br.s IL_002a IL_0026: nop - IL_0027: br.s IL_002c + IL_0027: br.s IL_002d IL_0029: nop IL_002a: ldc.i4.0 IL_002b: ret - IL_002c: ldc.i4.0 - IL_002d: ret + IL_002c: nop + IL_002d: ldc.i4.0 + IL_002e: ret } // end of method f@5::get_CheckClose .method public strict virtual instance !a @@ -255,7 +256,7 @@ // Code size 24 (0x18) .maxstack 4 .locals init ([0] !!a V_0) - .line 5,5 : 12,57 + .line 5,5 : 12,57 '' IL_0000: nop IL_0001: ldc.i4.0 IL_0002: ldloca.s V_0 @@ -288,7 +289,7 @@ .method public static void main@() cil managed { .entrypoint - // Code size 100 (0x64) + // Code size 109 (0x6d) .maxstack 4 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 r, [1] class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit> V_1, @@ -296,7 +297,7 @@ [3] class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 V_3, [4] class [mscorlib]System.Exception V_4, [5] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_5) - .line 4,4 : 1,14 + .line 4,4 : 1,14 '' IL_0000: nop IL_0001: ldc.i4.0 IL_0002: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 [FSharp.Core]Microsoft.FSharp.Core.Operators::Ref(!!0) @@ -307,18 +308,18 @@ IL_0013: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5,class [FSharp.Core]Microsoft.FSharp.Core.Unit>,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1>::.ctor(string) IL_0018: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine,class [FSharp.Core]Microsoft.FSharp.Core.Unit>>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_001d: stloc.1 - .line 6,6 : 1,53 + .line 6,6 : 1,53 '' IL_001e: nop - .line 6,6 : 21,24 + .line 6,6 : 21,24 '' .try { IL_001f: nop - .line 6,6 : 25,29 + .line 6,6 : 25,29 '' IL_0020: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 SeqExpressionSteppingTest7::f() IL_0025: stloc.3 - IL_0026: leave.s IL_0059 + IL_0026: leave.s IL_0062 - .line 6,6 : 30,34 + .line 6,6 : 30,34 '' } // end .try catch [mscorlib]System.Object { @@ -334,26 +335,31 @@ IL_003e: br.s IL_0057 - .line 6,6 : 48,52 + .line 6,6 : 48,52 '' IL_0040: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 SeqExpressionSteppingTest7::get_r() IL_0045: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::op_Dereference(class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1) IL_004a: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1::get_Empty() IL_004f: call class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1::Cons(!0, class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1) IL_0054: stloc.3 - IL_0055: leave.s IL_0059 + IL_0055: leave.s IL_0062 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0057: rethrow - .line 100001,100001 : 0,0 + IL_0059: ldnull + IL_005a: unbox.any class [FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1 + IL_005f: stloc.3 + IL_0060: leave.s IL_0062 + + .line 100001,100001 : 0,0 '' } // end handler - IL_0059: ldloc.3 - IL_005a: stloc.2 - IL_005b: ldloc.1 - IL_005c: ldloc.2 - IL_005d: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::Invoke(!0) - IL_0062: pop - IL_0063: ret + IL_0062: ldloc.3 + IL_0063: stloc.2 + IL_0064: ldloc.1 + IL_0065: ldloc.2 + IL_0066: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::Invoke(!0) + IL_006b: pop + IL_006c: ret } // end of method $SeqExpressionSteppingTest7::main@ } // end of class ''.$SeqExpressionSteppingTest7 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl index 70867b5230b..075b68845ee 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001158 Length: 0x000003FD } .module TopLevelModule.dll -// MVID: {57570CF0-37F5-C118-A745-0383F00C5757} +// MVID: {575BE147-37F5-C118-A745-038347E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x01340000 +// Image base: 0x00620000 // =============== CLASS MEMBERS DECLARATION =================== @@ -1720,8 +1720,8 @@ { // Code size 14 (0xe) .maxstack 3 - .locals init ([0] string greeting, - [1] string V_1) + .locals init ([0] string V_0, + [1] string greeting) .line 12,12 : 9,31 '' IL_0000: nop IL_0001: call string ABC::get_greeting() diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl index 57151a494a9..76df7a86bfb 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 3:47:41:9055 + .ver 3:47:41:0 } .assembly ToplevelModuleP { @@ -29,20 +29,20 @@ } .mresource public FSharpSignatureData.ToplevelModuleP { - // Offset: 0x00000000 Length: 0x0000114D + // Offset: 0x00000000 Length: 0x0000114F } .mresource public FSharpOptimizationData.ToplevelModuleP { // Offset: 0x00001158 Length: 0x000003FE } .module ToplevelModuleP.dll -// MVID: {5706E103-5A3A-8E4D-A745-038303E10657} +// MVID: {575BE155-5A3A-8E4D-A745-038355E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x005F0000 +// Image base: 0x009B0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -219,7 +219,7 @@ // Code size 14 (0xe) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 6,6 : 14,18 'd:\\KevinRansom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelModule.fs' + .line 6,6 : 14,18 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelModule.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -1692,8 +1692,8 @@ { // Code size 14 (0xe) .maxstack 3 - .locals init ([0] string greeting, - [1] string V_1) + .locals init ([0] string V_0, + [1] string greeting) .line 12,12 : 9,31 '' IL_0000: nop IL_0001: call string ABC::get_greeting() diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl index 7a89e3c0507..1d33d16bc4c 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001860 Length: 0x0000055C } .module ToplevelNamespace.dll -// MVID: {57570CF5-218B-729A-A745-0383F50C5757} +// MVID: {575BE14E-218B-729A-A745-03834EE15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00820000 +// Image base: 0x00F30000 // =============== CLASS MEMBERS DECLARATION =================== @@ -2513,8 +2513,8 @@ { // Code size 14 (0xe) .maxstack 3 - .locals init ([0] string greeting, - [1] string V_1) + .locals init ([0] string V_0, + [1] string greeting) .line 19,19 : 9,31 '' IL_0000: nop IL_0001: call string XYZ.ABC::get_greeting() diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl index f68709c67cb..15931872229 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:4:1:9055 + .ver 3:47:41:0 } .assembly ToplevelNamespaceP { @@ -29,20 +29,20 @@ } .mresource public FSharpSignatureData.ToplevelNamespaceP { - // Offset: 0x00000000 Length: 0x00001858 + // Offset: 0x00000000 Length: 0x0000185A } .mresource public FSharpOptimizationData.ToplevelNamespaceP { // Offset: 0x00001860 Length: 0x0000055D } .module ToplevelNamespaceP.dll -// MVID: {57061C46-88D9-D7FD-A745-0383461C0657} +// MVID: {575BE15B-88D9-D7FD-A745-03835BE15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00960000 +// Image base: 0x003C0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -214,7 +214,7 @@ // Code size 14 (0xe) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 7,7 : 10,14 'c:\\KevinRansom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelNamespace.fs' + .line 7,7 : 10,14 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\SerializableAttribute\\ToplevelNamespace.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -2471,8 +2471,8 @@ { // Code size 14 (0xe) .maxstack 3 - .locals init ([0] string greeting, - [1] string V_1) + .locals init ([0] string V_0, + [1] string greeting) .line 19,19 : 9,31 '' IL_0000: nop IL_0001: call string XYZ.ABC::get_greeting() diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3.il.netfx4.bsl index 7d53581aa46..355aed3bee6 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3 { - // Offset: 0x00000000 Length: 0x00000221 + // Offset: 0x00000000 Length: 0x000001FD } .mresource public FSharpOptimizationData.TestFunction3 { - // Offset: 0x00000228 Length: 0x00000088 + // Offset: 0x00000208 Length: 0x00000088 } .module TestFunction3.exe -// MVID: {4DAC30C7-663A-8929-A745-0383C730AC4D} +// MVID: {575BE191-663A-8929-A745-038391E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000270000 +// Image base: 0x003D0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -56,18 +56,18 @@ // Code size 37 (0x25) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -81,35 +81,35 @@ .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, [2] class [mscorlib]System.Exception V_2) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,23 + .line 12,12 : 8,23 '' IL_0008: ldstr "Hello" IL_000d: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0012: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0017: stloc.0 IL_0018: leave.s IL_0032 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { IL_001a: castclass [mscorlib]System.Exception IL_001f: stloc.2 - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0020: ldstr "World" IL_0025: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_002a: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_002f: stloc.0 IL_0030: leave.s IL_0032 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' } // end handler IL_0032: ldloc.0 IL_0033: pop diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3b.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3b.il.netfx4.bsl index 1117c6e4b42..08e21867c7a 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3b.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3b.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3b { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3b { - // Offset: 0x00000000 Length: 0x00000224 + // Offset: 0x00000000 Length: 0x00000200 } .mresource public FSharpOptimizationData.TestFunction3b { - // Offset: 0x00000228 Length: 0x0000008A + // Offset: 0x00000208 Length: 0x0000008A } .module TestFunction3b.exe -// MVID: {4DAC30C9-A662-4FC9-A745-0383C930AC4D} +// MVID: {575BE194-A662-4FC9-A745-038394E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000360000 +// Image base: 0x01040000 // =============== CLASS MEMBERS DECLARATION =================== @@ -56,18 +56,18 @@ // Code size 37 (0x25) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3b.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -76,27 +76,27 @@ .method public static void TestFunction3b() cil managed { - // Code size 64 (0x40) + // Code size 73 (0x49) .maxstack 3 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, [2] class [mscorlib]System.Exception V_2, [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_3) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3b::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,24 + .line 12,12 : 8,24 '' IL_0008: ldstr "hello" IL_000d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith(string) IL_0012: stloc.0 - IL_0013: leave.s IL_003d + IL_0013: leave.s IL_0046 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { @@ -112,20 +112,25 @@ IL_0027: br.s IL_003b - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0029: ldstr "World" IL_002e: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0033: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0038: stloc.0 - IL_0039: leave.s IL_003d + IL_0039: leave.s IL_0046 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_003b: rethrow - .line 100001,100001 : 0,0 + IL_003d: ldnull + IL_003e: unbox.any [FSharp.Core]Microsoft.FSharp.Core.Unit + IL_0043: stloc.0 + IL_0044: leave.s IL_0046 + + .line 100001,100001 : 0,0 '' } // end handler - IL_003d: ldloc.0 - IL_003e: pop - IL_003f: ret + IL_0046: ldloc.0 + IL_0047: pop + IL_0048: ret } // end of method TestFunction3b::TestFunction3b } // end of class TestFunction3b diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3c.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3c.il.netfx4.bsl index 3a951966190..f9abc1cc34b 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3c.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction3c.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.16774 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3c { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3c { - // Offset: 0x00000000 Length: 0x00000224 + // Offset: 0x00000000 Length: 0x00000200 } .mresource public FSharpOptimizationData.TestFunction3c { - // Offset: 0x00000228 Length: 0x0000008A + // Offset: 0x00000208 Length: 0x0000008A } .module TestFunction3c.exe -// MVID: {4DAC30CC-A662-4FAC-A745-0383CC30AC4D} +// MVID: {575BE197-A662-4FAC-A745-038397E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x0000000000160000 +// Image base: 0x00520000 // =============== CLASS MEMBERS DECLARATION =================== @@ -56,18 +56,18 @@ // Code size 37 (0x25) .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3c.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -76,7 +76,7 @@ .method public static void TestFunction3c() cil managed { - // Code size 94 (0x5e) + // Code size 103 (0x67) .maxstack 4 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, @@ -84,21 +84,21 @@ [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_3, [4] string msg, [5] string V_5) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3c::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,24 + .line 12,12 : 8,24 '' IL_0008: ldstr "hello" IL_000d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith(string) IL_0012: stloc.0 - IL_0013: leave.s IL_005b + IL_0013: leave.s IL_0064 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { @@ -126,20 +126,25 @@ IL_003f: ldloc.3 IL_0040: call instance !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1::get_Value() IL_0045: stloc.s V_5 - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0047: ldstr "World" IL_004c: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0051: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0056: stloc.0 - IL_0057: leave.s IL_005b + IL_0057: leave.s IL_0064 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0059: rethrow - .line 100001,100001 : 0,0 + IL_005b: ldnull + IL_005c: unbox.any [FSharp.Core]Microsoft.FSharp.Core.Unit + IL_0061: stloc.0 + IL_0062: leave.s IL_0064 + + .line 100001,100001 : 0,0 '' } // end handler - IL_005b: ldloc.0 - IL_005c: pop - IL_005d: ret + IL_0064: ldloc.0 + IL_0065: pop + IL_0066: ret } // end of method TestFunction3c::TestFunction3c } // end of class TestFunction3c diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3.il.bsl index c089467d2e8..355aed3bee6 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.1 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3 { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3 { - // Offset: 0x00000000 Length: 0x00000211 + // Offset: 0x00000000 Length: 0x000001FD } .mresource public FSharpOptimizationData.TestFunction3 { - // Offset: 0x00000218 Length: 0x00000088 + // Offset: 0x00000208 Length: 0x00000088 } .module TestFunction3.exe -// MVID: {4BEB2912-663A-8929-A745-03831229EB4B} +// MVID: {575BE191-663A-8929-A745-038391E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x006C0000 +// Image base: 0x003D0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -54,20 +54,20 @@ .method public static int32 TestFunction1() cil managed { // Code size 37 (0x25) - .maxstack 4 + .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -81,35 +81,35 @@ .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, [2] class [mscorlib]System.Exception V_2) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,23 + .line 12,12 : 8,23 '' IL_0008: ldstr "Hello" IL_000d: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0012: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0017: stloc.0 IL_0018: leave.s IL_0032 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { IL_001a: castclass [mscorlib]System.Exception IL_001f: stloc.2 - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0020: ldstr "World" IL_0025: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_002a: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_002f: stloc.0 IL_0030: leave.s IL_0032 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' } // end handler IL_0032: ldloc.0 IL_0033: pop @@ -125,7 +125,7 @@ { .entrypoint // Code size 2 (0x2) - .maxstack 2 + .maxstack 8 IL_0000: nop IL_0001: ret } // end of method $TestFunction3::main@ diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3b.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3b.il.bsl index 32c042aa5f8..08e21867c7a 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3b.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3b.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.1 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3b { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3b { - // Offset: 0x00000000 Length: 0x00000214 + // Offset: 0x00000000 Length: 0x00000200 } .mresource public FSharpOptimizationData.TestFunction3b { - // Offset: 0x00000218 Length: 0x0000008A + // Offset: 0x00000208 Length: 0x0000008A } .module TestFunction3b.exe -// MVID: {4BEB2917-A662-4FC9-A745-03831729EB4B} +// MVID: {575BE194-A662-4FC9-A745-038394E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x004B0000 +// Image base: 0x01040000 // =============== CLASS MEMBERS DECLARATION =================== @@ -54,20 +54,20 @@ .method public static int32 TestFunction1() cil managed { // Code size 37 (0x25) - .maxstack 4 + .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3b.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -76,27 +76,27 @@ .method public static void TestFunction3b() cil managed { - // Code size 64 (0x40) + // Code size 73 (0x49) .maxstack 3 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, [2] class [mscorlib]System.Exception V_2, [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_3) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3b::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,24 + .line 12,12 : 8,24 '' IL_0008: ldstr "hello" IL_000d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith(string) IL_0012: stloc.0 - IL_0013: leave.s IL_003d + IL_0013: leave.s IL_0046 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { @@ -112,20 +112,25 @@ IL_0027: br.s IL_003b - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0029: ldstr "World" IL_002e: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0033: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0038: stloc.0 - IL_0039: leave.s IL_003d + IL_0039: leave.s IL_0046 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_003b: rethrow - .line 100001,100001 : 0,0 + IL_003d: ldnull + IL_003e: unbox.any [FSharp.Core]Microsoft.FSharp.Core.Unit + IL_0043: stloc.0 + IL_0044: leave.s IL_0046 + + .line 100001,100001 : 0,0 '' } // end handler - IL_003d: ldloc.0 - IL_003e: pop - IL_003f: ret + IL_0046: ldloc.0 + IL_0047: pop + IL_0048: ret } // end of method TestFunction3b::TestFunction3b } // end of class TestFunction3b @@ -137,7 +142,7 @@ { .entrypoint // Code size 2 (0x2) - .maxstack 2 + .maxstack 8 IL_0000: nop IL_0001: ret } // end of method $TestFunction3b::main@ diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3c.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3c.il.bsl index d5d00bb5bd0..f9abc1cc34b 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3c.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction3c.il.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.1 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -13,7 +13,7 @@ .assembly extern FSharp.Core { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:0:0:0 + .ver 4:4:1:0 } .assembly TestFunction3c { @@ -22,27 +22,27 @@ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .mresource public FSharpSignatureData.TestFunction3c { - // Offset: 0x00000000 Length: 0x00000214 + // Offset: 0x00000000 Length: 0x00000200 } .mresource public FSharpOptimizationData.TestFunction3c { - // Offset: 0x00000218 Length: 0x0000008A + // Offset: 0x00000208 Length: 0x0000008A } .module TestFunction3c.exe -// MVID: {4BEB291C-A662-4FAC-A745-03831C29EB4B} +// MVID: {575BE197-A662-4FAC-A745-038397E15B57} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00460000 +// Image base: 0x00520000 // =============== CLASS MEMBERS DECLARATION =================== @@ -54,20 +54,20 @@ .method public static int32 TestFunction1() cil managed { // Code size 37 (0x25) - .maxstack 4 + .maxstack 8 .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 5,5 : 5,20 + .line 5,5 : 5,20 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction3c.fs' IL_0000: nop IL_0001: ldstr "Hello" IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0010: pop - .line 6,6 : 5,20 + .line 6,6 : 5,20 '' IL_0011: ldstr "World" IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_001b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0020: pop - .line 7,7 : 5,8 + .line 7,7 : 5,8 '' IL_0021: ldc.i4.3 IL_0022: ldc.i4.4 IL_0023: add @@ -76,7 +76,7 @@ .method public static void TestFunction3c() cil managed { - // Code size 94 (0x5e) + // Code size 103 (0x67) .maxstack 4 .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.Unit V_0, [1] int32 x, @@ -84,21 +84,21 @@ [3] class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1 V_3, [4] string msg, [5] string V_5) - .line 10,10 : 5,8 + .line 10,10 : 5,8 '' IL_0000: nop .try { IL_0001: nop - .line 11,11 : 8,31 + .line 11,11 : 8,31 '' IL_0002: call int32 TestFunction3c::TestFunction1() IL_0007: stloc.1 - .line 12,12 : 8,24 + .line 12,12 : 8,24 '' IL_0008: ldstr "hello" IL_000d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.Operators::FailWith(string) IL_0012: stloc.0 - IL_0013: leave.s IL_005b + IL_0013: leave.s IL_0064 - .line 13,13 : 5,9 + .line 13,13 : 5,9 '' } // end .try catch [mscorlib]System.Object { @@ -126,20 +126,25 @@ IL_003f: ldloc.3 IL_0040: call instance !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpOption`1::get_Value() IL_0045: stloc.s V_5 - .line 14,14 : 8,23 + .line 14,14 : 8,23 '' IL_0047: ldstr "World" IL_004c: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) IL_0051: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) IL_0056: stloc.0 - IL_0057: leave.s IL_005b + IL_0057: leave.s IL_0064 - .line 100001,100001 : 0,0 + .line 100001,100001 : 0,0 '' IL_0059: rethrow - .line 100001,100001 : 0,0 + IL_005b: ldnull + IL_005c: unbox.any [FSharp.Core]Microsoft.FSharp.Core.Unit + IL_0061: stloc.0 + IL_0062: leave.s IL_0064 + + .line 100001,100001 : 0,0 '' } // end handler - IL_005b: ldloc.0 - IL_005c: pop - IL_005d: ret + IL_0064: ldloc.0 + IL_0065: pop + IL_0066: ret } // end of method TestFunction3c::TestFunction3c } // end of class TestFunction3c @@ -151,7 +156,7 @@ { .entrypoint // Code size 2 (0x2) - .maxstack 2 + .maxstack 8 IL_0000: nop IL_0001: ret } // end of method $TestFunction3c::main@ From ab783a4f7da0ede099a9db4711391525a771b747 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 11 Jun 2016 14:00:54 +0100 Subject: [PATCH 258/334] update debug flags for 64-bit ngen --- src/update.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/update.cmd b/src/update.cmd index 74442338d1c..e59662cbf34 100644 --- a/src/update.cmd +++ b/src/update.cmd @@ -98,8 +98,8 @@ if /i not "%2"=="-ngen" goto :donengen "%NGEN32%" executeQueuedItems 1 if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( - "%NGEN64%" install "%BINDIR%\fsiAnyCpu.exe" /queue:1 - "%NGEN64%" install "%BINDIR%\FSharp.Build.dll" /queue:1 + "%NGEN64%" install "%BINDIR%\fsiAnyCpu.exe" %NGEN_FLAGS% /queue:1 + "%NGEN64%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 "%NGEN64%" executeQueuedItems 1 ) From 84e9c08c31cc462db9c3031fe7950e5b8310f895 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 13 Jun 2016 10:36:09 +0100 Subject: [PATCH 259/334] whitespace cleanup --- src/absil/bytes.fs | 52 ++++----- src/absil/ilbinary.fs | 266 +++++++++++++++++++++--------------------- src/absil/ilx.fs | 36 +++--- src/absil/ilx.fsi | 30 ++--- 4 files changed, 192 insertions(+), 192 deletions(-) diff --git a/src/absil/bytes.fs b/src/absil/bytes.fs index 87ea6c0c3c3..380d5f4f93f 100644 --- a/src/absil/bytes.fs +++ b/src/absil/bytes.fs @@ -33,26 +33,26 @@ module internal Bytes = Array.append (System.Text.Encoding.Unicode.GetBytes s) (ofInt32Array [| 0x0;0x0 |]) type internal ByteStream = - { bytes: byte[]; - mutable pos: int; + { bytes: byte[] + mutable pos: int max: int } member b.ReadByte() = - if b.pos >= b.max then failwith "end of stream"; + if b.pos >= b.max then failwith "end of stream" let res = b.bytes.[b.pos] - b.pos <- b.pos + 1; + b.pos <- b.pos + 1 res member b.ReadUtf8String n = let res = System.Text.Encoding.UTF8.GetString(b.bytes,b.pos,n) b.pos <- b.pos + n; res static member FromBytes (b:byte[],n,len) = - if n < 0 || (n+len) > b.Length then failwith "FromBytes"; + if n < 0 || (n+len) > b.Length then failwith "FromBytes" { bytes = b; pos = n; max = n+len } member b.ReadBytes n = - if b.pos + n > b.max then failwith "ReadBytes: end of stream"; + if b.pos + n > b.max then failwith "ReadBytes: end of stream" let res = Bytes.sub b.bytes b.pos n - b.pos <- b.pos + n; + b.pos <- b.pos + n res member b.Position = b.pos @@ -63,21 +63,21 @@ type internal ByteStream = type internal ByteBuffer = - { mutable bbArray: byte[]; + { mutable bbArray: byte[] mutable bbCurrent: int } member buf.Ensure newSize = let oldBufSize = buf.bbArray.Length if newSize > oldBufSize then let old = buf.bbArray - buf.bbArray <- Bytes.zeroCreate (max newSize (oldBufSize * 2)); - Bytes.blit old 0 buf.bbArray 0 buf.bbCurrent; + buf.bbArray <- Bytes.zeroCreate (max newSize (oldBufSize * 2)) + Bytes.blit old 0 buf.bbArray 0 buf.bbCurrent member buf.Close () = Bytes.sub buf.bbArray 0 buf.bbCurrent member buf.EmitIntAsByte (i:int) = let newSize = buf.bbCurrent + 1 - buf.Ensure newSize; + buf.Ensure newSize buf.bbArray.[buf.bbCurrent] <- byte i buf.bbCurrent <- newSize @@ -86,7 +86,7 @@ type internal ByteBuffer = member buf.EmitIntsAsBytes (arr:int[]) = let n = arr.Length let newSize = buf.bbCurrent + n - buf.Ensure newSize; + buf.Ensure newSize let bbarr = buf.bbArray let bbbase = buf.bbCurrent for i = 0 to n - 1 do @@ -94,29 +94,29 @@ type internal ByteBuffer = buf.bbCurrent <- newSize member bb.FixupInt32 pos n = - bb.bbArray.[pos] <- (Bytes.b0 n |> byte); - bb.bbArray.[pos + 1] <- (Bytes.b1 n |> byte); - bb.bbArray.[pos + 2] <- (Bytes.b2 n |> byte); - bb.bbArray.[pos + 3] <- (Bytes.b3 n |> byte); + bb.bbArray.[pos] <- (Bytes.b0 n |> byte) + bb.bbArray.[pos + 1] <- (Bytes.b1 n |> byte) + bb.bbArray.[pos + 2] <- (Bytes.b2 n |> byte) + bb.bbArray.[pos + 3] <- (Bytes.b3 n |> byte) member buf.EmitInt32 n = let newSize = buf.bbCurrent + 4 - buf.Ensure newSize; - buf.FixupInt32 buf.bbCurrent n; + buf.Ensure newSize + buf.FixupInt32 buf.bbCurrent n buf.bbCurrent <- newSize member buf.EmitBytes (i:byte[]) = let n = i.Length let newSize = buf.bbCurrent + n - buf.Ensure newSize; - Bytes.blit i 0 buf.bbArray buf.bbCurrent n; + buf.Ensure newSize + Bytes.blit i 0 buf.bbArray buf.bbCurrent n buf.bbCurrent <- newSize member buf.EmitInt32AsUInt16 n = let newSize = buf.bbCurrent + 2 - buf.Ensure newSize; - buf.bbArray.[buf.bbCurrent] <- (Bytes.b0 n |> byte); - buf.bbArray.[buf.bbCurrent + 1] <- (Bytes.b1 n |> byte); + buf.Ensure newSize + buf.bbArray.[buf.bbCurrent] <- (Bytes.b0 n |> byte) + buf.bbArray.[buf.bbCurrent + 1] <- (Bytes.b1 n |> byte) buf.bbCurrent <- newSize member buf.EmitBoolAsByte (b:bool) = buf.EmitIntAsByte (if b then 1 else 0) @@ -124,13 +124,13 @@ type internal ByteBuffer = member buf.EmitUInt16 (x:uint16) = buf.EmitInt32AsUInt16 (int32 x) member buf.EmitInt64 x = - buf.EmitInt32 (Bytes.dWw0 x); + buf.EmitInt32 (Bytes.dWw0 x) buf.EmitInt32 (Bytes.dWw1 x) member buf.Position = buf.bbCurrent static member Create sz = - { bbArray=Bytes.zeroCreate sz; - bbCurrent = 0; } + { bbArray=Bytes.zeroCreate sz + bbCurrent = 0 } diff --git a/src/absil/ilbinary.fs b/src/absil/ilbinary.fs index 59ceb7c1e2a..157a28f1807 100644 --- a/src/absil/ilbinary.fs +++ b/src/absil/ilbinary.fs @@ -69,20 +69,20 @@ module TableNames = // Metainfo -schema reports sorting as shown below. // But some sorting, e.g. EventMap does not seem to show let sortedTableInfo = - [ (TableNames.InterfaceImpl,0); - (TableNames.Constant, 1); - (TableNames.CustomAttribute, 0); - (TableNames.FieldMarshal, 0); - (TableNames.Permission, 1); - (TableNames.ClassLayout, 2); - (TableNames.FieldLayout, 1); - (TableNames.MethodSemantics, 2); - (TableNames.MethodImpl, 0); - (TableNames.ImplMap, 1); - (TableNames.FieldRVA, 1); - (TableNames.Nested, 0); - (TableNames.GenericParam, 2); - (TableNames.GenericParamConstraint, 0); ] + [ (TableNames.InterfaceImpl,0) + (TableNames.Constant, 1) + (TableNames.CustomAttribute, 0) + (TableNames.FieldMarshal, 0) + (TableNames.Permission, 1) + (TableNames.ClassLayout, 2) + (TableNames.FieldLayout, 1) + (TableNames.MethodSemantics, 2) + (TableNames.MethodImpl, 0) + (TableNames.ImplMap, 1) + (TableNames.FieldRVA, 1) + (TableNames.Nested, 0) + (TableNames.GenericParam, 2) + (TableNames.GenericParamConstraint, 0) ] [] type TypeDefOrRefTag(tag: int32) = member x.Tag = tag @@ -540,127 +540,127 @@ let i_ldelem_any = 0xa3 let i_stelem_any = 0xa4 let i_unbox_any = 0xa5 -let mk_ldc i = (((mkLdcInt32 (i)))) +let mk_ldc i = mkLdcInt32 i let noArgInstrs = - lazy [ i_ldc_i4_0, mk_ldc 0; - i_ldc_i4_1, mk_ldc 1; - i_ldc_i4_2, mk_ldc 2; - i_ldc_i4_3, mk_ldc 3; - i_ldc_i4_4, mk_ldc 4; - i_ldc_i4_5, mk_ldc 5; - i_ldc_i4_6, mk_ldc 6; - i_ldc_i4_7, mk_ldc 7; - i_ldc_i4_8, mk_ldc 8; - i_ldc_i4_m1, mk_ldc (0-1); - 0x0a, (mkStloc (uint16 ( 0))); - 0x0b, (mkStloc (uint16 ( 1))); - 0x0c, (mkStloc (uint16 ( 2))); - 0x0d, (mkStloc (uint16 ( 3))); - 0x06, (mkLdloc (uint16 ( 0))); - 0x07, (mkLdloc (uint16 ( 1))); - 0x08, (mkLdloc (uint16 ( 2))); - 0x09, (mkLdloc (uint16 ( 3))); - 0x02, (mkLdarg (uint16 ( 0))); - 0x03, (mkLdarg (uint16 ( 1))); - 0x04, (mkLdarg (uint16 ( 2))); - 0x05, (mkLdarg (uint16 ( 3))); - 0x2a, (I_ret); - 0x58, (AI_add); - 0xd6, (AI_add_ovf); - 0xd7, (AI_add_ovf_un); - 0x5f, (AI_and); - 0x5b, (AI_div); - 0x5c, (AI_div_un); - 0xfe01, (AI_ceq); - 0xfe02, (AI_cgt ); - 0xfe03, (AI_cgt_un); - 0xfe04, (AI_clt); - 0xfe05, (AI_clt_un); - 0x67, ((AI_conv DT_I1)); - 0x68, ((AI_conv DT_I2)); - 0x69, ((AI_conv DT_I4)); - 0x6a, ((AI_conv DT_I8)); - 0xd3, ((AI_conv DT_I)); - 0x6b, ((AI_conv DT_R4)); - 0x6c, ((AI_conv DT_R8)); - 0xd2, ((AI_conv DT_U1)); - 0xd1, ((AI_conv DT_U2)); - 0x6d, ((AI_conv DT_U4)); - 0x6e, ((AI_conv DT_U8)); - 0xe0, ((AI_conv DT_U)); - 0x76, ((AI_conv DT_R)); - 0xb3, ((AI_conv_ovf DT_I1)); - 0xb5, ((AI_conv_ovf DT_I2)); - 0xb7, ((AI_conv_ovf DT_I4)); - 0xb9, ((AI_conv_ovf DT_I8)); - 0xd4, ((AI_conv_ovf DT_I)); - 0xb4, ((AI_conv_ovf DT_U1)); - 0xb6, ((AI_conv_ovf DT_U2)); - 0xb8, ((AI_conv_ovf DT_U4)); - 0xba, ((AI_conv_ovf DT_U8)); - 0xd5, ((AI_conv_ovf DT_U)); - 0x82, ((AI_conv_ovf_un DT_I1)); - 0x83, ((AI_conv_ovf_un DT_I2)); - 0x84, ((AI_conv_ovf_un DT_I4)); - 0x85, ((AI_conv_ovf_un DT_I8)); - 0x8a, ((AI_conv_ovf_un DT_I)); - 0x86, ((AI_conv_ovf_un DT_U1)); - 0x87, ((AI_conv_ovf_un DT_U2)); - 0x88, ((AI_conv_ovf_un DT_U4)); - 0x89, ((AI_conv_ovf_un DT_U8)); - 0x8b, ((AI_conv_ovf_un DT_U)); - 0x9c, (I_stelem DT_I1); - 0x9d, (I_stelem DT_I2); - 0x9e, (I_stelem DT_I4); - 0x9f, (I_stelem DT_I8); - 0xa0, (I_stelem DT_R4); - 0xa1, (I_stelem DT_R8); - 0x9b, (I_stelem DT_I); - 0xa2, (I_stelem DT_REF); - 0x90, (I_ldelem DT_I1); - 0x92, (I_ldelem DT_I2); - 0x94, (I_ldelem DT_I4); - 0x96, (I_ldelem DT_I8); - 0x91, (I_ldelem DT_U1); - 0x93, (I_ldelem DT_U2); - 0x95, (I_ldelem DT_U4); - 0x98, (I_ldelem DT_R4); - 0x99, (I_ldelem DT_R8); - 0x97, (I_ldelem DT_I); - 0x9a, (I_ldelem DT_REF); - 0x5a, (AI_mul ); - 0xd8, (AI_mul_ovf); - 0xd9, (AI_mul_ovf_un); - 0x5d, (AI_rem ); - 0x5e, (AI_rem_un ); - 0x62, (AI_shl ); - 0x63, (AI_shr ); - 0x64, (AI_shr_un); - 0x59, (AI_sub ); - 0xda, (AI_sub_ovf); - 0xdb, (AI_sub_ovf_un); - 0x61, (AI_xor); - 0x60, (AI_or); - 0x65, (AI_neg); - 0x66, (AI_not); - i_ldnull, (AI_ldnull); - i_dup, (AI_dup); - i_pop, (AI_pop); - i_ckfinite, (AI_ckfinite); - i_nop, AI_nop; - i_break, I_break; - i_arglist, I_arglist; - i_endfilter, I_endfilter; - i_endfinally, I_endfinally; - i_refanytype, I_refanytype; - i_localloc, I_localloc; - i_throw, I_throw; - i_ldlen, I_ldlen; - i_rethrow, I_rethrow; ];; + lazy [ i_ldc_i4_0, mk_ldc 0 + i_ldc_i4_1, mk_ldc 1 + i_ldc_i4_2, mk_ldc 2 + i_ldc_i4_3, mk_ldc 3 + i_ldc_i4_4, mk_ldc 4 + i_ldc_i4_5, mk_ldc 5 + i_ldc_i4_6, mk_ldc 6 + i_ldc_i4_7, mk_ldc 7 + i_ldc_i4_8, mk_ldc 8 + i_ldc_i4_m1, mk_ldc -1 + 0x0a, mkStloc 0us + 0x0b, mkStloc 1us + 0x0c, mkStloc 2us + 0x0d, mkStloc 3us + 0x06, mkLdloc 0us + 0x07, mkLdloc 1us + 0x08, mkLdloc 2us + 0x09, mkLdloc 3us + 0x02, mkLdarg 0us + 0x03, mkLdarg 1us + 0x04, mkLdarg 2us + 0x05, mkLdarg 3us + 0x2a, I_ret + 0x58, AI_add + 0xd6, AI_add_ovf + 0xd7, AI_add_ovf_un + 0x5f, AI_and + 0x5b, AI_div + 0x5c, AI_div_un + 0xfe01, AI_ceq + 0xfe02, AI_cgt + 0xfe03, AI_cgt_un + 0xfe04, AI_clt + 0xfe05, AI_clt_un + 0x67, AI_conv DT_I1 + 0x68, AI_conv DT_I2 + 0x69, AI_conv DT_I4 + 0x6a, AI_conv DT_I8 + 0xd3, AI_conv DT_I + 0x6b, AI_conv DT_R4 + 0x6c, AI_conv DT_R8 + 0xd2, AI_conv DT_U1 + 0xd1, AI_conv DT_U2 + 0x6d, AI_conv DT_U4 + 0x6e, AI_conv DT_U8 + 0xe0, AI_conv DT_U + 0x76, AI_conv DT_R + 0xb3, AI_conv_ovf DT_I1 + 0xb5, AI_conv_ovf DT_I2 + 0xb7, AI_conv_ovf DT_I4 + 0xb9, AI_conv_ovf DT_I8 + 0xd4, AI_conv_ovf DT_I + 0xb4, AI_conv_ovf DT_U1 + 0xb6, AI_conv_ovf DT_U2 + 0xb8, AI_conv_ovf DT_U4 + 0xba, AI_conv_ovf DT_U8 + 0xd5, AI_conv_ovf DT_U + 0x82, AI_conv_ovf_un DT_I1 + 0x83, AI_conv_ovf_un DT_I2 + 0x84, AI_conv_ovf_un DT_I4 + 0x85, AI_conv_ovf_un DT_I8 + 0x8a, AI_conv_ovf_un DT_I + 0x86, AI_conv_ovf_un DT_U1 + 0x87, AI_conv_ovf_un DT_U2 + 0x88, AI_conv_ovf_un DT_U4 + 0x89, AI_conv_ovf_un DT_U8 + 0x8b, AI_conv_ovf_un DT_U + 0x9c, I_stelem DT_I1 + 0x9d, I_stelem DT_I2 + 0x9e, I_stelem DT_I4 + 0x9f, I_stelem DT_I8 + 0xa0, I_stelem DT_R4 + 0xa1, I_stelem DT_R8 + 0x9b, I_stelem DT_I + 0xa2, I_stelem DT_REF + 0x90, I_ldelem DT_I1 + 0x92, I_ldelem DT_I2 + 0x94, I_ldelem DT_I4 + 0x96, I_ldelem DT_I8 + 0x91, I_ldelem DT_U1 + 0x93, I_ldelem DT_U2 + 0x95, I_ldelem DT_U4 + 0x98, I_ldelem DT_R4 + 0x99, I_ldelem DT_R8 + 0x97, I_ldelem DT_I + 0x9a, I_ldelem DT_REF + 0x5a, AI_mul + 0xd8, AI_mul_ovf + 0xd9, AI_mul_ovf_un + 0x5d, AI_rem + 0x5e, AI_rem_un + 0x62, AI_shl + 0x63, AI_shr + 0x64, AI_shr_un + 0x59, AI_sub + 0xda, AI_sub_ovf + 0xdb, AI_sub_ovf_un + 0x61, AI_xor + 0x60, AI_or + 0x65, AI_neg + 0x66, AI_not + i_ldnull, AI_ldnull + i_dup, AI_dup + i_pop, AI_pop + i_ckfinite, AI_ckfinite + i_nop, AI_nop + i_break, I_break + i_arglist, I_arglist + i_endfilter, I_endfilter + i_endfinally, I_endfinally + i_refanytype, I_refanytype + i_localloc, I_localloc + i_throw, I_throw + i_ldlen, I_ldlen + i_rethrow, I_rethrow ] let isNoArgInstr i = match i with - | (AI_ldc (DT_I4, ILConst.I4 n)) when (-1) <= n && n <= 8 -> true + | AI_ldc (DT_I4, ILConst.I4 n) when -1 <= n && n <= 8 -> true | I_stloc n | I_ldloc n | I_ldarg n when n <= 3us -> true | I_ret | AI_add @@ -789,7 +789,7 @@ let ILCmpInstrRevMap = BI_brfalse , i_brfalse_s BI_brtrue , i_brtrue_s ]) -(* From corhdr.h *) +// From corhdr.h let nt_VOID = 0x1uy let nt_BOOLEAN = 0x2uy @@ -836,7 +836,7 @@ let nt_CUSTOMMARSHALER = 0x2Cuy let nt_ERROR = 0x2Duy let nt_MAX = 0x50uy -(* From c:/clrenv.i386/Crt/Inc/i386/hs.h *) +// From c:/clrenv.i386/Crt/Inc/i386/hs.h let vt_EMPTY = 0 let vt_NULL = 1 diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index a37c279ae11..efc5056aac6 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -28,8 +28,8 @@ type IlxUnionField(fd: ILFieldDef) = type IlxUnionAlternative = - { altName: string; - altFields: IlxUnionField[]; + { altName: string + altFields: IlxUnionField[] altCustomAttrs: ILAttributes } member x.FieldDefs = x.altFields @@ -85,14 +85,14 @@ let rec instLambdasAux n inst = function let instLambdas i t = instLambdasAux 0 i t type IlxClosureFreeVar = - { fvName: string ; - fvCompilerGenerated:bool; + { fvName: string + fvCompilerGenerated:bool fvType: ILType } let mkILFreeVar (name,compgen,ty) = - { fvName=name; - fvCompilerGenerated=compgen; - fvType=ty; } + { fvName=name + fvCompilerGenerated=compgen + fvType=ty } type IlxClosureRef = @@ -117,25 +117,25 @@ type IlxClosureSpec = // Define an extension of the IL algebra of type definitions type IlxClosureInfo = - { cloStructure: IlxClosureLambdas; - cloFreeVars: IlxClosureFreeVar[]; - cloCode: Lazy; + { cloStructure: IlxClosureLambdas + cloFreeVars: IlxClosureFreeVar[] + cloCode: Lazy cloSource: ILSourceMarker option} type IlxUnionInfo = { /// is the representation public? - cudReprAccess: ILMemberAccess; + cudReprAccess: ILMemberAccess /// are the representation public? - cudHelpersAccess: ILMemberAccess; + cudHelpersAccess: ILMemberAccess /// generate the helpers? - cudHasHelpers: IlxUnionHasHelpers; + cudHasHelpers: IlxUnionHasHelpers /// generate the helpers? - cudDebugProxies: bool; - cudDebugDisplayAttributes: ILAttribute list; - cudAlternatives: IlxUnionAlternative array; - cudNullPermitted: bool; + cudDebugProxies: bool + cudDebugDisplayAttributes: ILAttribute list + cudAlternatives: IlxUnionAlternative[] + cudNullPermitted: bool /// debug info for generated code for classunions - cudWhere: ILSourceMarker option; } + cudWhere: ILSourceMarker option } // -------------------------------------------------------------------- // Define these as extensions of the IL types diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index a158e4669b1..db96d9cdb4c 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -22,8 +22,8 @@ type IlxUnionField = member ILField : ILFieldDef type IlxUnionAlternative = - { altName: string; - altFields: IlxUnionField[]; + { altName: string + altFields: IlxUnionField[] altCustomAttrs: ILAttributes } member FieldDefs : IlxUnionField[] @@ -64,8 +64,8 @@ type IlxClosureLambdas = | Lambdas_return of ILType type IlxClosureFreeVar = - { fvName: string ; - fvCompilerGenerated:bool; + { fvName: string + fvCompilerGenerated:bool fvType: ILType } type IlxClosureRef = @@ -94,24 +94,24 @@ type IlxClosureApps = // -------------------------------------------------------------------- type IlxClosureInfo = - { cloStructure: IlxClosureLambdas; - cloFreeVars: IlxClosureFreeVar[]; - cloCode: Lazy; + { cloStructure: IlxClosureLambdas + cloFreeVars: IlxClosureFreeVar[] + cloCode: Lazy cloSource: ILSourceMarker option} type IlxUnionInfo = { /// Is the representation public? - cudReprAccess: ILMemberAccess; + cudReprAccess: ILMemberAccess /// Are the representation helpers public? - cudHelpersAccess: ILMemberAccess; + cudHelpersAccess: ILMemberAccess /// Generate the helpers? - cudHasHelpers: IlxUnionHasHelpers; - cudDebugProxies: bool; - cudDebugDisplayAttributes: ILAttribute list; - cudAlternatives: IlxUnionAlternative[]; - cudNullPermitted: bool; + cudHasHelpers: IlxUnionHasHelpers + cudDebugProxies: bool + cudDebugDisplayAttributes: ILAttribute list + cudAlternatives: IlxUnionAlternative[] + cudNullPermitted: bool /// Debug info for generated code for classunions. - cudWhere: ILSourceMarker option; + cudWhere: ILSourceMarker option } // -------------------------------------------------------------------- From a095928f81656ab3da6b33cf143f679f5d8a8dde Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 13 Jun 2016 15:01:56 +0100 Subject: [PATCH 260/334] whitespace --- src/ilx/EraseUnions.fs | 243 +++++++++++++++++++--------------------- src/ilx/EraseUnions.fsi | 19 ++++ 2 files changed, 134 insertions(+), 128 deletions(-) diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index c27e17db5ca..fac033126f9 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -10,13 +10,13 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.EraseUnions open System.Collections.Generic open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX +open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types open Microsoft.FSharp.Compiler.AbstractIL.Morphs -open Microsoft.FSharp.Compiler.AbstractIL.IL -open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types -open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library [] let TagNil = 0 @@ -290,7 +290,7 @@ let mkCeqThen after = let mkTagDiscriminate ilg cuspec _baseTy cidx = mkGetTag ilg cuspec - @ [ mkLdcInt32 cidx; + @ [ mkLdcInt32 cidx AI_ceq ] let mkTagDiscriminateThen ilg cuspec cidx after = @@ -463,7 +463,7 @@ let emitLdDataTagPrim ilg ldOpt (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxU let altName = alt.Name let altTy = tyForAlt cuspec alt mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy test - cg.EmitInstrs (ld :: testBlock); + cg.EmitInstrs (ld :: testBlock) cg.SetMarkToHere internalLab cg.EmitInstrs [mkLdcInt32 cidx; I_br (cg.CodeLabel outlab) ] cg.SetMarkToHere failLab @@ -485,7 +485,7 @@ let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = if canfail then let outlab = cg.GenerateDelayMark () let internal1 = cg.GenerateDelayMark () - cg.EmitInstrs [AI_dup; I_brcmp (BI_brfalse, cg.CodeLabel outlab) ]; + cg.EmitInstrs [AI_dup; I_brcmp (BI_brfalse, cg.CodeLabel outlab) ] cg.SetMarkToHere internal1 cg.EmitInstrs [mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ] cg.SetMarkToHere outlab @@ -511,7 +511,6 @@ let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases) = let altName = alt.Name let failLab = cg.GenerateDelayMark () let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) - cg.EmitInstr (mkLdloc locn) let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg) @@ -543,7 +542,7 @@ let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases) = | SingleCase -> match cases with | [(0,tg)] -> cg.EmitInstrs [ AI_pop; I_br tg ] - | [] -> cg.EmitInstrs [ AI_pop; ] + | [] -> cg.EmitInstrs [ AI_pop ] | _ -> failwith "unexpected: strange switch on single-case unions should not be present" | TailOrNull -> @@ -569,32 +568,28 @@ let mkMethodsAndPropertiesForFields ilg access attr hasHelpers (typ: ILType) (fi let basicProps = fields |> Array.map (fun field -> - { Name=adjustFieldName hasHelpers field.Name; - IsRTSpecialName=false; - IsSpecialName=false; - SetMethod=None; - GetMethod = Some (mkILMethRef (typ.TypeRef, ILCallingConv.Instance, "get_" + adjustFieldName hasHelpers field.Name, 0, [], field.Type)); - CallingConv=ILThisConvention.Instance; - Type=field.Type; - Init=None; - Args=mkILTypes []; - CustomAttrs= field.ILField.CustomAttrs; } + { Name=adjustFieldName hasHelpers field.Name + IsRTSpecialName=false + IsSpecialName=false + SetMethod=None + GetMethod = Some (mkILMethRef (typ.TypeRef, ILCallingConv.Instance, "get_" + adjustFieldName hasHelpers field.Name, 0, [], field.Type)) + CallingConv=ILThisConvention.Instance + Type=field.Type + Init=None + Args=mkILTypes [] + CustomAttrs= field.ILField.CustomAttrs } |> addPropertyGeneratedAttrs ilg ) |> Array.toList let basicMethods = - [ for field in fields do let fspec = mkILFieldSpecInTy(typ,field.LowerName,field.Type) yield mkILNonGenericInstanceMethod ("get_" + adjustFieldName hasHelpers field.Name, access, [], mkILReturn field.Type, - mkMethodBody(true,emptyILLocals,2, - nonBranchingInstrsToCode - [ mkLdarg 0us; - mkNormalLdfld fspec ], attr)) + mkMethodBody(true,emptyILLocals,2,nonBranchingInstrsToCode [ mkLdarg 0us; mkNormalLdfld fspec ], attr)) |> addMethodGeneratedAttrs ilg ] basicProps, basicMethods @@ -658,16 +653,16 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a mkMethodBody(true,emptyILLocals,2,nonBranchingInstrsToCode ([ mkLdarg0 ] @ mkIsData ilg (true, cuspec, num)), attr)) |> addMethodGeneratedAttrs ilg ], - [ { Name=mkTesterName altName; - IsRTSpecialName=false; - IsSpecialName=false; - SetMethod=None; - GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Instance, "get_" + mkTesterName altName, 0, [], ilg.typ_bool)); - CallingConv=ILThisConvention.Instance; - Type=ilg.typ_bool; - Init=None; - Args=mkILTypes []; - CustomAttrs=emptyILCustomAttrs; } + [ { Name=mkTesterName altName + IsRTSpecialName=false + IsSpecialName=false + SetMethod=None + GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Instance, "get_" + mkTesterName altName, 0, [], ilg.typ_bool)) + CallingConv=ILThisConvention.Instance + Type=ilg.typ_bool + Init=None + Args=mkILTypes [] + CustomAttrs=emptyILCustomAttrs } |> addPropertyGeneratedAttrs ilg |> addPropertyNeverAttrs ilg ] @@ -687,16 +682,16 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a let nullaryProp = - { Name=altName; - IsRTSpecialName=false; - IsSpecialName=false; - SetMethod=None; - GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Static, "get_" + altName, 0, [], baseTy)); - CallingConv=ILThisConvention.Static; - Type=baseTy; - Init=None; - Args=mkILTypes []; - CustomAttrs=emptyILCustomAttrs; } + { Name=altName + IsRTSpecialName=false + IsSpecialName=false + SetMethod=None + GetMethod = Some (mkILMethRef (baseTy.TypeRef, ILCallingConv.Static, "get_" + altName, 0, [], baseTy)) + CallingConv=ILThisConvention.Static + Type=baseTy + Init=None + Args=mkILTypes [] + CustomAttrs=emptyILCustomAttrs } |> addPropertyGeneratedAttrs ilg |> addPropertyNeverAttrs ilg @@ -732,7 +727,6 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a let basic = mkHiddenGeneratedStaticFieldDef ilg (constFieldName altName, baseTy, None, None, ILMemberAccess.Assembly) let uniqObjField = { basic with IsInitOnly=true } let inRootClass = cuspecRepr.OptimizeAlternativeToRootClass (cuspec,alt) - [ (info,alt, altTy,num,uniqObjField,inRootClass) ] else [] @@ -760,8 +754,8 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a [ yield mkLdarg0 yield mkNormalCall (mkILCtorMethSpecForTy (ilg.typ_Object,[])) yield mkLdarg0 - yield mkLdarg 1us; - yield mkNormalStfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)); ],None)) + yield mkLdarg 1us + yield mkNormalStfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)) ],None)) |> addMethodGeneratedAttrs ilg @@ -775,27 +769,28 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a mkILReturn field.Type, mkMethodBody(true,emptyILLocals,2, nonBranchingInstrsToCode - [ mkLdarg0; - mkNormalLdfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)); - mkNormalLdfld (mkILFieldSpecInTy(altTy,fldName,fldTy));],None)) + [ mkLdarg0 + mkNormalLdfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)) + mkNormalLdfld (mkILFieldSpecInTy(altTy,fldName,fldTy))],None)) |> addMethodGeneratedAttrs ilg) |> Array.toList let debugProxyGetterProps = fields |> Array.map (fun fdef -> - { Name=fdef.Name; - IsRTSpecialName=false; - IsSpecialName=false; - SetMethod=None; - GetMethod=Some(mkILMethRef(debugProxyTy.TypeRef,ILCallingConv.Instance,"get_" + fdef.Name,0,[],fdef.Type)); - CallingConv=ILThisConvention.Instance; - Type=fdef.Type; - Init=None; - Args=mkILTypes []; - CustomAttrs= fdef.ILField.CustomAttrs; } + { Name=fdef.Name + IsRTSpecialName=false + IsSpecialName=false + SetMethod=None + GetMethod=Some(mkILMethRef(debugProxyTy.TypeRef,ILCallingConv.Instance,"get_" + fdef.Name,0,[],fdef.Type)) + CallingConv=ILThisConvention.Instance + Type=fdef.Type + Init=None + Args=mkILTypes [] + CustomAttrs= fdef.ILField.CustomAttrs } |> addPropertyGeneratedAttrs ilg) |> Array.toList + let debugProxyTypeDef = mkILGenericClass (debugProxyTypeName, ILTypeDefAccess.Nested ILMemberAccess.Assembly, @@ -808,6 +803,7 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a emptyILEvents, emptyILCustomAttrs, ILTypeInit.BeforeField) + [ { debugProxyTypeDef with IsSpecialName=true } ], ( [ilg.mkDebuggerTypeProxyAttribute debugProxyTy] @ cud.cudDebugDisplayAttributes) @@ -855,8 +851,8 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a emptyILEvents, mkILCustomAttrs debugAttrs, ILTypeInit.BeforeField) - { altTypeDef with IsSerializable=td.IsSerializable; - IsSpecialName=true } + + { altTypeDef with IsSerializable=td.IsSerializable; IsSpecialName=true } [ altTypeDef ], altDebugTypeDefs @@ -942,13 +938,13 @@ let mkClassUnionDef ilg tref td cud = | SingleCase | RuntimeTypes | TailOrNull -> - yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])); + yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])) | IntegerTag -> if inRootClass then yield mkLdcInt32 fidx yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[mkTagFieldType ilg cuspec] )) else - yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])); + yield mkNormalNewobj (mkILCtorMethSpecForTy (altTy,[])) yield mkNormalStsfld constFieldSpec ] cud.cudWhere cd @@ -975,16 +971,16 @@ let mkClassUnionDef ilg tref td cud = [ mkILNonGenericInstanceMethod("get_" + tagPropertyName,cud.cudHelpersAccess,[],mkILReturn tagFieldType,body) |> addMethodGeneratedAttrs ilg ], - [ { Name=tagPropertyName; - IsRTSpecialName=false; - IsSpecialName=false; - SetMethod=None; - GetMethod=Some(mkILMethRef(baseTy.TypeRef,ILCallingConv.Instance,"get_" + tagPropertyName,0,[], tagFieldType)); - CallingConv=ILThisConvention.Instance; - Type=tagFieldType; - Init=None; - Args=mkILTypes []; - CustomAttrs=emptyILCustomAttrs; } + [ { Name=tagPropertyName + IsRTSpecialName=false + IsSpecialName=false + SetMethod=None + GetMethod=Some(mkILMethRef(baseTy.TypeRef,ILCallingConv.Instance,"get_" + tagPropertyName,0,[], tagFieldType)) + CallingConv=ILThisConvention.Instance + Type=tagFieldType + Init=None + Args=mkILTypes [] + CustomAttrs=emptyILCustomAttrs } |> addPropertyGeneratedAttrs ilg |> addPropertyNeverAttrs ilg ] @@ -1003,63 +999,54 @@ let mkClassUnionDef ilg tref td cud = None else Some - { Name = "Tags"; - NestedTypes = emptyILTypeDefs; - GenericParams= td.GenericParams; - Access = ILTypeDefAccess.Nested cud.cudReprAccess; - IsAbstract = true; - IsSealed = true; - IsSerializable=false; - IsComInterop=false; - Layout=ILTypeDefLayout.Auto; - IsSpecialName=false; - Encoding=ILDefaultPInvokeEncoding.Ansi; - Implements = mkILTypes []; - Extends= Some ilg.typ_Object ; - Methods= emptyILMethods; - SecurityDecls=emptyILSecurityDecls; - HasSecurity=false; - Fields=mkILFields tagEnumFields; - MethodImpls=emptyILMethodImpls; - InitSemantics=ILTypeInit.OnAny; - Events=emptyILEvents; - Properties=emptyILProperties; - CustomAttrs= emptyILCustomAttrs; - tdKind = ILTypeDefKind.Enum; } + { Name = "Tags" + NestedTypes = emptyILTypeDefs + GenericParams= td.GenericParams + Access = ILTypeDefAccess.Nested cud.cudReprAccess + IsAbstract = true + IsSealed = true + IsSerializable=false + IsComInterop=false + Layout=ILTypeDefLayout.Auto + IsSpecialName=false + Encoding=ILDefaultPInvokeEncoding.Ansi + Implements = mkILTypes [] + Extends= Some ilg.typ_Object + Methods= emptyILMethods + SecurityDecls=emptyILSecurityDecls + HasSecurity=false + Fields=mkILFields tagEnumFields + MethodImpls=emptyILMethodImpls + InitSemantics=ILTypeInit.OnAny + Events=emptyILEvents + Properties=emptyILProperties + CustomAttrs= emptyILCustomAttrs + tdKind = ILTypeDefKind.Enum } let baseTypeDef = - { Name = td.Name; - NestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ - altTypeDefs @ - altDebugTypeDefs @ - td.NestedTypes.AsList); - GenericParams= td.GenericParams; - Access = td.Access; - IsAbstract = isAbstract; - IsSealed = altTypeDefs.IsEmpty; - IsSerializable=td.IsSerializable; - IsComInterop=false; - Layout=td.Layout; - IsSpecialName=td.IsSpecialName; - Encoding=td.Encoding ; - Implements = td.Implements; - Extends= (match td.Extends with None -> Some ilg.typ_Object | _ -> td.Extends) ; - Methods= mkILMethods (ctorMeths @ - baseMethsFromAlt @ - selfMeths @ - tagMeths @ - altUniqObjMeths @ - existingMeths); - - SecurityDecls=td.SecurityDecls; - HasSecurity=td.HasSecurity; - Fields=mkILFields (selfAndTagFields @ List.map (fun (_,_,_,_,fdef,_) -> fdef) altNullaryFields @ td.Fields.AsList); - MethodImpls=td.MethodImpls; - InitSemantics=ILTypeInit.BeforeField; - Events=td.Events; - Properties=mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps); - CustomAttrs=td.CustomAttrs; - tdKind = ILTypeDefKind.Class; } + { Name = td.Name + NestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ td.NestedTypes.AsList) + GenericParams= td.GenericParams + Access = td.Access + IsAbstract = isAbstract + IsSealed = altTypeDefs.IsEmpty + IsSerializable=td.IsSerializable + IsComInterop=false + Layout=td.Layout + IsSpecialName=td.IsSpecialName + Encoding=td.Encoding + Implements = td.Implements + Extends= (match td.Extends with None -> Some ilg.typ_Object | _ -> td.Extends) + Methods= mkILMethods (ctorMeths @ baseMethsFromAlt @ selfMeths @ tagMeths @ altUniqObjMeths @ existingMeths) + SecurityDecls=td.SecurityDecls + HasSecurity=td.HasSecurity + Fields=mkILFields (selfAndTagFields @ List.map (fun (_,_,_,_,fdef,_) -> fdef) altNullaryFields @ td.Fields.AsList) + MethodImpls=td.MethodImpls + InitSemantics=ILTypeInit.BeforeField + Events=td.Events + Properties=mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps) + CustomAttrs=td.CustomAttrs + tdKind = ILTypeDefKind.Class } // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index 8a411b6efdf..09d5e41e29d 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -9,14 +9,28 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.EraseUnions open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types +/// Make the instruction sequence for an ILX "newdata" instruction val mkNewData : ILGlobals -> IlxUnionSpec * int -> ILInstr list + +/// Make the instruction sequence for an ILX "isdata" instruction val mkIsData : ILGlobals -> bool * IlxUnionSpec * int -> ILInstr list + +/// Make the instruction sequence for an ILX "lddata" instruction val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list + +/// Make the instruction sequence for an ILX "stdata" instruction val mkStData : IlxUnionSpec * int * int -> ILInstr list + +/// Make the instruction sequence for an ILX "brisnotdata" instruction val mkBrIsNotData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel -> ILInstr list + +/// Make the type definition for a union type val mkClassUnionDef : ILGlobals -> ILTypeRef -> ILTypeDef -> IlxUnionInfo -> ILTypeDef + +/// Make the IL type for a union type alternative val GetILTypeForAlternative : IlxUnionSpec -> int -> ILType +/// Used to emit instructions (an interface to the IlxGen.fs code generator) type ICodeGen<'Mark> = abstract CodeLabel: 'Mark -> ILCodeLabel abstract GenerateDelayMark: unit -> 'Mark @@ -25,6 +39,11 @@ type ICodeGen<'Mark> = abstract EmitInstr : ILInstr -> unit abstract EmitInstrs : ILInstr list -> unit +/// Emit the instruction sequence for an ILX "castdata" instruction val emitCastData : ILGlobals -> ICodeGen<'Mark> -> canfail: bool * IlxUnionSpec * int -> unit + +/// Emit the instruction sequence for an ILX "lddatatag" instruction val emitLdDataTag : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec -> unit + +/// Emit the instruction sequence for an ILX "switchdata" instruction val emitDataSwitch : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list -> unit From 87fc720610022412c07d265d345ceb60d427e6ad Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Mon, 13 Jun 2016 19:04:19 +0300 Subject: [PATCH 261/334] change tests from member of class to value of function --- .../Imported/CallerInfo/CallerMemberName.fs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index 9814a5b045d..59c8b98e3ed 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -16,8 +16,6 @@ type MyTy() = let typeLetFuncNested () = let nestedFunc () = MyTy.GetCallerMemberName() nestedFunc () - let anonymousLambda = (fun () -> MyTy.GetCallerMemberName()) () - let asyncVal = async { return MyTy.GetCallerMemberName() } |> Async.RunSynchronously do MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), "primary ctor") @@ -47,8 +45,6 @@ type MyTy() = |> List.head MyTy.Check(result, Some("CheckMembers"), "lambda") MyTy.Check(functionVal (), Some("functionVal"), "functionVal") - MyTy.Check(anonymousLambda, Some("anonymousLambda"), "anonymousLambda") - MyTy.Check(asyncVal, Some("asyncVal"), "asyncVal") () static member GetCallerMemberName([] ?memberName : string) = @@ -165,4 +161,9 @@ module Program = let obj1 = { new MyAbstractTy() with member x.MyAbstractMethod() = MyTy.GetCallerMemberName() } MyTy.Check(obj1.MyAbstractMethod(), Some("MyAbstractMethod"), "MyAbstractMethod") + let asyncVal = async { return MyTy.GetCallerMemberName() } |> Async.RunSynchronously + MyTy.Check(asyncVal, Some("main"), "asyncVal") + + let anonymousLambda = fun () -> MyTy.GetCallerMemberName() + MyTy.Check(anonymousLambda(), Some("main"), "anonymousLambda") 0 \ No newline at end of file From d7064b21afb3f5d0087a14feef3d1a17cb3df57f Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Mon, 13 Jun 2016 19:19:37 +0300 Subject: [PATCH 262/334] add delegate test improve description --- .../Imported/CallerInfo/CallerMemberName.fs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index 59c8b98e3ed..c23e6a0f4ff 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -1,5 +1,6 @@ namespace Test +open System open System.Runtime.CompilerServices open System.Reflection open CSharpLib @@ -156,14 +157,17 @@ module Program = let obj = { new IMyInterface with member this.MyInterfaceMethod() = MyTy.GetCallerMemberName() } - MyTy.Check(obj.MyInterfaceMethod(), Some("MyInterfaceMethod"), "MyInterfaceMethod") + MyTy.Check(obj.MyInterfaceMethod(), Some("MyInterfaceMethod"), "Object expression from interface") let obj1 = { new MyAbstractTy() with member x.MyAbstractMethod() = MyTy.GetCallerMemberName() } - MyTy.Check(obj1.MyAbstractMethod(), Some("MyAbstractMethod"), "MyAbstractMethod") + MyTy.Check(obj1.MyAbstractMethod(), Some("MyAbstractMethod"), "Object expression from abstract type") let asyncVal = async { return MyTy.GetCallerMemberName() } |> Async.RunSynchronously - MyTy.Check(asyncVal, Some("main"), "asyncVal") + MyTy.Check(asyncVal, Some("main"), "Async computation expression value") let anonymousLambda = fun () -> MyTy.GetCallerMemberName() - MyTy.Check(anonymousLambda(), Some("main"), "anonymousLambda") + MyTy.Check(anonymousLambda(), Some("main"), "Anonymous lambda") + + let delegateVal = new Func(fun () -> MyTy.GetCallerMemberName()) + MyTy.Check(delegateVal.Invoke(), Some("main"), "Delegate value") 0 \ No newline at end of file From 37bf5b0c30186ce2fc8a2eadf547c3d6ec6c6e36 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Mon, 13 Jun 2016 20:20:19 +0300 Subject: [PATCH 263/334] add static do tests --- .../Imported/CallerInfo/CallerMemberName.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs index c23e6a0f4ff..b9bb974c8bd 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerMemberName.fs @@ -19,6 +19,8 @@ type MyTy() = nestedFunc () do MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), "primary ctor") + static do + MyTy.Check(MyTy.GetCallerMemberName(), Some(".cctor"), "static ctor") new(i : int) = MyTy.Check(MyTy.GetCallerMemberName(), Some(".ctor"), ".NET ctor") From 2a10e222d316f804a59e2d7561bbdfcbdb76ea12 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Mon, 13 Jun 2016 14:20:38 -0700 Subject: [PATCH 264/334] Renaming insertion packages to vsix/msi --- setup/Swix/FSharp.SDK/Files.swr | 2 +- setup/Swix/VisualFSharpVSIX/CommonFiles.swr | 2 +- setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr | 2 +- setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr | 2 +- setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/setup/Swix/FSharp.SDK/Files.swr b/setup/Swix/FSharp.SDK/Files.swr index d684f9c41d7..9b9e952323b 100644 --- a/setup/Swix/FSharp.SDK/Files.swr +++ b/setup/Swix/FSharp.SDK/Files.swr @@ -1,6 +1,6 @@ use vs -package name=Microsoft.FSharp +package name=Microsoft.FSharp.Msi version=4.1 vs.package.type=msi vs.package.chip=neutral diff --git a/setup/Swix/VisualFSharpVSIX/CommonFiles.swr b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr index c93fee58402..ad2d8414de4 100644 --- a/setup/Swix/VisualFSharpVSIX/CommonFiles.swr +++ b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr @@ -1,6 +1,6 @@ use vs -package name=Microsoft.FSharp +package name=Microsoft.FSharp.Vsix version=4.1 vs.package.chip=neutral vs.package.language=en-us diff --git a/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr index b9e8b64e4f3..5698eec644f 100644 --- a/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr @@ -1,6 +1,6 @@ use vs -package name=Microsoft.FSharp +package name=Microsoft.FSharp.Vsix version=4.1 vs.package.chip=neutral vs.package.language=en-us diff --git a/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr index 7904a7fe9b3..48fad4c8a05 100644 --- a/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr @@ -1,6 +1,6 @@ use vs -package name=Microsoft.FSharp +package name=Microsoft.FSharp.Vsix version=4.1 vs.package.chip=neutral vs.package.language=en-us diff --git a/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr index d3461ee036e..7fa638c78ee 100644 --- a/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr @@ -1,6 +1,6 @@ use vs -package name=Microsoft.FSharp +package name=Microsoft.FSharp.Vsix version=4.1 vs.package.chip=neutral vs.package.language=en-us From d441be581c04ffe31b2ac29693d5627c8a39eba1 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Tue, 14 Jun 2016 15:38:43 -0700 Subject: [PATCH 265/334] Fix templates imports --- .../VisualFSharpVSIX/DesktopTemplates.swr | 18 ++++++------ .../ProfessionalTemplates.swr | 28 +++++++++---------- .../WebDevelopmentTemplates.swr | 18 ++++++------ 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr index 5698eec644f..3e3beb3fdfc 100644 --- a/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/DesktopTemplates.swr @@ -10,45 +10,45 @@ vs.localizedResources title="Visual F# Tools" description="Deploy Visual F# Tools templates to Visual Studio" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\AppConfig" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\CodeFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\ScriptFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\SignatureFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\TextFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\XMLFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" - folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\ConsoleProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\ConsoleProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\Program.fs" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\LibraryProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\TutorialProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" diff --git a/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr index 48fad4c8a05..e0e8a0e1e34 100644 --- a/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/ProfessionalTemplates.swr @@ -10,80 +10,80 @@ vs.localizedResources title="Visual F# Tools" description="Deploy Visual F# Tools templates to Visual Studio" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\AppConfig" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\CodeFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\ScriptFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\SignatureFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\TextFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\XMLFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" - folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\ConsoleProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\ConsoleProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\Program.fs" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\LibraryProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCore259Project" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\NetCore259Project" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\NETCore259PortableLibrary.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCore78Project" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\NetCore78Project" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\NETCore78PortableLibrary.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\NetCoreProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\NetCoreProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\NETCore7PortableLibrary.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\PortableLibraryProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\PortableLibraryProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\SilverlightProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\SilverlightProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Script.fsx" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\TutorialProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" diff --git a/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr index 7fa638c78ee..ef2bc075cc4 100644 --- a/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr +++ b/setup/Swix/VisualFSharpVSIX/WebDevelopmentTemplates.swr @@ -10,45 +10,45 @@ vs.localizedResources title="Visual F# Tools" description="Deploy Visual F# Tools templates to Visual Studio" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\AppConfig" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\AppConfig" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\App.config" file source="$(BinariesFolder)\net40\bin\ItemTemplates\AppConfig\AppConfig.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\CodeFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\CodeFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\CodeFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\CodeFile\File.fs" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\ScriptFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\ScriptFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\File.fsx" file source="$(BinariesFolder)\net40\bin\ItemTemplates\ScriptFile\ScriptFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\SignatureFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\SignatureFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\File.fsi" file source="$(BinariesFolder)\net40\bin\ItemTemplates\SignatureFile\SignatureFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\TextFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\TextFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.txt" file source="$(BinariesFolder)\net40\bin\ItemTemplates\TextFile\TextFile.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ItemTemplates\XMLFile" +folder "InstallDir:Common7\IDE\ItemTemplates\FSharp\XMLFile" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.vstemplate" file source="$(BinariesFolder)\net40\bin\ItemTemplates\XMLFile\XMLFile.xml" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\LibraryProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\LibraryProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Script.fsx" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\SilverlightProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\SilverlightProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\AssemblyInfo.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Library1.fs" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\Script.fsx" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\SilverlightProject\SilverlightLibrary.vstemplate" -folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\TutorialProject" +folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\TutorialProject" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsx" file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate" From ba3fee7652c02512872e6e80f4d7c6b6767b15f8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 15 Jun 2016 20:28:25 +0100 Subject: [PATCH 266/334] struct unions --- VisualFSharp.sln | 86 +---- src/absil/il.fs | 2 + src/absil/il.fsi | 2 + src/absil/ilprint.fs | 4 +- src/absil/ilwrite.fs | 2 +- src/absil/ilx.fs | 13 +- src/absil/ilx.fsi | 3 +- src/fsharp/AugmentWithHashCompare.fs | 294 ++++++++++-------- src/fsharp/ConstraintSolver.fs | 14 +- src/fsharp/FSComp.txt | 3 +- .../FSharp.Core/DiscrimantedUnionType.fs | 134 +++++++- src/fsharp/IlxGen.fs | 52 +++- src/fsharp/NameResolution.fs | 2 +- src/fsharp/Optimizer.fs | 4 +- src/fsharp/PatternMatchCompilation.fs | 39 ++- src/fsharp/PostInferenceChecks.fs | 25 +- src/fsharp/QuotationTranslator.fs | 3 + src/fsharp/TastOps.fs | 127 +++++--- src/fsharp/TastOps.fsi | 33 +- src/fsharp/TastPickle.fs | 4 + src/fsharp/TypeChecker.fs | 98 +++--- src/fsharp/infos.fs | 2 +- src/fsharp/tast.fs | 37 ++- src/ilx/EraseUnions.fs | 200 ++++++------ src/ilx/EraseUnions.fsi | 21 +- tests/fsharp/typecheck/sigs/neg95.bsl | 6 +- tests/fsharp/typecheck/sigs/neg95.fs | 6 + 27 files changed, 753 insertions(+), 463 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index 6224d843be1..002dbd63f6b 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler", "src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject @@ -120,7 +120,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\It EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpVsix", "vsintegration\VisualFSharpVsix\VisualFSharpVsix.csproj", "{E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A83A9A70-8C33-4253-BF6F-3AADB509F21C}" + ProjectSection(SolutionItems) = preProject + Performance1.psess = Performance1.psess + EndProjectSection +EndProject Global + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 @@ -130,54 +138,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.Build.0 = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -502,18 +462,6 @@ Global {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.ActiveCfg = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.Build.0 = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.ActiveCfg = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.Build.0 = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.Build.0 = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.ActiveCfg = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.Build.0 = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.Build.0 = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.ActiveCfg = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.Build.0 = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -753,14 +701,6 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|Any CPU.Build.0 = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.ActiveCfg = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.Build.0 = Release|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.Build.0 = VSRelease|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -773,14 +713,6 @@ Global {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|Any CPU.Build.0 = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.ActiveCfg = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.Build.0 = Release|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.Build.0 = VSRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/absil/il.fs b/src/absil/il.fs index 8287cfb3aa1..5a0cdee0b60 100755 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -2063,6 +2063,8 @@ let mkILFormalGenericArgs (gparams:ILGenericParameterDefs) = let mkILFormalBoxedTy tref gparams = mkILBoxedTy tref (mkILFormalGenericArgs gparams) +let mkILFormalNamedTy bx tref gparams = mkILNamedTy bx tref (mkILFormalGenericArgs gparams) + // -------------------------------------------------------------------- // Operations on class etc. defs. // -------------------------------------------------------------------- diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 4a81afa084f..147f5baf987 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -1676,6 +1676,7 @@ val mkILTySpecRaw: ILTypeRef * ILGenericArgs -> ILTypeSpec /// Make types. val mkILTy: ILBoxity -> ILTypeSpec -> ILType val mkILNamedTy: ILBoxity -> ILTypeRef -> ILGenericArgsList -> ILType +val mkILNamedTyRaw: ILBoxity -> ILTypeRef -> ILGenericArgs -> ILType val mkILBoxedTy: ILTypeRef -> ILGenericArgsList -> ILType val mkILBoxedTyRaw: ILTypeRef -> ILGenericArgs -> ILType val mkILValueTy: ILTypeRef -> ILGenericArgsList -> ILType @@ -1727,6 +1728,7 @@ val mkILCallSig: ILCallingConv * ILType list * ILType -> ILCallingSignature /// Make generalized verions of possibly-generic types, /// e.g. Given the ILTypeDef for List, return the type "List". val mkILFormalBoxedTy: ILTypeRef -> ILGenericParameterDef list -> ILType +val mkILFormalNamedTy: ILBoxity -> ILTypeRef -> ILGenericParameterDef list -> ILType val mkILFormalTyparsRaw: ILTypes -> ILGenericParameterDefs val mkILFormalTypars: ILType list -> ILGenericParameterDefs diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 819cfdb74ee..b8289f30b0f 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -439,12 +439,12 @@ let goutput_alternative_ref env os (alt: IlxUnionAlternative) = output_id os alt.Name; alt.FieldDefs |> Array.toList |> output_parens (output_seq "," (fun os fdef -> goutput_typ env os fdef.Type)) os -let goutput_curef env os (IlxUnionRef(tref,alts,_,_)) = +let goutput_curef env os (IlxUnionRef(_,tref,alts,_,_)) = output_string os " .classunion import "; goutput_tref env os tref; output_parens (output_seq "," (goutput_alternative_ref env)) os (Array.toList alts) -let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(tref,_,_,_),i)) = +let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),i)) = output_string os "class /* classunion */ "; goutput_tref env os tref; goutput_gactuals env os i diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index ac8b23f5b14..282ab07d95a 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -1261,7 +1261,7 @@ let FindMethodDefIdx cenv mdkey = let (TdKey (tenc2,tname2)) = typeNameOfIdx mdkey2.TypeIdx dprintn ("A method in '"+(String.concat "." (tenc2@[tname2]))+"' had the right name but the wrong signature:") dprintn ("generic arity: "+string mdkey2.GenericArity) - dprintn (sprintf "mdkey2: %A" mdkey2)) + dprintn (sprintf "mdkey2: %+A" mdkey2)) raise MethodDefNotFound diff --git a/src/absil/ilx.fs b/src/absil/ilx.fs index efc5056aac6..d183fe0796b 100644 --- a/src/absil/ilx.fs +++ b/src/absil/ilx.fs @@ -45,16 +45,17 @@ type IlxUnionHasHelpers = | SpecialFSharpOptionHelpers type IlxUnionRef = - | IlxUnionRef of ILTypeRef * IlxUnionAlternative[] * bool * (* hasHelpers: *) IlxUnionHasHelpers + | IlxUnionRef of boxity: ILBoxity * ILTypeRef * IlxUnionAlternative[] * bool * (* hasHelpers: *) IlxUnionHasHelpers type IlxUnionSpec = | IlxUnionSpec of IlxUnionRef * ILGenericArgs - member x.EnclosingType = let (IlxUnionSpec(IlxUnionRef(tref,_,_,_),inst)) = x in mkILBoxedTyRaw tref inst - member x.TypeRef = let (IlxUnionSpec(IlxUnionRef(tref,_,_,_),_)) = x in tref + member x.EnclosingType = let (IlxUnionSpec(IlxUnionRef(bx,tref,_,_,_),inst)) = x in mkILNamedTy bx tref inst + member x.Boxity = let (IlxUnionSpec(IlxUnionRef(bx,_,_,_,_),_)) = x in bx + member x.TypeRef = let (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),_)) = x in tref member x.GenericArgs = let (IlxUnionSpec(_,inst)) = x in inst - member x.AlternativesArray = let (IlxUnionSpec(IlxUnionRef(_,alts,_,_),_)) = x in alts - member x.IsNullPermitted = let (IlxUnionSpec(IlxUnionRef(_,_,np,_),_)) = x in np - member x.HasHelpers = let (IlxUnionSpec(IlxUnionRef(_,_,_,b),_)) = x in b + member x.AlternativesArray = let (IlxUnionSpec(IlxUnionRef(_,_,alts,_,_),_)) = x in alts + member x.IsNullPermitted = let (IlxUnionSpec(IlxUnionRef(_,_,_,np,_),_)) = x in np + member x.HasHelpers = let (IlxUnionSpec(IlxUnionRef(_,_,_,_,b),_)) = x in b member x.Alternatives = Array.toList x.AlternativesArray member x.Alternative idx = x.AlternativesArray.[idx] member x.FieldDef idx fidx = x.Alternative(idx).FieldDef(fidx) diff --git a/src/absil/ilx.fsi b/src/absil/ilx.fsi index db96d9cdb4c..b7413fbf698 100644 --- a/src/absil/ilx.fsi +++ b/src/absil/ilx.fsi @@ -40,7 +40,7 @@ type IlxUnionHasHelpers = | SpecialFSharpOptionHelpers type IlxUnionRef = - | IlxUnionRef of ILTypeRef * IlxUnionAlternative[] * bool (* cudNullPermitted *) * IlxUnionHasHelpers (* cudHasHelpers *) + | IlxUnionRef of boxity: ILBoxity * ILTypeRef * IlxUnionAlternative[] * bool (* cudNullPermitted *) * IlxUnionHasHelpers (* cudHasHelpers *) type IlxUnionSpec = | IlxUnionSpec of IlxUnionRef * ILGenericArgs @@ -48,6 +48,7 @@ type IlxUnionSpec = member GenericArgs : ILGenericArgs member Alternatives : IlxUnionAlternative list member AlternativesArray : IlxUnionAlternative[] + member Boxity : ILBoxity member TypeRef : ILTypeRef member IsNullPermitted : bool member HasHelpers : IlxUnionHasHelpers diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 3b4031007c1..842561c857b 100644 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -110,29 +110,29 @@ let mkCombineHashGenerators g m exprs accv acce = // Build comparison functions for union, record and exception types. //------------------------------------------------------------------------- +let mkThatAddrLocal g m ty = mkCompGenLocal m "obj" (mkThisTy g ty) + let mkThisVarThatVar g m ty = let thisv,thise = mkThisVar g m ty - let thatv,thate = mkCompGenLocal m "obj" (mkThisTy g ty) - thisv,thatv,thise,thate + let thataddrv,thataddre = mkThatAddrLocal g m ty + thisv,thataddrv,thise,thataddre -let mkThatVarBind g m ty thatv expr = +let mkThatVarBind g m ty thataddrv expr = if isStructTy g ty then let thatv2,_ = mkMutableCompGenLocal m "obj" ty - thatv2,mkCompGenLet m thatv (mkValAddr m (mkLocalValRef thatv2)) expr - else thatv,expr + thatv2,mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv2)) expr + else thataddrv,expr -let mkThatAddrLocal g m ty = - if isStructTy g ty then - mkMutableCompGenLocal m "objCast" (mkByrefTy g ty) - else - mkCompGenLocal m "objCast" ty - let mkBindThatAddr g m ty thataddrv thatv thate expr = if isStructTy g ty then mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv)) expr else mkCompGenLet m thataddrv thate expr +let mkDerefThis g m (thisv: Val) thise = + if isByrefTy g thisv.Type then mkAddrGet m (mkLocalValRef thisv) + else thise + let mkCompareTestConjuncts g m exprs = match exprs with | [] -> mkZero g m @@ -186,7 +186,7 @@ let mkRecdCompare g tcref (tycon:Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst,ty = mkMinimalTy g tcref - let thisv,thatv,thise,thate = mkThisVarThatVar g m ty + let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty let compe = mkILCallGetComparer g m let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -195,12 +195,12 @@ let mkRecdCompare g tcref (tycon:Tycon) = mkCallGenericComparisonWithComparerOuter g m fty compe (mkRecdFieldGetViaExprAddr(thise, fref, tinst, m)) - (mkRecdFieldGetViaExprAddr(thate, fref, tinst, m)) + (mkRecdFieldGetViaExprAddr(thataddre, fref, tinst, m)) let expr = mkCompareTestConjuncts g m (List.map mkTest fields) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thate expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thataddre expr - let thatv,expr = mkThatVarBind g m ty thatv expr + let thatv,expr = mkThatVarBind g m ty thataddrv expr thisv,thatv, expr @@ -222,7 +222,7 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) com (mkRecdFieldGetViaExprAddr(thataddre, fref, tinst, m)) let expr = mkCompareTestConjuncts g m (List.map mkTest fields) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thate expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise tce expr let expr = mkBindThatAddr g m ty thataddrv tcv tce expr // will be optimized away if not necessary @@ -235,19 +235,19 @@ let mkRecdEquality g tcref (tycon:Tycon) = let m = tycon.Range let fields = tycon.AllInstanceFieldsAsList let tinst,ty = mkMinimalTy g tcref - let thisv,thatv,thise,thate = mkThisVarThatVar g m ty + let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty let mkTest (fspec:RecdField) = let fty = fspec.FormalType let fref = tcref.MakeNestedRecdFieldRef fspec let m = fref.Range mkCallGenericEqualityEROuter g m fty (mkRecdFieldGetViaExprAddr(thise, fref, tinst, m)) - (mkRecdFieldGetViaExprAddr(thate, fref, tinst, m)) + (mkRecdFieldGetViaExprAddr(thataddre, fref, tinst, m)) let expr = mkEqualsTestConjuncts g m (List.map mkTest fields) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindThatNullEquals g m thise thate expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindThatNullEquals g m thise thataddre expr - let thatv,expr = mkThatVarBind g m ty thatv expr + let thatv,expr = mkThatVarBind g m ty thataddrv expr thisv,thatv,expr /// Build the equality implementation for a record type when parameterized by a comparer @@ -288,12 +288,11 @@ let mkExnEquality g exnref (exnc:Tycon) = let expr = mkEqualsTestConjuncts g m (List.mapi mkTest (exnc.AllInstanceFieldsAsList)) let expr = let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) - let dtree = - TDSwitch(thate, - [ mkCase(Test.IsInst(g.exn_ty,mkAppTy exnref []), - mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ], - Some(mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget)), - m) + let cases = + [ mkCase(Test.IsInst(g.exn_ty,mkAppTy exnref []), + mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ] + let dflt = Some(mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thate,cases,dflt,m) mbuilder.Close(dtree,m,g.bool_ty) let expr = mkBindThatNullEquals g m thise thate expr @@ -313,12 +312,11 @@ let mkExnEqualityWithComparer g exnref (exnc:Tycon) (_thisv,thise) thatobje (tha let expr = mkEqualsTestConjuncts g m (List.mapi mkTest (exnc.AllInstanceFieldsAsList)) let expr = let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) - let dtree = - TDSwitch(thataddre, - [ mkCase(Test.IsInst(g.exn_ty,mkAppTy exnref []), - mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ], - Some(mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget)), - m) + let cases = + [ mkCase(Test.IsInst(g.exn_ty,mkAppTy exnref []), + mbuilder.AddResultTarget(expr,SuppressSequencePointAtTarget)) ] + let dflt = mbuilder.AddResultTarget(mkFalse g m,SuppressSequencePointAtTarget) + let dtree = TDSwitch(thate,cases,Some dflt,m) mbuilder.Close(dtree,m,g.bool_ty) let expr = mkBindThatAddr g m g.exn_ty thataddrv thatv thate expr let expr = mkIsInstConditional g m g.exn_ty thatobje thatv expr (mkFalse g m) @@ -330,8 +328,7 @@ let mkUnionCompare g tcref (tycon:Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst,ty = mkMinimalTy g tcref - let thisv,thise = mkCompGenLocal m "this" ty - let thatv,thate = mkCompGenLocal m "obj" ty + let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty let compe = mkILCallGetComparer g m @@ -341,30 +338,29 @@ let mkUnionCompare g tcref (tycon:Tycon) = let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range - let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) - let mkTest j (argty:RecdField) = - mkCallGenericComparisonWithComparerOuter g m argty.FormalType - compe - (mkUnionCaseFieldGetProven(thisucve, cref, tinst, j, m)) - (mkUnionCaseFieldGetProven(thatucve, cref, tinst, j, m)) let rfields = ucase.RecdFields if isNil rfields then None else - Some (mkCase(Test.UnionCase(cref,tinst), - mbuilder.AddResultTarget - (mkCompGenLet m thisucv (mkUnionCaseProof(thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof(thate,cref,tinst,m)) - (mkCompareTestConjuncts g m (List.mapi mkTest rfields))), - SuppressSequencePointAtTarget))) + let mkTest thise thataddre j (argty:RecdField) = + mkCallGenericComparisonWithComparerOuter g m argty.FormalType + compe + (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) + (mkUnionCaseFieldGetProvenViaExprAddr(thataddre, cref, tinst, j, m)) + let test = + if cref.Tycon.IsStructOrEnumTycon then + mkCompareTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) + else + let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) + let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + (mkCompareTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) + Some (mkCase(Test.UnionCase(cref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget))) let nullary,nonNullary = List.partition isNone (List.map mkCase ucases) if isNil nonNullary then mkZero g m else - let dtree = - TDSwitch(thise, - (nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare")), - (if isNil nullary then None - else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget))), - m) + let cases = nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare") + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt,m) mbuilder.Close(dtree,m,g.int_ty) let expr = @@ -375,53 +371,56 @@ let mkUnionCompare g tcref (tycon:Tycon) = expr (mkAsmExpr ([ IL.AI_sub ],[], [thistage; thattage],[g.int_ty],m))in mkCompGenLet m thistagv - (mkUnionCaseTagGet (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGet (thate,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) - let expr = mkBindNullComparison g m thise thate expr - thisv,thatv, expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thataddre expr + thisv,thataddrv, expr /// Build the comparison implementation for a union type when parameterized by a comparer -let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (thatv,thate) compe = +let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatv,thate) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst,ty = mkMinimalTy g tcref let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty let thataddrv,thataddre = mkThatAddrLocal g m ty + let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = thate let expr = let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range - let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) - let mkTest j (argty:RecdField) = - mkCallGenericComparisonWithComparerOuter g m argty.FormalType - compe - (mkUnionCaseFieldGetProven(thisucve, cref, tinst, j, m)) - (mkUnionCaseFieldGetProven(thatucve, cref, tinst, j, m)) let rfields = ucase.RecdFields if isNil rfields then None else - Some (mkCase(Test.UnionCase(cref,tinst), - mbuilder.AddResultTarget - (mkCompGenLet m thisucv (mkUnionCaseProof(thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof(thataddre,cref,tinst,m)) - (mkCompareTestConjuncts g m (List.mapi mkTest rfields))), - SuppressSequencePointAtTarget))) + + let mkTest thise thataddre j (argty:RecdField) = + mkCallGenericComparisonWithComparerOuter g m argty.FormalType + compe + (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) + (mkUnionCaseFieldGetProvenViaExprAddr(thataddre, cref, tinst, j, m)) + + let test = + if cref.Tycon.IsStructOrEnumTycon then + mkCompareTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) + else + let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) + let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + (mkCompareTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) + + Some (mkCase(Test.UnionCase(cref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget))) let nullary,nonNullary = List.partition isNone (List.map mkCase ucases) if isNil nonNullary then mkZero g m else - let dtree = - TDSwitch(thise, - (nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare")), - (if isNil nullary then None - else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget))), - m) + let cases = nonNullary |> List.map (function (Some c) -> c | None -> failwith "mkUnionCompare") + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkZero g m,SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt,m) mbuilder.Close(dtree,m,g.int_ty) let expr = @@ -432,13 +431,15 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (thatv,thate expr (mkAsmExpr ([ IL.AI_sub ],[], [thistage; thattage],[g.int_ty],m))in mkCompGenLet m thistagv - (mkUnionCaseTagGet (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGet (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) - let expr = mkBindNullComparison g m thise thate expr - let expr = mkBindThatAddr g m ty thataddrv thatv thate expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise tce expr + let expr = mkBindThatAddr g m ty thataddrv tcv tce expr + // will be optimized away if not necessary + let expr = mkCompGenLet m tcv thate expr expr @@ -447,8 +448,7 @@ let mkUnionEquality g tcref (tycon:Tycon) = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst,ty = mkMinimalTy g tcref - let thisv,thise = mkCompGenLocal m "this" ty - let thatv,thate = mkCompGenLocal m "obj" ty + let thisv,thataddrv,thise,thataddre = mkThisVarThatVar g m ty let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty @@ -457,27 +457,31 @@ let mkUnionEquality g tcref (tycon:Tycon) = let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range - let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) - let mkTest j (argty:RecdField) = - mkCallGenericEqualityEROuter g m argty.FormalType - (mkUnionCaseFieldGetProven(thisucve, cref, tinst, j, m)) - (mkUnionCaseFieldGetProven(thatucve, cref, tinst, j, m)) let rfields = ucase.RecdFields if isNil rfields then None else - Some (mkCase(Test.UnionCase(cref,tinst), - mbuilder.AddResultTarget - (mkCompGenLet m thisucv (mkUnionCaseProof(thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof(thate,cref,tinst,m)) - (mkEqualsTestConjuncts g m (List.mapi mkTest rfields))), - SuppressSequencePointAtTarget))) + + let mkTest thise thataddre j (argty:RecdField) = + mkCallGenericEqualityEROuter g m argty.FormalType + (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) + (mkUnionCaseFieldGetProvenViaExprAddr(thataddre, cref, tinst, j, m)) + + let test = + if cref.Tycon.IsStructOrEnumTycon then + mkEqualsTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) + else + let thisucv,thisucve = mkCompGenLocal m "thisCast" (mkProvenUnionCaseTy cref tinst) + let thatucv,thatucve = mkCompGenLocal m "objCast" (mkProvenUnionCaseTy cref tinst) + mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + (mkEqualsTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) + + Some (mkCase(Test.UnionCase(cref,tinst), mbuilder.AddResultTarget(test, SuppressSequencePointAtTarget))) let nullary,nonNullary = List.partition isNone (List.map mkCase ucases) if isNil nonNullary then mkTrue g m else - let dtree = - TDSwitch(thise,List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary, - (if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget))), - m) + let cases = List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary + let dflt = (if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget))) + let dtree = TDSwitch(thise, cases, dflt, m) mbuilder.Close(dtree,m,g.bool_ty) let expr = @@ -489,13 +493,14 @@ let mkUnionEquality g tcref (tycon:Tycon) = (mkFalse g m) mkCompGenLet m thistagv - (mkUnionCaseTagGet (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGet (thate,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) - let expr = mkBindThatNullEquals g m thise thate expr - thisv,thatv, expr + let thatv,expr = mkThatVarBind g m ty thataddrv expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindThatNullEquals g m thise thataddre expr + thisv,thatv,expr /// Build the equality implementation for a union type when parameterized by a comparer @@ -512,28 +517,34 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (t let mkCase ucase = let cref = tcref.MakeNestedUnionCaseRef ucase let m = cref.Range - let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) - let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) - let mkTest j (argty:RecdField) = - mkCallGenericEqualityWithComparerOuter g m argty.FormalType - compe - (mkUnionCaseFieldGetProven(thisucve, cref, tinst, j, m)) - (mkUnionCaseFieldGetProven(thatucve, cref, tinst, j, m)) + let rfields = ucase.RecdFields if isNil rfields then None else - Some (mkCase(Test.UnionCase(cref,tinst), - mbuilder.AddResultTarget - (mkCompGenLet m thisucv (mkUnionCaseProof(thise,cref,tinst,m)) - (mkCompGenLet m thatucv (mkUnionCaseProof(thataddre,cref,tinst,m)) - (mkEqualsTestConjuncts g m (List.mapi mkTest rfields))), - SuppressSequencePointAtTarget))) + + let mkTest thise thataddre j (argty:RecdField) = + mkCallGenericEqualityWithComparerOuter g m argty.FormalType + compe + (mkUnionCaseFieldGetProvenViaExprAddr(thise, cref, tinst, j, m)) + (mkUnionCaseFieldGetProvenViaExprAddr(thataddre, cref, tinst, j, m)) + + let test = + if cref.Tycon.IsStructOrEnumTycon then + mkEqualsTestConjuncts g m (List.mapi (mkTest thise thataddre) rfields) + else + let thisucv,thisucve = mkCompGenLocal m "thisCastu" (mkProvenUnionCaseTy cref tinst) + let thatucv,thatucve = mkCompGenLocal m "thatCastu" (mkProvenUnionCaseTy cref tinst) + + mkCompGenLet m thisucv (mkUnionCaseProof (thise,cref,tinst,m)) + (mkCompGenLet m thatucv (mkUnionCaseProof (thataddre,cref,tinst,m)) + (mkEqualsTestConjuncts g m (List.mapi (mkTest thisucve thatucve) rfields))) + + Some (mkCase(Test.UnionCase(cref,tinst), mbuilder.AddResultTarget (test, SuppressSequencePointAtTarget))) let nullary,nonNullary = List.partition isNone (List.map mkCase ucases) if isNil nonNullary then mkTrue g m else - let dtree = - TDSwitch(thise,List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary, - (if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget))), - m) + let cases = List.map (function (Some c) -> c | None -> failwith "mkUnionEquality") nonNullary + let dflt = if isNil nullary then None else Some (mbuilder.AddResultTarget(mkTrue g m,SuppressSequencePointAtTarget)) + let dtree = TDSwitch(thise, cases, dflt, m) mbuilder.Close(dtree,m,g.bool_ty) let expr = @@ -545,9 +556,9 @@ let mkUnionEqualityWithComparer g tcref (tycon:Tycon) (_thisv,thise) thatobje (t (mkFalse g m) mkCompGenLet m thistagv - (mkUnionCaseTagGet (thise,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thise,tcref,tinst,m)) (mkCompGenLet m thattagv - (mkUnionCaseTagGet (thataddre,tcref,tinst,m)) + (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) let expr = mkBindThatAddr g m ty thataddrv thatv thate expr let expr = mkIsInstConditional g m ty thatobje thatv expr (mkFalse g m) @@ -605,25 +616,32 @@ let mkUnionHashWithComparer g tcref (tycon:Tycon) compe = let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) let accv,acce = mkMutableCompGenLocal m "i" g.int_ty let mkCase i ucase1 = - let c1ref = tcref.MakeNestedUnionCaseRef ucase1 - let ucv,ucve = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy c1ref tinst) - let m = c1ref.Range - let mkHash j (rfield:RecdField) = - let fty = rfield.FormalType - let e = mkUnionCaseFieldGetProven(ucve, c1ref, tinst, j, m) - mkCallGenericHashWithComparerOuter g m fty compe e - mkCase(Test.UnionCase(c1ref,tinst), - mbuilder.AddResultTarget - (mkCompGenLet m ucv - (mkUnionCaseProof(thise,c1ref,tinst,m)) + let c1ref = tcref.MakeNestedUnionCaseRef ucase1 + let m = c1ref.Range + let mkHash thise j (rfield:RecdField) = + let fty = rfield.FormalType + let e = mkUnionCaseFieldGetProvenViaExprAddr(thise, c1ref, tinst, j, m) + mkCallGenericHashWithComparerOuter g m fty compe e + + let test = + if tycon.IsStructOrEnumTycon then + mkCompGenSequential m + (mkValSet m (mkLocalValRef accv) (mkInt g m i)) + (mkCombineHashGenerators g m (List.mapi (mkHash thise) ucase1.RecdFields) (mkLocalValRef accv) acce) + else + let ucv,ucve = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy c1ref tinst) + mkCompGenLet m ucv + (mkUnionCaseProof (thise,c1ref,tinst,m)) (mkCompGenSequential m - (mkValSet m (mkLocalValRef accv) (mkInt g m i)) - (mkCombineHashGenerators g m (List.mapi mkHash ucase1.RecdFields) (mkLocalValRef accv) acce)), - SuppressSequencePointAtTarget)) - let dtree = TDSwitch(thise,List.mapi mkCase ucases, None,m) + (mkValSet m (mkLocalValRef accv) (mkInt g m i)) + (mkCombineHashGenerators g m (List.mapi (mkHash ucve) ucase1.RecdFields) (mkLocalValRef accv) acce)) + + mkCase(Test.UnionCase(c1ref,tinst),mbuilder.AddResultTarget(test,SuppressSequencePointAtTarget)) + + let dtree = TDSwitch(thise, List.mapi mkCase ucases, None,m) let stmt = mbuilder.Close(dtree,m,g.int_ty) let expr = mkCompGenLet m accv (mkZero g m) stmt - let expr = mkBindNullHash g m thise expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullHash g m thise expr thisv,expr diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index fbab553659d..3800e29755b 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -2575,11 +2575,21 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait | true, true, 1 -> Some (mkStaticRecdFieldSet (rfref, tinst, argExprs.[0], m)) | true, false, 2 -> - Some (mkRecdFieldSet g (argExprs.[0], rfref, tinst, argExprs.[1], m)) + // If we resolve to an instance field on a struct and we haven't yet taken + // the address of the object then go do that + if rfref.Tycon.IsStructOrEnumTycon && not (isByrefTy g (tyOfExpr g argExprs.[0])) then + let h = List.head argExprs + let wrap,h' = mkExprAddrOfExpr g true false DefinitelyMutates h None m + Some (wrap (mkRecdFieldSetViaExprAddr (h', rfref, tinst, argExprs.[1], m))) + else + Some (mkRecdFieldSetViaExprAddr (argExprs.[0], rfref, tinst, argExprs.[1], m)) | false, true, 0 -> Some (mkStaticRecdFieldGet (rfref, tinst, m)) | false, false, 1 -> - Some (mkRecdFieldGet g (argExprs.[0], rfref, tinst, m)) + if rfref.Tycon.IsStructOrEnumTycon && isByrefTy g (tyOfExpr g argExprs.[0]) then + Some (mkRecdFieldGetViaExprAddr (argExprs.[0], rfref, tinst, m)) + else + Some (mkRecdFieldGet g (argExprs.[0], rfref, tinst, m)) | _ -> None ResultD res | Choice3Of4 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 28b15426e03..c52663bd402 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1301,4 +1301,5 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory" 3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters" 3198,considerUpcast,"The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'." -3198,considerUpcastOperator,"The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator." \ No newline at end of file +3198,considerUpcastOperator,"The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator." +3199,tcStructUnionMultiCase,"A union type which is a struct must have only one case." \ No newline at end of file diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs index 42f038b67bc..52ea6fbf388 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs @@ -1,10 +1,25 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core +module FSharp.Core.Unittests.FSharp_Core.Microsoft_FSharp_Core.DiscriminatedUnionTypes open System open System.Numerics +open System.Reflection +open System.Runtime.InteropServices open FSharp.Core.Unittests.LibraryTestFx open NUnit.Framework +open FsCheck +open FsCheck.PropOperators + +#if FX_RESHAPED_REFLECTION +open FSharp.Reflection.FSharpReflectionExtensions + +[] +module PrimReflectionAdapters = + + type System.Type with + member this.IsValueType = this.GetTypeInfo().IsValueType +#endif + type EnumUnion = | A @@ -95,4 +110,119 @@ type UseUnionsWithData() = | _ -> Assert.Fail() match a2 with | Alpha x when x = 2 -> () - | _ -> Assert.Fail() \ No newline at end of file + | _ -> Assert.Fail() + +[] +type StructUnion = SU of C : int * D : int + +let private hasAttribute<'T,'Attr>() = + typeof<'T>.GetTypeInfo().GetCustomAttributes() |> Seq.exists (fun x -> x.GetType() = typeof<'Attr>) + + +let [] ``struct unions hold [] metadata`` () = + Assert.IsTrue (hasAttribute()) + + +let [] ``struct unions are comparable`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + i1 <> i2 ==> + let sr1 = SU (i1, i2) + let sr2 = SU (i1, i2) + let sr3 = SU (i2, i1) + (sr1 = sr2) |@ "sr1 = sr2" .&. + (sr1 <> sr3) |@ "sr1 <> sr3" .&. + (sr1.Equals sr2) |@ "sr1.Equals sr2" + + +let [] ``struct unions support pattern matching`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = SU(i1, i2) + (match sr1 with + | SU(c,d) when c = i1 && d = i2 -> true + | _ -> false) + |@ "with pattern match on struct union" .&. + (sr1 |> function + | SU(c,d) when c = i1 && d = i2 -> true + | _ -> false) + |@ "function pattern match on struct union" + + +let [] ``struct unions support let binds using `` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = SU(i1,i2) + let (SU (c1,d2)) as sr2 = sr1 + (sr1 = sr2) |@ "sr1 = sr2" .&. + (c1 = i1 && d2 = i2) |@ "c1 = i1 && d2 = i2" + + +let [] ``struct unions support function argument bindings`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = SU(i1,i2) + let test sr1 (SU (c1,d2) as sr2) = + sr1 = sr2 && c1 = i1 && d2 = i2 + test sr1 sr1 + + + +[] +[] +type ComparisonStructUnion = + | SU2 of int * int + member x.C1 = (match x with SU2(a,b) -> a) + member x.C2 = (match x with SU2(a,b) -> b) + override self.Equals other = + match other with + | :? ComparisonStructUnion as o -> (self.C1 + self.C2) = (o.C1 + o.C2) + | _ -> false + + override self.GetHashCode() = hash self + interface IComparable with + member self.CompareTo other = + match other with + | :? ComparisonStructUnion as o -> compare (self.C1 + self.C2) (o.C1 + o.C2) + | _ -> invalidArg "other" "cannot compare values of different types" + + +[] +let ``struct unions support []`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) -> + let sr1 = SU2(i1,i2) + let sr2 = SU2(i1,i2) + (sr1.Equals sr2) + + +[] +let ``struct unions support []`` () = + Check.QuickThrowOnFailure <| + fun (i1:int) (i2:int) (k1:int) (k2:int) -> + let sr1 = SU2(i1,i2) + let sr2 = SU2(k1,k2) + if sr1 > sr2 then compare sr1 sr2 = 1 + elif sr1 < sr2 then compare sr1 sr2 = -1 + elif sr1 = sr2 then compare sr1 sr2 = 0 + else false + + +[] +let ``struct unions hold [] [] metadata`` () = + Assert.IsTrue (hasAttribute()) + Assert.IsTrue (hasAttribute()) + + +[] +[] +type NoComparisonStructUnion = + | SU3 of int * int + + + +[] +let ``struct unions hold [] [] metadata`` () = + Assert.IsTrue (hasAttribute()) + Assert.IsTrue (hasAttribute()) + diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index e7f357eb825..55ee5241a28 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -473,7 +473,8 @@ and GenUnionRef amap m g (tcref: TyconRef) = altFields=GenUnionCaseRef amap m g tyenvinner i cspec.RecdFieldsArray }) let nullPermitted = IsUnionTypeWithNullAsTrueValue g tycon let hasHelpers = ComputeUnionHasHelpers g tcref - IlxUnionRef(tref,alternatives,nullPermitted,hasHelpers)) + let boxity = (if tcref.IsStructOrEnumTycon then ILBoxity.AsValue else ILBoxity.AsObject) + IlxUnionRef(boxity, tref,alternatives,nullPermitted,hasHelpers)) and ComputeUnionHasHelpers g (tcref : TyconRef) = if tyconRefEq g tcref g.unit_tcr_canon then NoHelpers @@ -1751,6 +1752,8 @@ let rec GenExpr cenv (cgbuf:CodeGenBuffer) eenv sp expr sequel = GenGetExnField cenv cgbuf eenv (e,ecref,n,m) sequel | TOp.UnionCaseFieldGet(ucref,n),[e],_ -> GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel + | TOp.UnionCaseFieldGetAddr(ucref,n),[e],_ -> + GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel | TOp.UnionCaseTagGet ucref,[e],_ -> GenGetUnionCaseTag cenv cgbuf eenv (e,ucref,tyargs,m) sequel | TOp.UnionCaseProof ucref,[e],_ -> @@ -2181,12 +2184,13 @@ and GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs let fty = EraseUnions.GetILTypeForAlternative cuspec idx - EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,cuspec,idx) + let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) CG.EmitInstrs cgbuf (pop 1) (Push [fty]) [ ] // push/pop to match the line above GenSequel cenv eenv.cloc cgbuf sequel and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = - assert (isProvenUnionCaseTy (tyOfExpr cenv.g e)); + assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)); GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs @@ -2195,6 +2199,16 @@ and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = CG.EmitInstrs cgbuf (pop 1) (Push [fty]) (EraseUnions.mkLdData (avoidHelpers, cuspec, idx, n)); GenSequel cenv eenv.cloc cgbuf sequel +and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = + assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)); + + GenExpr cenv cgbuf eenv SPSuppress e Continue; + let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs + let fty = actualTypOfIlxUnionField cuspec idx n + let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef + CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fty]) (EraseUnions.mkLdDataAddr (avoidHelpers, cuspec, idx, n)); + GenSequel cenv eenv.cloc cgbuf sequel + and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec = GenUnionSpec cenv.amap m cenv.g eenv.tyenv tcref tyargs @@ -2206,7 +2220,8 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue; let cuspec,idx = GenUnionCaseSpec cenv.amap m cenv.g eenv.tyenv ucref tyargs - EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,cuspec,idx) + let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef + EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) CG.EmitInstrs cgbuf (pop 1) (Push [cuspec.EnclosingType]) [ ] // push/pop to match the line above GenExpr cenv cgbuf eenv SPSuppress e2 Continue; CG.EmitInstrs cgbuf (pop 2) Push0 (EraseUnions.mkStData (cuspec, idx, n)); @@ -4247,12 +4262,17 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau let failureTree = (match defaultTargetOpt with None -> cases.Tail.Head.CaseTree | Some d -> d) GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e None eenv (if b then successTree else failureTree) (if b then failureTree else successTree) targets repeatSP targetInfos sequel - // optimize a single test for a type constructor to an "isdata" test - much + // // Remove a single test for a union case . Union case tests are always exa + //| [ TCase(Test.UnionCase _, successTree) ] when (defaultTargetOpt.IsNone) -> + // GenDecisionTreeAndTargetsInner cenv cgbuf inplabOpt stackAtTargets eenv successTree targets repeatSP targetInfos sequel + // //GenDecisionTree cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel + + // Optimize a single test for a union case to an "isdata" test - much // more efficient code, and this case occurs in the generated equality testers where perf is important - | TCase(Test.UnionCase(c,tyargs), successTree) :: rest when List.length rest = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> + | TCase(Test.UnionCase(c,tyargs), successTree) :: rest when rest.Length = (match defaultTargetOpt with None -> 1 | Some _ -> 0) -> let failureTree = match defaultTargetOpt with - | None -> cases.Tail.Head.CaseTree + | None -> rest.Head.CaseTree | Some tg -> tg let cuspec = GenUnionSpec cenv.amap m cenv.g eenv.tyenv c.TyconRef tyargs let idx = c.Index @@ -6116,7 +6136,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TTyconInterface -> ILTypeDefKind.Interface | TTyconEnum -> ILTypeDefKind.Enum | TTyconDelegate _ -> ILTypeDefKind.Delegate - | TRecdRepr _ when tycon.IsStructRecordTycon -> ILTypeDefKind.ValueType + | TRecdRepr _ | TUnionRepr _ when tycon.IsStructOrEnumTycon -> ILTypeDefKind.ValueType | _ -> ILTypeDefKind.Class let requiresExtraField = @@ -6285,13 +6305,15 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = (true,emptyILLocals,2, nonBranchingInstrsToCode ([ // load the hardwired format string - I_ldstr "%+0.8A"; + yield I_ldstr "%+0.8A"; // make the printf format object - mkNormalNewobj newFormatMethSpec; + yield mkNormalNewobj newFormatMethSpec; // call sprintf - mkNormalCall sprintfMethSpec; + yield mkNormalCall sprintfMethSpec; // call the function returned by sprintf - mkLdarg0 ] @ + yield mkLdarg0 + if ilThisTy.Boxity = ILBoxity.AsValue then + yield mkNormalLdobj ilThisTy ] @ callInstrs), None)) yield ilMethodDef |> AddSpecialNameFlag |> AddNonUserCompilerGeneratedAttribs cenv.g @@ -6319,7 +6341,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = relevantFields |> List.map (fun (_,ilFieldName,_,_,_,ilPropType,_,fspec) -> (fspec.Name,ilFieldName,ilPropType)) - let isStructRecord = tycon.IsStructRecordTycon + let isStructRecord = tycon.IsStructRecordOrUnionTycon // No type spec if the record is a value type let spec = if isStructRecord then None else Some(cenv.g.ilg.tspec_Object) @@ -6506,7 +6528,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = InitSemantics=ILTypeInit.BeforeField; IsSealed=true; IsAbstract=false; - tdKind= ILTypeDefKind.Class + tdKind= (if tycon.IsStructOrEnumTycon then ILTypeDefKind.ValueType else ILTypeDefKind.Class) Fields = ilFields; Events= ilEvents; Properties = ilProperties; @@ -6518,7 +6540,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = NestedTypes=emptyILTypeDefs; Encoding= ILDefaultPInvokeEncoding.Auto; Implements= mkILTypes ilIntfTys; - Extends= Some cenv.g.ilg.typ_Object; + Extends= Some (if tycon.IsStructOrEnumTycon then cenv.g.ilg.typ_ValueType else cenv.g.ilg.typ_Object) SecurityDecls= emptyILSecurityDecls; HasSecurity=false } let tdef2 = EraseUnions.mkClassUnionDef cenv.g.ilg tref tdef cuinfo diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 9ebd2bafafe..52345ff8c43 100755 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1656,7 +1656,7 @@ let private ResolveObjectConstructorPrim (ncenv:NameResolver) edenv resInfo m ad success (resInfo, Item.FakeInterfaceCtor typ) else let defaultStructCtorInfo = - if (isStructTy g typ && not(isRecdTy g typ) && not(ctorInfos |> List.exists (fun x -> x.IsNullary))) then + if (isStructTy g typ && not (isRecdTy g typ) && not (isUnionTy g typ) && not(ctorInfos |> List.exists (fun x -> x.IsNullary))) then [DefaultStructCtor(g,typ)] else [] if (isNil defaultStructCtorInfo && isNil ctorInfos) || not (isAppTy g typ) then diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 0bb9b2dfe87..e3451d188f1 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -1320,7 +1320,8 @@ and OpHasEffect g op = | TOp.ExnFieldGet(ecref,n) -> isExnFieldMutable ecref n | TOp.RefAddrGet -> false | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some(true)) - | TOp.ValFieldGetAddr _rfref -> true (* check *) + | TOp.ValFieldGetAddr rfref -> rfref.RecdField.IsMutable (* data is immutable, so taking address is ok *) + | TOp.UnionCaseFieldGetAddr _ -> false (* data is immutable, so taking address is ok *) | TOp.LValueOp (LGetAddr,lv) -> lv.IsMutable | TOp.UnionCaseFieldSet _ | TOp.ExnFieldSet _ @@ -1928,6 +1929,7 @@ and OptimizeExprOpFallback cenv env (op,tyargs,args',m) arginfos valu = | TOp.Array | TOp.For _ | TOp.While _ | TOp.TryCatch _ | TOp.TryFinally _ | TOp.ILCall _ | TOp.TraitCall _ | TOp.LValueOp _ | TOp.ValFieldSet _ | TOp.UnionCaseFieldSet _ | TOp.RefAddrGet | TOp.Coerce | TOp.Reraise + | TOp.UnionCaseFieldGetAddr _ | TOp.ExnFieldSet _ -> 1,valu | TOp.Recd (ctorInfo,tcref) -> let finfos = tcref.AllInstanceFieldsAsList diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 0dae5cdfbf2..22400641b79 100644 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -375,7 +375,7 @@ let getDiscrimOfPattern g tpinst t = | TPat_array (args,ty,_m) -> Some(Test.ArrayLength (args.Length,ty)) | TPat_query ((pexp,resTys,apatVrefOpt,idx,apinfo),_,_m) -> - Some(Test.ActivePatternCase (pexp, instTypes tpinst resTys, apatVrefOpt,idx,apinfo)) + Some(Test.ActivePatternCase (pexp, instTypes tpinst resTys, apatVrefOpt, idx, apinfo)) | _ -> None let constOfDiscrim discrim = @@ -897,6 +897,21 @@ let CompilePatternBasic let appexp = mkIsInst tgty argexp matchm Some(vexp),Some(mkInvisibleBind v appexp) + // Any match on a struct union must take the address of its input + | EdgeDiscrim(_i',(Test.UnionCase (ucref, _)),_) :: _rest + when (isNil topgtvs && ucref.Tycon.IsStructRecordOrUnionTycon) -> + + let argexp = GetSubExprOfInput subexpr + let vOpt,addrexp = mkExprAddrOfExprAux g true false NeverMutates argexp None matchm + match vOpt with + | None -> None, None + | Some (v,e) -> + if topv.IsMemberOrModuleBinding then + AdjustValToTopVal v topv.ActualParent ValReprInfo.emptyValData; + Some addrexp, Some (mkInvisibleBind v e) + + + #if OPTIMIZE_LIST_MATCHING | [EdgeDiscrim(_, ListConsDiscrim g tinst,m); EdgeDiscrim(_, ListEmptyDiscrim g _, _)] | [EdgeDiscrim(_, ListEmptyDiscrim g _, _); EdgeDiscrim(_, ListConsDiscrim g tinst, m)] @@ -915,7 +930,7 @@ let CompilePatternBasic #endif // Active pattern matches: create a variable to hold the results of executing the active pattern. - | (EdgeDiscrim(_,(Test.ActivePatternCase(pexp,resTys,_resPreBindOpt,_,apinfo)),m) :: _) -> + | (EdgeDiscrim(_,(Test.ActivePatternCase(pexp,resTys,_,_,apinfo)),m) :: _) -> if debug then dprintf "Building result var for active pattern...\n"; if nonNil topgtvs then error(InternalError("Unexpected generalized type variables when compiling an active pattern",m)); @@ -957,13 +972,14 @@ let CompilePatternBasic #endif (isNil topgtvs && not topv.IsMemberOrModuleBinding && + not ucref.Tycon.IsStructRecordOrUnionTycon && ucref.UnionCase.RecdFields.Length >= 1 && ucref.Tycon.UnionCasesArray.Length > 1) -> let v,vexp = mkCompGenLocal m "unionCase" (mkProvenUnionCaseTy ucref tinst) let argexp = GetSubExprOfInput subexpr - let appexp = mkUnionCaseProof(argexp, ucref,tinst,m) - Some(vexp),Some(mkInvisibleBind v appexp) + let appexp = mkUnionCaseProof (argexp, ucref,tinst,m) + Some vexp,Some(mkInvisibleBind v appexp) | _ -> None,None @@ -1052,11 +1068,14 @@ let CompilePatternBasic if (hasParam && i = i') || (discrimsEq g discrim (Option.get (getDiscrimOfPattern pat))) then let aparity = apinfo.Names.Length let accessf' j tpinst _e' = + assert resPreBindOpt.IsSome if aparity <= 1 then Option.get resPreBindOpt else let ucref = mkChoiceCaseRef g m aparity idx - mkUnionCaseFieldGetUnproven(Option.get resPreBindOpt,ucref,instTypes tpinst resTys,j,exprm) + // TODO: In the future we will want active patterns to be able to return struct-unions + // In that eventuality, we need to check we are taking the address correctly + mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get resPreBindOpt,ucref,instTypes tpinst resTys,j,exprm) mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) elif hasParam then @@ -1068,7 +1087,9 @@ let CompilePatternBasic else if i = i' then let accessf' _j tpinst _ = - mkUnionCaseFieldGetUnproven(Option.get resPreBindOpt, mkSomeCase g, instTypes tpinst resTys, 0, exprm) + // TODO: In the future we will want active patterns to be able to return struct-unions + // In that eventuality, we need to check we are taking the address correctly + mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get resPreBindOpt, mkSomeCase g, instTypes tpinst resTys, 0, exprm) mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) else // Successful active patterns don't refute other patterns @@ -1080,12 +1101,12 @@ let CompilePatternBasic let accessf' j tpinst e' = #if OPTIMIZE_LIST_MATCHING match resPreBindOpt with - | Some e -> mkUnionCaseFieldGetProven(e,ucref1,tinst,j,exprm) + | Some e -> mkUnionCaseFieldGetProvenViaExprAddr g (e,ucref1,tinst,j,exprm) | None -> #endif match resPostBindOpt with - | Some e -> mkUnionCaseFieldGetProven(e,ucref1,tinst,j,exprm) - | None -> mkUnionCaseFieldGetUnproven(accessf tpinst e',ucref1,instTypes tpinst tyargs,j,exprm) + | Some e -> mkUnionCaseFieldGetProvenViaExprAddr (e,ucref1,tinst,j,exprm) + | None -> mkUnionCaseFieldGetUnprovenViaExprAddr (accessf tpinst e',ucref1,instTypes tpinst tyargs,j,exprm) mkSubFrontiers path accessf' active' argpats (fun path j -> PathUnionConstr(path,ucref1,tyargs,j)) | Test.UnionCase _ -> diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 275ffbe2137..9519c65f50d 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -731,22 +731,41 @@ and CheckExprOp cenv env (op,tyargs,args,m) context = CheckTypeInstNoByrefs cenv env m tyargs; CheckExprDirectArgs cenv env [arg1]; (* See mkRecdFieldSetViaExprAddr -- byref arg1 when #args=2 *) CheckExprs cenv env [arg2] (* Property setters on mutable structs come through here (TBC). *) + | TOp.Coerce,[_ty1;_ty2],[x],_arity -> CheckTypeInstNoByrefs cenv env m tyargs; CheckExprInContext cenv env x context + | TOp.Reraise,[_ty1],[],_arity -> CheckTypeInstNoByrefs cenv env m tyargs + | TOp.ValFieldGetAddr rfref,tyargs,[],_ -> if context <> DirectArg && cenv.reportErrors then errorR(Error(FSComp.SR.chkNoAddressStaticFieldAtThisPoint(rfref.FieldName), m)); CheckTypeInstNoByrefs cenv env m tyargs (* NOTE: there are no arg exprs to check in this case *) + | TOp.ValFieldGetAddr rfref,tyargs,[rx],_ -> if context <> DirectArg && cenv.reportErrors then errorR(Error(FSComp.SR.chkNoAddressFieldAtThisPoint(rfref.FieldName), m)); (* This construct is used for &(rx.rfield) and &(rx->rfield). Relax to permit byref types for rx. [See Bug 1263]. *) CheckTypeInstNoByrefs cenv env m tyargs; CheckExprInContext cenv env rx DirectArg (* allow rx to be byref here *) + + | TOp.UnionCaseFieldGet _,_,[arg1],_arity -> + CheckTypeInstNoByrefs cenv env m tyargs + CheckExprInContext cenv env arg1 DirectArg + + | TOp.UnionCaseTagGet _,_,[arg1],_arity -> + CheckTypeInstNoByrefs cenv env m tyargs + CheckExprInContext cenv env arg1 DirectArg + + | TOp.UnionCaseFieldGetAddr (uref, _idx),tyargs,[rx],_ -> + if context <> DirectArg && cenv.reportErrors then + errorR(Error(FSComp.SR.chkNoAddressFieldAtThisPoint(uref.CaseName), m)) + CheckTypeInstNoByrefs cenv env m tyargs + CheckExprInContext cenv env rx DirectArg // allow rx to be byref here + | TOp.ILAsm (instrs,tys),_,_,_ -> CheckTypeInstPermitByrefs cenv env m tys; CheckTypeInstNoByrefs cenv env m tyargs; @@ -887,9 +906,9 @@ and CheckDecisionTree cenv env x = | TDSwitch (e,cases,dflt,m) -> CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) and CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) = - CheckExpr cenv env e; - List.iter (fun (TCase(discrim,e)) -> CheckDecisionTreeTest cenv env m discrim; CheckDecisionTree cenv env e) cases; - Option.iter (CheckDecisionTree cenv env) dflt + CheckExprInContext cenv env e DirectArg // can be byref for struct union switch + cases |> List.iter (fun (TCase(discrim,e)) -> CheckDecisionTreeTest cenv env m discrim; CheckDecisionTree cenv env e) + dflt |> Option.iter (CheckDecisionTree cenv env) and CheckDecisionTreeTest cenv env m discrim = match discrim with diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 22090236d4b..3361b5ec54f 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -433,6 +433,9 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. | TOp.ValFieldGetAddr(_rfref),_tyargs,_ -> wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) + | TOp.UnionCaseFieldGetAddr _,_tyargs,_ -> + wfail(Error(FSComp.SR.crefQuotationsCantContainAddressOf(), m)) + | TOp.ValFieldGet(_rfref),_tyargs,[] -> wfail(Error(FSComp.SR.crefQuotationsCantContainStaticFieldRef(),m)) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index d82e0671bf7..fd4e2c2f6be 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1181,24 +1181,32 @@ let mkStaticRecdFieldGetAddr(fref,tinst,m) = Expr.Op (TOp.ValFieldGetAd let mkStaticRecdFieldGet(fref,tinst,m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [],m) let mkStaticRecdFieldSet(fref,tinst,e,m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e],m) -let mkRecdFieldSetViaExprAddr(e1,fref,tinst,e2,m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e1;e2],m) +let mkRecdFieldSetViaExprAddr (e1,fref,tinst,e2,m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e1;e2],m) -let mkUnionCaseTagGet(e1,cref,tinst,m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1],m) -let mkUnionCaseProof(e1,cref,tinst,m) = Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1],m) +let mkUnionCaseTagGetViaExprAddr (e1,cref,tinst,m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1],m) -/// Build a 'get' expression for something we've already determined to be a particular union case, and where the -/// input expression has 'TType_ucase', which is an F# compiler internal "type" -let mkUnionCaseFieldGetProven(e1,cref,tinst,j,m) = Expr.Op (TOp.UnionCaseFieldGet(cref,j), tinst, [e1],m) +/// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) +let mkUnionCaseProof (e1,cref:UnionCaseRef,tinst,m) = if cref.Tycon.IsStructOrEnumTycon then e1 else Expr.Op (TOp.UnionCaseProof(cref), tinst, [e1],m) + +/// Build a 'TOp.UnionCaseFieldGet' expression for something we've already determined to be a particular union case. For ref-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. +let mkUnionCaseFieldGetProvenViaExprAddr (e1,cref,tinst,j,m) = Expr.Op (TOp.UnionCaseFieldGet(cref,j), tinst, [e1],m) + +/// Build a 'TOp.UnionCaseFieldGetAddr' expression for a field of a union when we've already determined the value to be a particular union case. For ref-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. +let mkUnionCaseFieldGetAddrProvenViaExprAddr (e1,cref,tinst,j,m) = Expr.Op (TOp.UnionCaseFieldGetAddr(cref,j), tinst, [e1],m) /// Build a 'get' expression for something we've already determined to be a particular union case, but where /// the static type of the input is not yet proven to be that particular union case. This requires a type /// cast to 'prove' the condition. -let mkUnionCaseFieldGetUnproven(e1,cref,tinst,j,m) = mkUnionCaseFieldGetProven(mkUnionCaseProof(e1,cref,tinst,m),cref,tinst,j,m) +let mkUnionCaseFieldGetUnprovenViaExprAddr (e1,cref,tinst,j,m) = mkUnionCaseFieldGetProvenViaExprAddr(mkUnionCaseProof(e1,cref,tinst,m),cref,tinst,j,m) -let mkUnionCaseFieldSet(e1,cref,tinst,j,e2,m) = Expr.Op (TOp.UnionCaseFieldSet(cref,j), tinst, [e1;e2],m) +let mkUnionCaseFieldSet (e1,cref,tinst,j,e2,m) = Expr.Op (TOp.UnionCaseFieldSet(cref,j), tinst, [e1;e2],m) -let mkExnCaseFieldGet(e1,ecref,j,m) = Expr.Op (TOp.ExnFieldGet(ecref,j), [],[e1],m) -let mkExnCaseFieldSet(e1,ecref,j,e2,m) = Expr.Op (TOp.ExnFieldSet(ecref,j), [],[e1;e2],m) +let mkExnCaseFieldGet (e1,ecref,j,m) = Expr.Op (TOp.ExnFieldGet(ecref,j), [],[e1],m) +let mkExnCaseFieldSet (e1,ecref,j,e2,m) = Expr.Op (TOp.ExnFieldSet(ecref,j), [],[e1;e2],m) let mkDummyLambda g (e:Expr,ety) = let m = e.Range @@ -1310,6 +1318,9 @@ let actualTyOfRecdFieldForTycon tycon tinst (fspec:RecdField) = let actualTyOfRecdFieldRef (fref:RecdFieldRef) tinst = actualTyOfRecdFieldForTycon fref.Tycon tinst fref.RecdField +let actualTyOfUnionFieldRef (fref:UnionCaseRef) n tinst = + actualTyOfRecdFieldForTycon fref.Tycon tinst (fref.FieldByIndex(n)) + //--------------------------------------------------------------------------- // Apply type functions to types @@ -4130,6 +4141,7 @@ and accFreeInOp opts op acc = // Things containing just a union case reference | TOp.UnionCaseProof cr | TOp.UnionCase cr + | TOp.UnionCaseFieldGetAddr (cr,_) | TOp.UnionCaseFieldGet (cr,_) | TOp.UnionCaseFieldSet (cr,_) -> accFreeUnionCaseRef opts cr acc @@ -4538,7 +4550,7 @@ and remapExpr g (compgen:ValCopyFlag) (tmenv:Remap) x = List.map (remapMethod g compgen tmenvinner) overrides, List.map (remapInterfaceImpl g compgen tmenvinner) iimpls,m) - // Addresses of immutable field may "leak" across assembly boundaries - see CanTakeAddressOfRecdField below. + // Addresses of immutable field may "leak" across assembly boundaries - see CanTakeAddressOfRecdFieldRef below. // This is "ok", in the sense that it is always valid to fix these up to be uses // of a temporary local, e.g. // &(E.RF) --> let mutable v = E.RF in &v @@ -4552,6 +4564,15 @@ and remapExpr g (compgen:ValCopyFlag) (tmenv:Remap) x = let tmp,_ = mkMutableCompGenLocal m "copyOfStruct" (actualTyOfRecdFieldRef rfref tinst) mkCompGenLet m tmp (mkRecdFieldGetViaExprAddr(arg,rfref,tinst,m)) (mkValAddr m (mkLocalValRef tmp)) + | Expr.Op (TOp.UnionCaseFieldGetAddr (uref,cidx),tinst,[arg],m) when + not (uref.FieldByIndex(cidx).IsMutable) && + not (entityRefInThisAssembly g.compilingFslib uref.TyconRef) -> + + let tinst = remapTypes tmenv tinst + let arg = remapExpr g compgen tmenv arg + let tmp,_ = mkMutableCompGenLocal m "copyOfStruct" (actualTyOfUnionFieldRef uref cidx tinst) + mkCompGenLet m tmp (mkUnionCaseFieldGetProvenViaExprAddr(arg,uref,tinst,cidx,m)) (mkValAddr m (mkLocalValRef tmp)) + | Expr.Op (op,tinst,args,m) -> let op' = remapOp tmenv op let tinst' = remapTypes tmenv tinst @@ -5102,6 +5123,7 @@ let rec tyOfExpr g e = | TOp.ValFieldGet(fref) -> actualTyOfRecdFieldRef fref tinst | (TOp.ValFieldSet _ | TOp.UnionCaseFieldSet _ | TOp.ExnFieldSet _ | TOp.LValueOp ((LSet | LByrefSet),_)) ->g.unit_ty | TOp.UnionCaseTagGet _ -> g.int_ty + | TOp.UnionCaseFieldGetAddr(cref,j) -> mkByrefTy g (actualTyOfRecdField (mkTyconRefInst cref.TyconRef tinst) (cref.FieldByIndex j)) | TOp.UnionCaseFieldGet(cref,j) -> actualTyOfRecdField (mkTyconRefInst cref.TyconRef tinst) (cref.FieldByIndex j) | TOp.ExnFieldGet(ecref,j) -> recdFieldTyOfExnDefRefByIdx ecref j | TOp.LValueOp (LByrefGet, v) -> destByrefTy g v.Type @@ -5326,7 +5348,7 @@ let mkAndSimplifyMatch spBind exprm matchm ty tree targets = //------------------------------------------------------------------------- -// mkExprAddrOfExpr +// mkExprAddrOfExprAux //------------------------------------------------------------------------- type Mutates = DefinitelyMutates | PossiblyMutates | NeverMutates @@ -5370,48 +5392,61 @@ let MustTakeAddressOfVal g (v:ValRef) = // We can only take the address of mutable values in the same assembly valRefInThisAssembly g.compilingFslib v -let MustTakeAddressOfRecdField (rfref: RecdFieldRef) = +let MustTakeAddressOfRecdField (rf: RecdField) = // Static mutable fields must be private, hence we don't have to take their address - not rfref.RecdField.IsStatic && - rfref.RecdField.IsMutable + not rf.IsStatic && + rf.IsMutable -let CanTakeAddressOfRecdField g (rfref: RecdFieldRef) mut tinst = +let MustTakeAddressOfRecdFieldRef (rfref: RecdFieldRef) = MustTakeAddressOfRecdField rfref.RecdField + +let CanTakeAddressOfRecdFieldRef g (rfref: RecdFieldRef) mut tinst = mut <> DefinitelyMutates && // We only do this if the field is defined in this assembly because we can't take adddresses across assemblies for immutable fields entityRefInThisAssembly g.compilingFslib rfref.TyconRef && isRecdOrStuctTyImmutable g (actualTyOfRecdFieldRef rfref tinst) +let CanTakeAddressOfUnionFieldRef g (uref: UnionCaseRef) mut tinst cidx = + mut <> DefinitelyMutates && + // We only do this if the field is defined in this assembly because we can't take adddresses across assemblies for immutable fields + entityRefInThisAssembly g.compilingFslib uref.TyconRef && + isRecdOrStuctTyImmutable g (actualTyOfUnionFieldRef uref cidx tinst) + -let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m = - if not mustTakeAddress then (fun x -> x),e else +let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m = + if not mustTakeAddress then None,e else match e with // LVALUE: "x" where "x" is byref | Expr.Op (TOp.LValueOp (LByrefGet, v), _,[], m) -> - (fun x -> x), exprForValRef m v + None, exprForValRef m v // LVALUE: "x" where "x" is mutable local, mutable intra-assembly module/static binding, or operation doesn't mutate // Note: we can always take the address of mutable values | Expr.Val(v, _,m) when MustTakeAddressOfVal g v || CanTakeAddressOfImmutableVal g v mut -> - (fun x -> x), mkValAddr m v - // LVALUE: "x" where "e.x" is mutable record field. "e" may be an lvalue - | Expr.Op (TOp.ValFieldGet rfref, tinst,[e],m) when MustTakeAddressOfRecdField rfref || CanTakeAddressOfRecdField g rfref mut tinst -> + None, mkValAddr m v + // LVALUE: "x" where "e.x" is record field. + | Expr.Op (TOp.ValFieldGet rfref, tinst,[e],m) when MustTakeAddressOfRecdFieldRef rfref || CanTakeAddressOfRecdFieldRef g rfref mut tinst -> let exprty = tyOfExpr g e - let wrap,expra = mkExprAddrOfExpr g (isStructTy g exprty) false mut e None m + let wrap,expra = mkExprAddrOfExprAux g (isStructTy g exprty) false mut e None m wrap, mkRecdFieldGetAddrViaExprAddr(expra,rfref,tinst,m) + // LVALUE: "x" where "e.x" is union field + | Expr.Op (TOp.UnionCaseFieldGet (uref,cidx), tinst,[e],m) when MustTakeAddressOfRecdField (uref.FieldByIndex(cidx)) || CanTakeAddressOfUnionFieldRef g uref mut tinst cidx -> + let exprty = tyOfExpr g e + let wrap,expra = mkExprAddrOfExprAux g (isStructTy g exprty) false mut e None m + wrap, mkUnionCaseFieldGetAddrProvenViaExprAddr(expra,uref,tinst,cidx,m) // LVALUE: "x" where "e.x" is a .NET static field. | Expr.Op (TOp.ILAsm ([IL.I_ldsfld(_vol,fspec)],[ty2]), tinst,[],m) -> - (fun x -> x),Expr.Op (TOp.ILAsm ([IL.I_ldsflda(fspec)],[mkByrefTy g ty2]), tinst,[],m) + None,Expr.Op (TOp.ILAsm ([IL.I_ldsflda(fspec)],[mkByrefTy g ty2]), tinst,[],m) // LVALUE: "x" where "e.x" is a .NET instance field. "e" may be an lvalue | Expr.Op (TOp.ILAsm ([IL.I_ldfld(_align,_vol,fspec)],[ty2]), tinst,[e],m) -> let exprty = tyOfExpr g e - let wrap,expra = mkExprAddrOfExpr g (isStructTy g exprty) false mut e None m + let wrap,expra = mkExprAddrOfExprAux g (isStructTy g exprty) false mut e None m wrap,Expr.Op (TOp.ILAsm ([IL.I_ldflda(fspec)],[mkByrefTy g ty2]), tinst,[expra],m) // LVALUE: "x" where "x" is mutable static field. - | Expr.Op (TOp.ValFieldGet rfref, tinst,[],m) when MustTakeAddressOfRecdField rfref || CanTakeAddressOfRecdField g rfref mut tinst -> - (fun x -> x), mkStaticRecdFieldGetAddr(rfref,tinst,m) + | Expr.Op (TOp.ValFieldGet rfref, tinst,[],m) when MustTakeAddressOfRecdFieldRef rfref || CanTakeAddressOfRecdFieldRef g rfref mut tinst -> + None, mkStaticRecdFieldGetAddr(rfref,tinst,m) // LVALUE: "e.[n]" where e is an array of structs | Expr.App(Expr.Val(vf,_,_),_,[elemTy],[aexpr;nexpr],_) @@ -5423,7 +5458,7 @@ let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut match addrExprVal with | Some(vf) -> valRefEq g vf g.addrof2_vref | _ -> false - (fun x -> x), Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],[aexpr;nexpr],m) + None, Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],[aexpr;nexpr],m) // LVALUE: "e.[n1,n2]", "e.[n1,n2,n3]", "e.[n1,n2,n3,n4]" where e is an array of structs | Expr.App(Expr.Val(vf,_,_),_,[elemTy],(aexpr::args),_) @@ -5436,7 +5471,7 @@ let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut | Some(vf) -> valRefEq g vf g.addrof2_vref | _ -> false - (fun x -> x), Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],(aexpr::args),m) + None, Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],(aexpr::args),m) // Give a nice error message for DefinitelyMutates on immutable values, or mutable values in other assemblies | Expr.Val(v, _,m) when mut = DefinitelyMutates @@ -5457,15 +5492,24 @@ let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut | PossiblyMutates -> warning(DefensiveCopyWarning(FSComp.SR.tastValueHasBeenCopied(),m)); let tmp,_ = mkMutableCompGenLocal m "copyOfStruct" ty - (fun rest -> mkCompGenLet m tmp e rest), (mkValAddr m (mkLocalValRef tmp)) + Some (tmp,e), (mkValAddr m (mkLocalValRef tmp)) + +let mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m = + let optBind, addre = mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m + match optBind with + | None -> (fun x -> x), addre + | Some (tmp,rval) -> (fun x -> mkCompGenLet m tmp rval x), addre let mkRecdFieldGet g (e,fref:RecdFieldRef,tinst,m) = + assert (not (isByrefTy g (tyOfExpr g e))) let wrap,e' = mkExprAddrOfExpr g fref.Tycon.IsStructOrEnumTycon false NeverMutates e None m wrap (mkRecdFieldGetViaExprAddr(e',fref,tinst,m)) -let mkRecdFieldSet g (e,fref:RecdFieldRef,tinst,e2,m) = - let wrap,e' = mkExprAddrOfExpr g fref.Tycon.IsStructOrEnumTycon false DefinitelyMutates e None m - wrap (mkRecdFieldSetViaExprAddr(e',fref,tinst,e2,m)) +let mkUnionCaseFieldGetUnproven g (e,cref:UnionCaseRef,tinst,j,m) = + assert (not (isByrefTy g (tyOfExpr g e))) + let wrap,e' = mkExprAddrOfExpr g cref.Tycon.IsStructOrEnumTycon false NeverMutates e None m + wrap (mkUnionCaseFieldGetUnprovenViaExprAddr (e',cref,tinst,j,m)) + let mkArray (argty, args, m) = Expr.Op(TOp.Array, [argty],args,m) @@ -5505,12 +5549,13 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr),set) | Expr.Op (TOp.UnionCase (c),tinst,args,m) -> args |> List.iteri (fun n -> IterateRecursiveFixups g None rvs - (mkUnionCaseFieldGetUnproven(access,c,tinst,n,m), + (mkUnionCaseFieldGetUnprovenViaExprAddr (access,c,tinst,n,m), (fun e -> // NICE: it would be better to do this check in the type checker let tcref = c.TyconRef - errorR(Error(FSComp.SR.tastRecursiveValuesMayNotAppearInConstructionOfType(tcref.LogicalName),m)); - mkUnionCaseFieldSet(access,c,tinst,n,e,m)))) + if not (c.FieldByIndex(n)).IsMutable && not (entityRefInThisAssembly g.compilingFslib tcref) then + errorR(Error(FSComp.SR.tastRecursiveValuesMayNotAppearInConstructionOfType(tcref.LogicalName),m)); + mkUnionCaseFieldSet (access,c,tinst,n,e,m)))) | Expr.Op (TOp.Recd (_,tcref),tinst,args,m) -> (tcref.TrueInstanceFieldsAsRefList, args) ||> List.iter2 (fun fref arg -> @@ -5521,7 +5566,7 @@ let rec IterateRecursiveFixups g (selfv : Val option) rvs ((access : Expr),set) // NICE: it would be better to do this check in the type checker if not fspec.IsMutable && not (entityRefInThisAssembly g.compilingFslib tcref) then errorR(Error(FSComp.SR.tastRecursiveValuesMayNotBeAssignedToNonMutableField(fspec.rfield_id.idText, tcref.LogicalName),m)); - mkRecdFieldSet g (access,fref,tinst,e,m))) arg ) + mkRecdFieldSetViaExprAddr (access,fref,tinst,e,m))) arg ) | Expr.Val _ | Expr.Lambda _ | Expr.Obj _ @@ -5850,8 +5895,8 @@ let mkRecordExpr g (lnk,tcref,tinst,rfrefs:RecdFieldRef list,args,m) = //------------------------------------------------------------------------- let mkRefCell g m ty e = mkRecordExpr g (RecdExpr,g.refcell_tcr_canon,[ty],[mkRefCellContentsRef g],[e],m) -let mkRefCellGet g m ty e = mkRecdFieldGet g (e,mkRefCellContentsRef g,[ty],m) -let mkRefCellSet g m ty e1 e2 = mkRecdFieldSet g (e1,mkRefCellContentsRef g,[ty],e2,m) +let mkRefCellGet g m ty e = mkRecdFieldGetViaExprAddr (e,mkRefCellContentsRef g,[ty],m) +let mkRefCellSet g m ty e1 e2 = mkRecdFieldSetViaExprAddr (e1,mkRefCellContentsRef g,[ty],e2,m) let mkNil g m ty = mkUnionCaseExpr (g.nil_ucref,[ty],[],m) let mkCons g ty h t = mkUnionCaseExpr (g.cons_ucref,[ty],[h;t],unionRanges h.Range t.Range) @@ -7843,8 +7888,8 @@ let DetectAndOptimizeForExpression g option expr = let elemTy = destListTy g enumerableTy let guardExpr = mkNonNullTest g m nextExpr - let headOrDefaultExpr = mkUnionCaseFieldGetUnproven(currentExpr,g.cons_ucref,[elemTy],IndexHead,m) - let tailOrNullExpr = mkUnionCaseFieldGetUnproven(currentExpr,g.cons_ucref,[elemTy],IndexTail,mBody) + let headOrDefaultExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr,g.cons_ucref,[elemTy],IndexHead,m) + let tailOrNullExpr = mkUnionCaseFieldGetUnprovenViaExprAddr (currentExpr,g.cons_ucref,[elemTy],IndexTail,mBody) let bodyExpr = mkCompGenLet m elemVar headOrDefaultExpr (mkCompGenSequential mBody diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 912c72872db..651c927bc04 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -188,12 +188,35 @@ val mkStaticRecdFieldGet : RecdFieldRef * TypeInst val mkStaticRecdFieldSet : RecdFieldRef * TypeInst * Expr * range -> Expr val mkStaticRecdFieldGetAddr : RecdFieldRef * TypeInst * range -> Expr val mkRecdFieldSetViaExprAddr : Expr * RecdFieldRef * TypeInst * Expr * range -> Expr -val mkUnionCaseTagGet : Expr * TyconRef * TypeInst * range -> Expr +val mkUnionCaseTagGetViaExprAddr : Expr * TyconRef * TypeInst * range -> Expr + +/// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) val mkUnionCaseProof : Expr * UnionCaseRef * TypeInst * range -> Expr -val mkUnionCaseFieldGetProven : Expr * UnionCaseRef * TypeInst * int * range -> Expr -val mkUnionCaseFieldGetUnproven : Expr * UnionCaseRef * TypeInst * int * range -> Expr -val mkExnCaseFieldGet : Expr * TyconRef * int * range -> Expr + +/// Build a 'TOp.UnionCaseFieldGet' expression for something we've already determined to be a particular union case. For ref-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. +val mkUnionCaseFieldGetProvenViaExprAddr : Expr * UnionCaseRef * TypeInst * int * range -> Expr + +/// Build a 'TOp.UnionCaseFieldGetAddr' expression for a field of a union when we've already determined the value to be a particular union case. For ref-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. +val mkUnionCaseFieldGetAddrProvenViaExprAddr : Expr * UnionCaseRef * TypeInst * int * range -> Expr + +/// Build a 'TOp.UnionCaseFieldGetAddr' expression for a field of a union when we've already determined the value to be a particular union case. For ref-unions, +/// the input expression has 'TType_ucase', which is an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. +val mkUnionCaseFieldGetUnprovenViaExprAddr : Expr * UnionCaseRef * TypeInst * int * range -> Expr + +/// Build a 'TOp.UnionCaseFieldSet' expression. For ref-unions, the input expression has 'TType_ucase', which is +/// an F# compiler internal "type" corresponding to the union case. For struct-unions, +/// the input should be the address of the expression. val mkUnionCaseFieldSet : Expr * UnionCaseRef * TypeInst * int * Expr * range -> Expr + +/// Like mkUnionCaseFieldGetUnprovenViaExprAddr, but for struct-unions, the input should be a copy of the expression. +val mkUnionCaseFieldGetUnproven : TcGlobals -> Expr * UnionCaseRef * TypeInst * int * range -> Expr + +val mkExnCaseFieldGet : Expr * TyconRef * int * range -> Expr val mkExnCaseFieldSet : Expr * TyconRef * int * Expr * range -> Expr //------------------------------------------------------------------------- @@ -217,6 +240,7 @@ val mkGetTupleItemN : TcGlobals -> range -> int -> ILType -> Expr -> TType -> Ex exception DefensiveCopyWarning of string * range type Mutates = DefinitelyMutates | PossiblyMutates | NeverMutates +val mkExprAddrOfExprAux : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Val * Expr) option * Expr val mkExprAddrOfExpr : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Expr -> Expr) * Expr //------------------------------------------------------------------------- @@ -811,7 +835,6 @@ val mkValAddr : range -> ValRef -> Expr //------------------------------------------------------------------------- val mkRecdFieldGet : TcGlobals -> Expr * RecdFieldRef * TypeInst * range -> Expr -val mkRecdFieldSet : TcGlobals -> Expr * RecdFieldRef * TypeInst * Expr * range -> Expr //------------------------------------------------------------------------- // Get the targets used in a decision graph (for reporting warnings) diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 2b68fbb7c57..cf37fbfc193 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -2315,6 +2315,7 @@ and p_op x st = | TOp.ValFieldGetAddr (a) -> p_byte 25 st; p_rfref a st | TOp.UInt16s arr -> p_byte 26 st; p_array p_uint16 arr st | TOp.Reraise -> p_byte 27 st + | TOp.UnionCaseFieldGetAddr (a,b) -> p_byte 28 st; p_tup2 p_ucref p_int (a,b) st | TOp.Goto _ | TOp.Label _ | TOp.Return -> failwith "unexpected backend construct in pickled TAST" #endif @@ -2376,6 +2377,9 @@ and u_op st = TOp.ValFieldGetAddr a | 26 -> TOp.UInt16s (u_array u_uint16 st) | 27 -> TOp.Reraise + | 28 -> let a = u_ucref st + let b = u_int st + TOp.UnionCaseFieldGetAddr (a,b) | _ -> ufailwith st "u_op" #if INCLUDE_METADATA_WRITER diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 5df8b030df1..f9957bc53cf 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2988,7 +2988,8 @@ let BuildRecdFieldSet g m objExpr (rfinfo:RecdFieldInfo) argExpr = let tgty = rfinfo.EnclosingType let valu = isStructTy g tgty let objExpr = if valu then objExpr else mkCoerceExpr(objExpr,tgty,m,tyOfExpr g objExpr) - mkRecdFieldSet g (objExpr,rfinfo.RecdFieldRef,rfinfo.TypeInst,argExpr,m) + let wrap,objExpr = mkExprAddrOfExpr g valu false DefinitelyMutates objExpr None m + wrap (mkRecdFieldSetViaExprAddr (objExpr,rfinfo.RecdFieldRef,rfinfo.TypeInst,argExpr,m) ) //------------------------------------------------------------------------- @@ -3622,7 +3623,7 @@ let CheckAndRewriteObjectCtor g env (ctorLambaExpr:Expr) = let thisTy = tyOfExpr g recdExpr let thisExpr = mkGetArg0 m thisTy let thisTyInst = argsOfAppTy g thisTy - let setExpr = mkRecdFieldSet g (thisExpr, rfref, thisTyInst, mkOne g m, m) + let setExpr = mkRecdFieldSetViaExprAddr (thisExpr, rfref, thisTyInst, mkOne g m, m) Expr.Sequential(recdExpr,setExpr,ThenDoSeq,SuppressSequencePointOnExprOfSequential,m) recdExpr @@ -5657,7 +5658,7 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = | SynExpr.LibraryOnlyUnionCaseFieldGet (e1,c,n,m) -> let e1',ty1,tpenv = TcExprOfUnknownType cenv env tpenv e1 let mkf,ty2 = TcUnionCaseOrExnField cenv env ty1 m c n - ((fun (a,b) n -> mkUnionCaseFieldGetUnproven(e1',a,b,n,m)), + ((fun (a,b) n -> mkUnionCaseFieldGetUnproven cenv.g (e1',a,b,n,m)), (fun a n -> mkExnCaseFieldGet(e1',a,n,m))) UnifyTypes cenv env m overallTy ty2 mkf n,tpenv @@ -5943,18 +5944,19 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = (fname,fieldExpr),tpenv) // Add rebindings for unbound field when an "old value" is available - let oldFldsList = + // Effect order: mutable fields may get modified by other bindings... + let oldFldsList, wrap = match optOrigExpr with - | None -> [] - | Some (_,_,oldve') -> - // When we have an "old" value, append bindings for the unbound fields. - // Effect order - mutable fields may get modified by other bindings... - let fieldNameUnbound nom = List.forall (fun (name,_) -> name <> nom) fldsList - fspecs - |> List.choose (fun rfld -> + | None -> [], id + | Some (_,_,oldve) -> + let wrap,oldveaddr = mkExprAddrOfExpr cenv.g tycon.IsStructOrEnumTycon false NeverMutates oldve None m + let fieldNameUnbound nom = List.forall (fun (name,_) -> name <> nom) fldsList + let flds = + fspecs |> List.choose (fun rfld -> if fieldNameUnbound rfld.Name && not rfld.IsZeroInit - then Some(rfld.Name, mkRecdFieldGet cenv.g (oldve',tcref.MakeNestedRecdFieldRef rfld,tinst,m)) + then Some(rfld.Name, mkRecdFieldGetViaExprAddr (oldveaddr,tcref.MakeNestedRecdFieldRef rfld,tinst,m)) else None) + flds, wrap let fldsList = fldsList @ oldFldsList @@ -5987,7 +5989,7 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = let args = List.map snd fldsList - let expr = mkRecordExpr cenv.g (GetRecdInfo env, tcref, tinst, rfrefs, args, m) + let expr = wrap (mkRecordExpr cenv.g (GetRecdInfo env, tcref, tinst, rfrefs, args, m)) let expr = match optOrigExpr with @@ -5995,10 +5997,10 @@ and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = // '{ recd fields }'. // expr - | Some (old',oldv',_) -> + | Some (old,oldv,_) -> // '{ recd with fields }'. // Assign the first object to a tmp and then construct - mkCompGenLet m oldv' old' expr + mkCompGenLet m oldv old expr expr, tpenv @@ -6437,13 +6439,13 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr let optOrigExpr,tpenv = match optOrigExpr with | None -> None, tpenv - | Some (e, _) -> + | Some (origExpr, _) -> match inherits with | Some (_,_,mInherits, _, _) -> error(Error(FSComp.SR.tcInvalidRecordConstruction(),mInherits)) | None -> - let e',tpenv = TcExpr cenv overallTy env tpenv e - let v',ve' = mkCompGenLocal mWholeExpr "inputRecord" overallTy - Some (e',v',ve'), tpenv + let olde,tpenv = TcExpr cenv overallTy env tpenv origExpr + let oldv,oldve = mkCompGenLocal mWholeExpr "inputRecord" overallTy + Some (olde,oldv,oldve), tpenv let fldsList = let flds = @@ -9272,7 +9274,9 @@ and TcMethodApplication match assignedArg.CalledArg.OptArgInfo with | CallerSide _ -> if isOptCallerArg then - mkUnionCaseFieldGetUnproven(expr,mkSomeCase cenv.g,[destOptionTy cenv.g callerArgTy],0,m) + // STRUCT OPTIONS: if we allow struct options as optional arguments then we should take + // the address correctly. + mkUnionCaseFieldGetUnprovenViaExprAddr (expr,mkSomeCase cenv.g,[destOptionTy cenv.g callerArgTy],0,m) else expr | CalleeSide -> @@ -10915,7 +10919,7 @@ and MakeCheckSafeInitField g tinst thisValOpt rfref reqExpr (expr:Expr) = | None -> mkStaticRecdFieldGet (rfref, tinst, m) | Some thisVar -> // This is an instance method, it must have a 'this' var - mkRecdFieldGet g (exprForVal m thisVar, rfref, tinst, m) + mkRecdFieldGetViaExprAddr (exprForVal m thisVar, rfref, tinst, m) let failureExpr = match thisValOpt with None -> mkCallFailStaticInit g m | Some _ -> mkCallFailInit g m mkCompGenSequential m (mkIfThen g m (mkILAsmClt g m availExpr reqExpr) failureExpr) expr @@ -12050,7 +12054,7 @@ module IncrClassChecking = begin let binders = [ match ctorInfo.InstanceCtorSafeInitInfo with | SafeInitField (rfref, _) -> - let setExpr = mkRecdFieldSet cenv.g (exprForVal m thisVal, rfref, thisTyInst, mkOne cenv.g m, m) + let setExpr = mkRecdFieldSetViaExprAddr (exprForVal m thisVal, rfref, thisTyInst, mkOne cenv.g m, m) let setExpr = reps.FixupIncrClassExprPassC (Some(thisVal)) safeStaticInitInfo thisTyInst setExpr let binder = (fun e -> mkSequential SequencePointsAtSeq setExpr.Range setExpr e) let isPriorToSuperInit = false @@ -13567,7 +13571,7 @@ module EstablishTypeDefinitionCores = begin if hasClassAttr && not (match k with TyconClass -> true | _ -> false) || hasMeasureAttr && not (match k with TyconClass | TyconAbbrev | TyconHiddenRepr -> true | _ -> false) || hasInterfaceAttr && not (match k with TyconInterface -> true | _ -> false) || - hasStructAttr && not (match k with TyconStruct | TyconRecord -> true | _ -> false) then + hasStructAttr && not (match k with TyconStruct | TyconRecord | TyconUnion -> true | _ -> false) then error(Error(FSComp.SR.tcKindOfTypeSpecifiedDoesNotMatchDefinition(),m)) k @@ -13594,13 +13598,14 @@ module EstablishTypeDefinitionCores = begin [ match synTyconRepr with | SynTypeDefnSimpleRepr.None _ -> () | SynTypeDefnSimpleRepr.Union (_,unionCases,_) -> + for (UnionCase (_,_,args,_,_,m)) in unionCases do - match args with - | UnionCaseFields flds -> + match args with + | UnionCaseFields flds -> for (Field(_,_,_,ty,_,_,_,m)) in flds do let ty',_ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty yield (ty',m) - | UnionCaseFullType (ty,arity) -> + | UnionCaseFullType (ty,arity) -> let ty',_ = TcTypeAndRecover cenv NoNewTypars NoCheckCxs ItemOccurence.UseInType env tpenv ty let argtysl,_ = GetTopTauTypeInFSharpForm cenv.g (arity |> TranslateTopValSynInfo m (TcAttributes cenv env) |> TranslatePartialArity []).ArgInfos ty' m if argtysl.Length > 1 then @@ -13638,7 +13643,7 @@ module EstablishTypeDefinitionCores = begin /// but /// - we don't yet 'properly' establish constraints on type parameters let private TcTyconDefnCore_Phase0_BuildInitialTycon cenv env parent (TyconDefnCoreIndexed(synTyconInfo,synTyconRepr,_,preEstablishedHasDefaultCtor,hasSelfReferentialCtor,_)) = - let (ComponentInfo(synAttrs,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo + let (ComponentInfo(_,synTypars, _,id,doc,preferPostfix, vis,_)) = synTyconInfo let checkedTypars = TcTyparDecls cenv env synTypars id |> List.iter (CheckNamespaceModuleOrTypeName cenv.g) let id = ComputeTyconName (id, (match synTyconRepr with SynTypeDefnSimpleRepr.TypeAbbrev _ -> false | _ -> true), checkedTypars) @@ -13667,15 +13672,7 @@ module EstablishTypeDefinitionCores = begin // If we supported nested types and modules then additions would be needed here let lmtyp = notlazy (NewEmptyModuleOrNamespaceType ModuleOrType) - let isStructRecordType = - match synTyconRepr with - | SynTypeDefnSimpleRepr.Record _ -> - let attrs = TcAttributes cenv env AttributeTargets.TyconDecl synAttrs - HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs - | _ -> - false - - NewTycon(cpath, id.idText, id.idRange, vis, visOfRepr, TyparKind.Type, LazyWithContext.NotLazy checkedTypars, doc.ToXmlDoc(), preferPostfix, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType, lmtyp) + NewTycon(cpath, id.idText, id.idRange, vis, visOfRepr, TyparKind.Type, LazyWithContext.NotLazy checkedTypars, doc.ToXmlDoc(), preferPostfix, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, lmtyp) //------------------------------------------------------------------------- /// Establishing type definitions: early phase: work out the basic kind of the type definition @@ -13697,6 +13694,16 @@ module EstablishTypeDefinitionCores = begin let attrs = TcAttributes cenv envinner AttributeTargets.TyconDecl synAttrs let hasMeasureAttr = HasFSharpAttribute cenv.g cenv.g.attrib_MeasureAttribute attrs + let isStructRecordOrUnionType = + match synTyconRepr with + | SynTypeDefnSimpleRepr.Record _ + | SynTypeDefnSimpleRepr.Union _ -> + HasFSharpAttribute cenv.g cenv.g.attrib_StructAttribute attrs + | _ -> + false + + tycon.SetIsStructRecordOrUnion isStructRecordOrUnionType + // Set the compiled name, if any tycon.Data.entity_compiled_name <- TryFindFSharpStringAttribute cenv.g cenv.g.attrib_CompiledNameAttribute attrs @@ -14088,10 +14095,10 @@ module EstablishTypeDefinitionCores = begin match synTyconRepr with | SynTypeDefnSimpleRepr.None _ -> None | SynTypeDefnSimpleRepr.TypeAbbrev _ -> None - | SynTypeDefnSimpleRepr.Union _ -> None | SynTypeDefnSimpleRepr.LibraryOnlyILAssembly _ -> None + | SynTypeDefnSimpleRepr.Union _ | SynTypeDefnSimpleRepr.Record _ -> - if tycon.IsStructRecordTycon then Some(cenv.g.system_Value_typ) + if tycon.IsStructRecordOrUnionTycon then Some(cenv.g.system_Value_typ) else None | SynTypeDefnSimpleRepr.General (kind,_,slotsigs,fields,isConcrete,_,_,_) -> let kind = InferTyconKind cenv.g (kind,attrs,slotsigs,fields,inSig,isConcrete,m) @@ -14286,6 +14293,10 @@ module EstablishTypeDefinitionCores = begin noAllowNullLiteralAttributeCheck() structLayoutAttributeCheck(false) let unionCases = TcRecdUnionAndEnumDeclarations.TcUnionCaseDecls cenv envinner innerParent thisTy tpenv unionCases + + if tycon.IsStructRecordOrUnionTycon && unionCases.Length > 1 then + errorR(Error(FSComp.SR.tcStructUnionMultiCase(),m)) + writeFakeUnionCtorsToSink unionCases MakeUnionRepr unionCases, None, NoSafeInitInfo @@ -14622,11 +14633,18 @@ module EstablishTypeDefinitionCores = begin else // Only collect once from each type instance. let doneTypes = ty :: doneTypes - let fspecs = structTycon.AllFieldsAsList |> List.filter (fun fspec -> includeStaticFields || not fspec.IsStatic) + let fspecs = + if structTycon.IsUnionTycon then + [ for uc in structTycon.UnionCasesArray do + for c in uc.FieldTable.AllFieldsAsList do + yield c] + else + structTycon.AllFieldsAsList + let fspecs = fspecs |> List.filter (fun fspec -> includeStaticFields || not fspec.IsStatic) let doneTypes,acc = List.foldBack (accStructField structTycon tinst) fspecs (doneTypes,acc) doneTypes,acc and accStructInstanceFields ty structTycon tinst (doneTypes,acc) = accStructFields false ty structTycon tinst (doneTypes,acc) - and accStructAllFields ty structTycon tinst (doneTypes,acc) = accStructFields true ty structTycon tinst (doneTypes,acc) + and accStructAllFields ty (structTycon: Tycon) tinst (doneTypes,acc) = accStructFields true ty structTycon tinst (doneTypes,acc) let acc = [] let acc = diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 93d8287315d..76e45b9b815 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -87,7 +87,7 @@ let GetSuperTypeOfType g amap m typ = Some g.obj_ty elif isTupleStructTy g typ then Some g.obj_ty - elif isRecdTy g typ then + elif isRecdTy g typ || isUnionTy g typ then Some g.obj_ty else None diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 962181713ab..c3154c8eb7b 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -350,12 +350,12 @@ type TyparFlags(flags:int32) = [] type EntityFlags(flags:int64) = - new (usesPrefixDisplay, isModuleOrNamespace, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType) = + new (usesPrefixDisplay, isModuleOrNamespace, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordOrUnionType) = EntityFlags((if isModuleOrNamespace then 0b00000000001L else 0L) ||| (if usesPrefixDisplay then 0b00000000010L else 0L) ||| (if preEstablishedHasDefaultCtor then 0b00000000100L else 0L) ||| (if hasSelfReferentialCtor then 0b00000001000L else 0L) ||| - (if isStructRecordType then 0b00000100000L else 0L)) + (if isStructRecordOrUnionType then 0b00000100000L else 0L)) member x.IsModuleOrNamespace = (flags &&& 0b00000000001L) <> 0x0L member x.IsPrefixDisplay = (flags &&& 0b00000000010L) <> 0x0L @@ -370,7 +370,7 @@ type EntityFlags(flags:int64) = member x.HasSelfReferentialConstructor = (flags &&& 0b00000001000L) <> 0x0L /// This bit represents a F# record that is a value type, or a struct record. - member x.IsStructRecordType = (flags &&& 0b00000100000L) <> 0x0L + member x.IsStructRecordOrUnionType = (flags &&& 0b00000100000L) <> 0x0L /// This bit is reserved for us in the pickle format, see pickle.fs, it's bing listed here to stop it ever being used for anything else static member ReservedBitForPickleFormatTyconReprFlag = 0b00000010000L @@ -776,7 +776,7 @@ type Entity = member x.IsRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> true | _ -> false /// Indicates if this is an F# type definition whose r.h.s. is known to be a record type definition that is a value type. - member x.IsStructRecordTycon = match x.TypeReprInfo with | TRecdRepr _ -> x.Data.entity_flags.IsStructRecordType | _ -> false + member x.IsStructRecordOrUnionTycon = match x.TypeReprInfo with TRecdRepr _ | TUnionRepr _ -> x.Data.entity_flags.IsStructRecordOrUnionType | _ -> false /// Indicates if this is an F# type definition whose r.h.s. is known to be some kind of F# object model definition member x.IsFSharpObjectModelTycon = match x.TypeReprInfo with | TFSharpObjectRepr _ -> true | _ -> false @@ -822,7 +822,8 @@ type Entity = /// Indicates if this is an F#-defined struct or enum type definition , i.e. a value type definition member x.IsFSharpStructOrEnumTycon = match x.TypeReprInfo with - | TRecdRepr _ -> x.IsStructRecordTycon + | TRecdRepr _ -> x.IsStructRecordOrUnionTycon + | TUnionRepr _ -> x.IsStructRecordOrUnionTycon | TFSharpObjectRepr info -> match info.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> false @@ -963,6 +964,9 @@ type Entity = /// Set the custom attributes on an F# type definition. member x.SetAttribs attribs = x.Data.entity_attribs <- attribs + /// Sets the structness of a record or union type definition + member x.SetIsStructRecordOrUnion b = let x = x.Data in let flags = x.entity_flags in x.entity_flags <- EntityFlags(flags.IsPrefixDisplay, flags.IsModuleOrNamespace, flags.PreEstablishedHasDefaultConstructor, flags.HasSelfReferentialConstructor, b) + and @@ -1731,7 +1735,7 @@ and Construct = entity_kind=kind entity_range=m entity_other_range=None - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordType=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordOrUnionType=false) entity_attribs=[] // fetched on demand via est.fs API entity_typars= LazyWithContext.NotLazy [] entity_tycon_abbrev = None @@ -1760,7 +1764,7 @@ and Construct = entity_stamp=stamp entity_kind=TyparKind.Type entity_modul_contents = mtype - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false,isStructRecordType=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=true, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false,isStructRecordOrUnionType=false) entity_typars=LazyWithContext.NotLazy [] entity_tycon_abbrev = None entity_tycon_repr = TNoRepr @@ -3574,15 +3578,16 @@ and /// TDSwitch(input, cases, default, range) /// /// Indicates a decision point in a decision tree. - /// input -- the expression being tested - /// cases -- the list of tests and their subsequent decision trees - /// default -- the default decision tree, if any + /// input -- The expression being tested. If switching over a struct union this + /// must be the address of the expression being tested. + /// cases -- The list of tests and their subsequent decision trees + /// default -- The default decision tree, if any /// range -- (precise documentation needed) | TDSwitch of Expr * DecisionTreeCase list * DecisionTree option * range /// TDSuccess(results, targets) /// - /// Indicates the decision tree has terminated with success, calling the given target with the given parameters. + /// Indicates the decision tree has terminated with success, transferring control to the given target with the given parameters. /// results -- the expressions to be bound to the variables at the target /// target -- the target number for the continuation | TDSuccess of FlatExprs * int @@ -3826,6 +3831,8 @@ and | UnionCaseProof of UnionCaseRef /// An operation representing a field-get from a union value, where that value has been proven to be of the corresponding union case. | UnionCaseFieldGet of UnionCaseRef * int + /// An operation representing a field-get from a union value, where that value has been proven to be of the corresponding union case. + | UnionCaseFieldGetAddr of UnionCaseRef * int /// An operation representing a field-get from a union value. The value is not assumed to have been proven to be of the corresponding union case. | UnionCaseFieldSet of UnionCaseRef * int /// An operation representing a field-get from an F# exception value. @@ -4568,7 +4575,7 @@ let NewExn cpath (id:Ident) access repr attribs doc = entity_typars=LazyWithContext.NotLazy [] entity_tycon_abbrev = None entity_tycon_repr = TNoRepr - entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordType=false) + entity_flags=EntityFlags(usesPrefixDisplay=false, isModuleOrNamespace=false, preEstablishedHasDefaultCtor=false, hasSelfReferentialCtor=false, isStructRecordOrUnionType=false) entity_il_repr_cache= newCache() } let NewRecdField stat konst id ty isMutable isVolatile pattribs fattribs docOption access secret = @@ -4587,7 +4594,7 @@ let NewRecdField stat konst id ty isMutable isVolatile pattribs fattribs docOpt rfield_other_range = None } -let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPrefixDisplay, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, isStructRecordType, mtyp) = +let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPrefixDisplay, preEstablishedHasDefaultCtor, hasSelfReferentialCtor, mtyp) = let stamp = newStamp() Tycon.New "tycon" { entity_stamp=stamp @@ -4596,7 +4603,7 @@ let NewTycon (cpath, nm, m, access, reprAccess, kind, typars, docOption, usesPre entity_kind=kind entity_range=m entity_other_range=None - entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor, isStructRecordType=isStructRecordType) + entity_flags=EntityFlags(usesPrefixDisplay=usesPrefixDisplay, isModuleOrNamespace=false,preEstablishedHasDefaultCtor=preEstablishedHasDefaultCtor, hasSelfReferentialCtor=hasSelfReferentialCtor, isStructRecordOrUnionType=false) entity_attribs=[] // fixed up after entity_typars=typars entity_tycon_abbrev = None @@ -4617,7 +4624,7 @@ let NewILTycon nlpath (nm,m) tps (scoref:ILScopeRef, enc, tdef:ILTypeDef) mtyp = // NOTE: hasSelfReferentialCtor=false is an assumption about mscorlib let hasSelfReferentialCtor = tdef.IsClass && (not scoref.IsAssemblyRef && scoref.AssemblyRef.Name = "mscorlib") - let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, false, mtyp) + let tycon = NewTycon(nlpath, nm, m, taccessPublic, taccessPublic, TyparKind.Type, tps, XmlDoc.Empty, true, false, hasSelfReferentialCtor, mtyp) tycon.Data.entity_tycon_repr <- TILObjectRepr (scoref,enc,tdef) tycon.TypeContents.tcaug_closed <- true diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index fac033126f9..c4cdfab0625 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -39,8 +39,7 @@ type DiscriminationTechnique = // class (no subclasses), but an integer tag is stored to discriminate between the objects. | IntegerTag -// FLATTEN_SINGLE_NON_NULLARY_AND_ALWAYS_USE_TAGS looks like a useful representation -// optimization - it trades an extra integer tag in the root type +// A potentially useful additional representation trades an extra integer tag in the root type // for faster discrimination, and in the important single-non-nullary constructor case // // type Tree = Tip | Node of int * Tree * Tree @@ -60,14 +59,15 @@ type UnionReprDecisions<'Union,'Alt,'Type> nullPermitted:'Union->bool, isNullary:'Alt->bool, isList:'Union->bool, + isStruct:'Union->bool, nameOfAlt : 'Alt -> string, makeRootType: 'Union -> 'Type, makeNestedType: 'Union * string -> 'Type) = static let TaggingThresholdFixedConstant = 4 - member repr.OptimizeAllAlternativesToConstantFieldsInRootClass cu = - Array.forall isNullary (getAlternatives cu) + member repr.RepresentAllAlternativesAsConstantFieldsInRootClass cu = + cu |> getAlternatives |> Array.forall isNullary member repr.DiscriminationTechnique cu = if isList cu then @@ -77,18 +77,15 @@ type UnionReprDecisions<'Union,'Alt,'Type> if alts.Length = 1 then SingleCase elif -#if FLATTEN_SINGLE_NON_NULLARY_AND_ALWAYS_USE_TAGS - nullPermitted cu then -#else + not (isStruct cu) && alts.Length < TaggingThresholdFixedConstant && - not (repr.OptimizeAllAlternativesToConstantFieldsInRootClass cu) then -#endif + not (repr.RepresentAllAlternativesAsConstantFieldsInRootClass cu) then RuntimeTypes else IntegerTag // WARNING: this must match IsUnionTypeWithNullAsTrueValue in the F# compiler - member repr.OptimizeAlternativeToNull (cu,alt) = + member repr.RepresentAlternativeAsNull (cu,alt) = let alts = getAlternatives cu nullPermitted cu && (repr.DiscriminationTechnique cu = RuntimeTypes) && (* don't use null for tags, lists or single-case *) @@ -96,54 +93,52 @@ type UnionReprDecisions<'Union,'Alt,'Type> Array.exists (isNullary >> not) alts && isNullary alt (* is this the one? *) - member repr.OptimizingOneAlternativeToNull cu = + member repr.RepresentOneAlternativeAsNull cu = let alts = getAlternatives cu nullPermitted cu && - alts |> Array.existsOne (fun alt -> repr.OptimizeAlternativeToNull (cu,alt)) + alts |> Array.existsOne (fun alt -> repr.RepresentAlternativeAsNull (cu,alt)) - member repr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cu,alt) = + member repr.RepresentSingleNonNullaryAlternativeAsInstancesOfRootClassAndAnyOtherAlternativesAsNull (cu,alt) = // Check all nullary constructors are being represented without using sub-classes let alts = getAlternatives cu + not (isStruct cu) && not (isNullary alt) && - (alts |> Array.forall (fun alt2 -> not (isNullary alt2) || repr.OptimizeAlternativeToNull (cu,alt2))) && + (alts |> Array.forall (fun alt2 -> not (isNullary alt2) || repr.RepresentAlternativeAsNull (cu,alt2))) && // Check this is the one and only non-nullary constructor Array.existsOne (isNullary >> not) alts -#if FLATTEN_SINGLE_NON_NULLARY_AND_ALWAYS_USE_TAGS - member repr.OptimizeSingleNonNullaryAlternativeToRootClassAndOtherAlternativesToTagged (cu,alt) = - let alts = getAlternatives cu - not (isNullary alt) && - alts.Length > 1 && - Array.existsOne (isNullary >> not) alts && - not (nullPermitted cu) -#endif - - member repr.OptimizeSingleNonNullaryAlternativeToRootClass (cu,alt) = + member repr.RepresentAlternativeAsFreshInstancesOfRootClass (cu,alt) = + // Flattening + isStruct cu || // Check all nullary constructors are being represented without using sub-classes (isList cu && nameOfAlt alt = ALT_NAME_CONS) || - repr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cu, alt) -#if FLATTEN_SINGLE_NON_NULLARY_AND_ALWAYS_USE_TAGS - repr.OptimizeSingleNonNullaryAlternativeToRootClassAndOtherAlternativesToTagged (cu,alt) -#endif + repr.RepresentSingleNonNullaryAlternativeAsInstancesOfRootClassAndAnyOtherAlternativesAsNull (cu, alt) - member repr.OptimizeAlternativeToConstantFieldInTaggedRootClass (cu,alt) = + member repr.RepresentAlternativeAsConstantFieldInTaggedRootClass (cu,alt) = + not (isStruct cu) && isNullary alt && - not (repr.OptimizeAlternativeToNull (cu,alt)) && + not (repr.RepresentAlternativeAsNull (cu,alt)) && (repr.DiscriminationTechnique cu <> RuntimeTypes) + member repr.Flatten cu = + isStruct cu + member repr.OptimizeAlternativeToRootClass (cu,alt) = // The list type always collapses to the root class isList cu || - repr.OptimizeAllAlternativesToConstantFieldsInRootClass cu || - repr.OptimizeAlternativeToConstantFieldInTaggedRootClass (cu,alt) || - repr.OptimizeSingleNonNullaryAlternativeToRootClass(cu,alt) + // Structs are always flattened + repr.Flatten cu || + repr.RepresentAllAlternativesAsConstantFieldsInRootClass cu || + repr.RepresentAlternativeAsConstantFieldInTaggedRootClass (cu,alt) || + repr.RepresentAlternativeAsFreshInstancesOfRootClass(cu,alt) member repr.MaintainPossiblyUniqueConstantFieldForAlternative(cu,alt) = - not (repr.OptimizeAlternativeToNull (cu,alt)) && + not (isStruct cu) && + not (repr.RepresentAlternativeAsNull (cu,alt)) && isNullary alt member repr.TypeForAlternative (cuspec,alt) = - if repr.OptimizeAlternativeToRootClass (cuspec,alt) || repr.OptimizeAlternativeToNull (cuspec,alt) then + if repr.OptimizeAlternativeToRootClass (cuspec,alt) || repr.RepresentAlternativeAsNull (cuspec,alt) then makeRootType cuspec else let altName = nameOfAlt alt @@ -153,7 +148,7 @@ type UnionReprDecisions<'Union,'Alt,'Type> let baseTyOfUnionSpec (cuspec : IlxUnionSpec) = - mkILBoxedTyRaw cuspec.TypeRef cuspec.GenericArgs + mkILNamedTyRaw cuspec.Boxity cuspec.TypeRef cuspec.GenericArgs let mkMakerName (cuspec: IlxUnionSpec) nm = match cuspec.HasHelpers with @@ -170,9 +165,10 @@ let cuspecRepr = (fun (cuspec:IlxUnionSpec) -> cuspec.IsNullPermitted), (fun (alt:IlxUnionAlternative) -> alt.IsNullary), (fun cuspec -> cuspec.HasHelpers = IlxUnionHasHelpers.SpecialFSharpListHelpers), + (fun cuspec -> cuspec.Boxity = ILBoxity.AsValue), (fun (alt:IlxUnionAlternative) -> alt.Name), - (fun cuspec -> mkILBoxedTyRaw cuspec.TypeRef cuspec.GenericArgs), - (fun (cuspec,nm) -> mkILBoxedTyRaw (mkILTyRefInTyRef (mkCasesTypeRef cuspec, nm)) cuspec.GenericArgs)) + (fun cuspec -> cuspec.EnclosingType), + (fun (cuspec,nm) -> mkILNamedTyRaw cuspec.Boxity (mkILTyRefInTyRef (mkCasesTypeRef cuspec, nm)) cuspec.GenericArgs)) type NoTypesGeneratedViaThisReprDecider = NoTypesGeneratedViaThisReprDecider let cudefRepr = @@ -181,6 +177,7 @@ let cudefRepr = (fun (_td,cud) -> cud.cudNullPermitted), (fun (alt:IlxUnionAlternative) -> alt.IsNullary), (fun (_td,cud) -> cud.cudHasHelpers = IlxUnionHasHelpers.SpecialFSharpListHelpers), + (fun (td,_cud) -> match td.tdKind with ILTypeDefKind.ValueType -> true | _ -> false), (fun (alt:IlxUnionAlternative) -> alt.Name), (fun (_td,_cud) -> NoTypesGeneratedViaThisReprDecider), (fun ((_td,_cud),_nm) -> NoTypesGeneratedViaThisReprDecider)) @@ -198,7 +195,7 @@ let refToFieldInTy ty (nm, fldTy) = mkILFieldSpecInTy (ty, nm, fldTy) let formalTypeArgs (baseTy:ILType) = ILList.mapi (fun i _ -> mkILTyvarTy (uint16 i)) baseTy.GenericArgs let constFieldName nm = "_unique_" + nm let constFormalFieldTy (baseTy:ILType) = - ILType.Boxed (mkILTySpecRaw (baseTy.TypeRef, formalTypeArgs baseTy)) + mkILNamedTyRaw baseTy.Boxity baseTy.TypeRef (formalTypeArgs baseTy) let mkConstFieldSpecFromId (baseTy:ILType) constFieldId = refToFieldInTy baseTy constFieldId @@ -265,13 +262,22 @@ let mkLdData (avoidHelpers, cuspec, cidx, fidx) = else [ mkNormalCall (mkILNonGenericInstanceMethSpecInTy(altTy,"get_" + adjustFieldName cuspec.HasHelpers fieldDef.Name,[],fieldDef.Type)) ] +let mkLdDataAddr (avoidHelpers, cuspec, cidx, fidx) = + let alt = altOfUnionSpec cuspec cidx + let altTy = tyForAlt cuspec alt + let fieldDef = alt.FieldDef fidx + if avoidHelpers then + [ mkNormalLdflda (mkILFieldSpecInTy(altTy,fieldDef.LowerName, fieldDef.Type)) ] + else + failwith (sprintf "can't load address using helpers, for fieldDef %s" fieldDef.LowerName) + let mkGetTailOrNull avoidHelpers cuspec = mkLdData (avoidHelpers, cuspec, 1, 1) (* tail is in alternative 1, field number 1 *) let mkGetTagFromHelpers ilg (cuspec: IlxUnionSpec) = let baseTy = baseTyOfUnionSpec cuspec - if cuspecRepr.OptimizingOneAlternativeToNull cuspec then + if cuspecRepr.RepresentOneAlternativeAsNull cuspec then mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "Get" + tagPropertyName, [baseTy], mkTagFieldFormalType ilg cuspec)) else mkNormalCall (mkILNonGenericInstanceMethSpecInTy(baseTy, "get_" + tagPropertyName, [], mkTagFieldFormalType ilg cuspec)) @@ -289,32 +295,29 @@ let mkCeqThen after = let mkTagDiscriminate ilg cuspec _baseTy cidx = - mkGetTag ilg cuspec - @ [ mkLdcInt32 cidx - AI_ceq ] + mkGetTag ilg cuspec @ [ mkLdcInt32 cidx; AI_ceq ] let mkTagDiscriminateThen ilg cuspec cidx after = - mkGetTag ilg cuspec - @ [ mkLdcInt32 cidx ] - @ mkCeqThen after + mkGetTag ilg cuspec @ [ mkLdcInt32 cidx ] @ mkCeqThen after let convNewDataInstrInternal ilg cuspec cidx = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let altName = alt.Name - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) then [ AI_ldnull ] elif cuspecRepr.MaintainPossiblyUniqueConstantFieldForAlternative (cuspec,alt) then let baseTy = baseTyOfUnionSpec cuspec [ I_ldsfld (Nonvolatile,mkConstFieldSpec altName baseTy) ] - elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + elif cuspecRepr.RepresentAlternativeAsFreshInstancesOfRootClass (cuspec,alt) then let baseTy = baseTyOfUnionSpec cuspec let instrs, tagfields = match cuspecRepr.DiscriminationTechnique cuspec with | IntegerTag -> [ mkLdcInt32 cidx ], [mkTagFieldType ilg cuspec] | _ -> [], [] - instrs @ [ mkNormalNewobj(mkILCtorMethSpecForTy (baseTy,(Array.toList alt.FieldTypes @ tagfields))) ] + let ctorFieldTys = alt.FieldTypes |> Array.toList + instrs @ [ mkNormalNewobj(mkILCtorMethSpecForTy (baseTy,(ctorFieldTys @ tagfields))) ] else [ mkNormalNewobj(mkILCtorMethSpecForTy (altTy,Array.toList alt.FieldTypes)) ] @@ -334,7 +337,7 @@ let mkNewData ilg (cuspec, cidx) = | AllHelpers | SpecialFSharpListHelpers | SpecialFSharpOptionHelpers -> - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) then [ AI_ldnull ] elif alt.IsNullary then [ mkNormalCall (mkILNonGenericStaticMethSpecInTy (baseTy, "get_" + altName, [], constFormalFieldTy baseTy)) ] @@ -353,9 +356,9 @@ let mkIsData ilg (avoidHelpers, cuspec, cidx) = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let altName = alt.Name - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) then [ AI_ldnull; AI_ceq ] - elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then + elif cuspecRepr.RepresentSingleNonNullaryAlternativeAsInstancesOfRootClassAndAnyOtherAlternativesAsNull (cuspec,alt) then // in this case we can use a null test [ AI_ldnull; AI_cgt_un ] else @@ -377,7 +380,6 @@ type ICodeGen<'Mark> = abstract EmitInstr : ILInstr -> unit abstract EmitInstrs : ILInstr list -> unit -// TODO: this will be removed let genWith g : ILCode = let instrs = ResizeArray() let lab2pc = Dictionary() @@ -399,9 +401,9 @@ let mkBrIsNotData ilg (avoidHelpers, cuspec,cidx,tg) = let alt = altOfUnionSpec cuspec cidx let altTy = tyForAlt cuspec alt let altName = alt.Name - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) then [ I_brcmp (BI_brtrue,tg) ] - elif cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClassAndAnyOtherAlternativesToNull (cuspec,alt) then + elif cuspecRepr.RepresentSingleNonNullaryAlternativeAsInstancesOfRootClassAndAnyOtherAlternativesAsNull (cuspec,alt) then // in this case we can use a null test [ I_brcmp (BI_brfalse,tg) ] else @@ -454,10 +456,10 @@ let emitLdDataTagPrim ilg ldOpt (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxU let alt = altOfUnionSpec cuspec cidx let internalLab = cg.GenerateDelayMark() let failLab = cg.GenerateDelayMark () - let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec, alt) + let cmpNull = cuspecRepr.RepresentAlternativeAsNull (cuspec, alt) let test = I_brcmp ((if cmpNull then BI_brtrue else BI_brfalse),cg.CodeLabel failLab) let testBlock = - if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + if cmpNull || cuspecRepr.RepresentAlternativeAsFreshInstancesOfRootClass (cuspec,alt) then [ test ] else let altName = alt.Name @@ -479,9 +481,9 @@ let emitLdDataTagPrim ilg ldOpt (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxU let emitLdDataTag ilg (cg: ICodeGen<'Mark>) (avoidHelpers,cuspec: IlxUnionSpec) = emitLdDataTagPrim ilg None cg (avoidHelpers,cuspec) -let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = +let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,avoidHelpers,cuspec,cidx) = let alt = altOfUnionSpec cuspec cidx - if cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) then + if cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) then if canfail then let outlab = cg.GenerateDelayMark () let internal1 = cg.GenerateDelayMark () @@ -489,7 +491,22 @@ let emitCastData ilg (cg: ICodeGen<'Mark>) (canfail,cuspec,cidx) = cg.SetMarkToHere internal1 cg.EmitInstrs [mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ] cg.SetMarkToHere outlab - // If it can't fail, it's still verifiable just to leave the value on the stack unchecked + else + // If it can't fail, it's still verifiable just to leave the value on the stack unchecked + () + elif cuspecRepr.Flatten cuspec then + if canfail then + let outlab = cg.GenerateDelayMark () + let internal1 = cg.GenerateDelayMark () + cg.EmitInstrs [ AI_dup ] + emitLdDataTagPrim ilg None cg (avoidHelpers,cuspec) + cg.EmitInstrs [ mkLdcInt32 cidx; I_brcmp (BI_beq, cg.CodeLabel outlab) ] + cg.SetMarkToHere internal1 + cg.EmitInstrs [mkPrimaryAssemblyExnNewobj ilg "System.InvalidCastException"; I_throw ] + cg.SetMarkToHere outlab + else + // If it can't fail, it's still verifiable just to leave the value on the stack unchecked + () elif cuspecRepr.OptimizeAlternativeToRootClass (cuspec,alt) then () else @@ -510,11 +527,11 @@ let emitDataSwitch ilg (cg: ICodeGen<'Mark>) (avoidHelpers, cuspec, cases) = let altTy = tyForAlt cuspec alt let altName = alt.Name let failLab = cg.GenerateDelayMark () - let cmpNull = cuspecRepr.OptimizeAlternativeToNull (cuspec,alt) + let cmpNull = cuspecRepr.RepresentAlternativeAsNull (cuspec,alt) cg.EmitInstr (mkLdloc locn) let testInstr = I_brcmp ((if cmpNull then BI_brfalse else BI_brtrue),tg) - if cmpNull || cuspecRepr.OptimizeSingleNonNullaryAlternativeToRootClass (cuspec,alt) then + if cmpNull || cuspecRepr.RepresentAlternativeAsFreshInstancesOfRootClass (cuspec,alt) then cg.EmitInstr testInstr else cg.EmitInstrs (mkRuntimeTypeDiscriminateThen ilg avoidHelpers cuspec alt altName altTy testInstr) @@ -644,7 +661,7 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a let baseTesterMeths, baseTesterProps = if cud.cudAlternatives.Length <= 1 then [], [] - elif repr.OptimizingOneAlternativeToNull info then [], [] + elif repr.RepresentOneAlternativeAsNull info then [], [] else [ mkILNonGenericInstanceMethod ("get_" + mkTesterName altName, @@ -719,8 +736,8 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a [], [] let typeDefs, altDebugTypeDefs, altNullaryFields = - if repr.OptimizeAlternativeToNull (info,alt) then [], [], [] - elif repr.OptimizeSingleNonNullaryAlternativeToRootClass (info,alt) then [], [], [] + if repr.RepresentAlternativeAsNull (info,alt) then [], [], [] + elif repr.RepresentAlternativeAsFreshInstancesOfRootClass (info,alt) then [], [], [] else let altNullaryFields = if repr.MaintainPossiblyUniqueConstantFieldForAlternative(info,alt) then @@ -770,7 +787,8 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a mkMethodBody(true,emptyILLocals,2, nonBranchingInstrsToCode [ mkLdarg0 - mkNormalLdfld (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)) + (match td.tdKind with ILTypeDefKind.ValueType -> mkNormalLdflda | _ -> mkNormalLdfld) + (mkILFieldSpecInTy (debugProxyTy,debugProxyFieldName,altTy)) mkNormalLdfld (mkILFieldSpecInTy(altTy,fldName,fldTy))],None)) |> addMethodGeneratedAttrs ilg) |> Array.toList @@ -863,8 +881,9 @@ let convAlternativeDef ilg num (td:ILTypeDef) cud info cuspec (baseTy:ILType) (a let mkClassUnionDef ilg tref td cud = - let baseTy = mkILFormalBoxedTy tref td.GenericParams - let cuspec = IlxUnionSpec(IlxUnionRef(baseTy.TypeRef, cud.cudAlternatives, cud.cudNullPermitted, cud.cudHasHelpers), baseTy.GenericArgs) + let boxity = match td.tdKind with ILTypeDefKind.ValueType -> ILBoxity.AsValue | _ -> ILBoxity.AsObject + let baseTy = mkILFormalNamedTy boxity tref td.GenericParams + let cuspec = IlxUnionSpec(IlxUnionRef(boxity,baseTy.TypeRef, cud.cudAlternatives, cud.cudNullPermitted, cud.cudHasHelpers), baseTy.GenericArgs) let info = (td,cud) let repr = cudefRepr let isTotallyImmutable = (cud.cudHasHelpers <> SpecialFSharpListHelpers) @@ -886,24 +905,33 @@ let mkClassUnionDef ilg tref td cud = | SingleCase | RuntimeTypes | TailOrNull -> [] | IntegerTag -> [ mkTagFieldId ilg cuspec ] - let selfFields, selfMeths, selfProps, _ = - match cud.cudAlternatives |> Array.toList |> List.findi 0 (fun alt -> repr.OptimizeSingleNonNullaryAlternativeToRootClass (info,alt)) with - | Some (alt,altNum) -> - let fields = (alt.FieldDefs |> Array.toList |> List.map mkUnionCaseFieldId) + let selfFields, selfMeths, selfProps = + + [ for alt in cud.cudAlternatives do + if repr.RepresentAlternativeAsFreshInstancesOfRootClass (info,alt) then + // TODO + let fields = alt.FieldDefs |> Array.toList |> List.map mkUnionCaseFieldId + let baseInit = + match td.tdKind with + | ILTypeDefKind.ValueType -> None + | _ -> + match td.Extends with + | None -> Some ilg.tspec_Object + | Some typ -> Some typ.TypeSpec + let ctor = mkILSimpleStorageCtor (cud.cudWhere, - (match td.Extends with None -> Some ilg.tspec_Object | Some typ -> Some typ.TypeSpec), + baseInit, baseTy, (fields @ tagFieldsInObject), (if cuspec.HasHelpers = AllHelpers then ILMemberAccess.Assembly else cud.cudReprAccess)) |> addMethodGeneratedAttrs ilg let props, meths = mkMethodsAndPropertiesForFields ilg cud.cudReprAccess cud.cudWhere cud.cudHasHelpers baseTy alt.FieldDefs - fields,([ctor] @ meths),props,altNum - - | None -> - [],[],[],0 + yield (fields,([ctor] @ meths),props) ] + |> List.unzip3 + |> (fun (a,b,c) -> List.concat a, List.concat b, List.concat c) let selfAndTagFields = [ for (fldName,fldTy) in (selfFields @ tagFieldsInObject) do @@ -912,7 +940,7 @@ let mkClassUnionDef ilg tref td cud = let ctorMeths = if (isNil selfFields && isNil tagFieldsInObject && nonNil selfMeths) - || cud.cudAlternatives |> Array.forall (fun alt -> repr.OptimizeSingleNonNullaryAlternativeToRootClass (info,alt)) then + || cud.cudAlternatives |> Array.forall (fun alt -> repr.RepresentAlternativeAsFreshInstancesOfRootClass (info,alt)) then [] (* no need for a second ctor in these cases *) @@ -962,7 +990,7 @@ let mkClassUnionDef ilg tref td cud = let body = mkMethodBody(true,emptyILLocals,2,genWith (fun cg -> emitLdDataTagPrim ilg (Some mkLdarg0) cg (true, cuspec); cg.EmitInstr I_ret), cud.cudWhere) // // If we are using NULL as a representation for an element of this type then we cannot // // use an instance method - if (repr.OptimizingOneAlternativeToNull info) then + if (repr.RepresentOneAlternativeAsNull info) then [ mkILNonGenericStaticMethod("Get" + tagPropertyName,cud.cudHelpersAccess,[mkILParamAnon baseTy],mkILReturn tagFieldType,body) |> addMethodGeneratedAttrs ilg ], [] @@ -1024,28 +1052,16 @@ let mkClassUnionDef ilg tref td cud = tdKind = ILTypeDefKind.Enum } let baseTypeDef = - { Name = td.Name + { td with NestedTypes = mkILTypeDefs (Option.toList enumTypeDef @ altTypeDefs @ altDebugTypeDefs @ td.NestedTypes.AsList) - GenericParams= td.GenericParams - Access = td.Access IsAbstract = isAbstract IsSealed = altTypeDefs.IsEmpty - IsSerializable=td.IsSerializable IsComInterop=false - Layout=td.Layout - IsSpecialName=td.IsSpecialName - Encoding=td.Encoding - Implements = td.Implements Extends= (match td.Extends with None -> Some ilg.typ_Object | _ -> td.Extends) Methods= mkILMethods (ctorMeths @ baseMethsFromAlt @ selfMeths @ tagMeths @ altUniqObjMeths @ existingMeths) - SecurityDecls=td.SecurityDecls - HasSecurity=td.HasSecurity Fields=mkILFields (selfAndTagFields @ List.map (fun (_,_,_,_,fdef,_) -> fdef) altNullaryFields @ td.Fields.AsList) - MethodImpls=td.MethodImpls InitSemantics=ILTypeInit.BeforeField - Events=td.Events Properties=mkILProperties (tagProps @ basePropsFromAlt @ selfProps @ existingProps) - CustomAttrs=td.CustomAttrs tdKind = ILTypeDefKind.Class } // The .cctor goes on the Cases type since that's where the constant fields for nullary constructors live |> addConstFieldInit diff --git a/src/ilx/EraseUnions.fsi b/src/ilx/EraseUnions.fsi index 09d5e41e29d..47311b27700 100644 --- a/src/ilx/EraseUnions.fsi +++ b/src/ilx/EraseUnions.fsi @@ -9,19 +9,22 @@ module internal Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.EraseUnions open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Extensions.ILX.Types -/// Make the instruction sequence for an ILX "newdata" instruction +/// Make the instruction sequence for a "newdata" operation val mkNewData : ILGlobals -> IlxUnionSpec * int -> ILInstr list -/// Make the instruction sequence for an ILX "isdata" instruction +/// Make the instruction sequence for a "isdata" operation val mkIsData : ILGlobals -> bool * IlxUnionSpec * int -> ILInstr list -/// Make the instruction sequence for an ILX "lddata" instruction +/// Make the instruction sequence for a "lddata" operation val mkLdData : bool * IlxUnionSpec * int * int -> ILInstr list -/// Make the instruction sequence for an ILX "stdata" instruction +/// Make the instruction sequence for a "lddataa" operation +val mkLdDataAddr : bool * IlxUnionSpec * int * int -> ILInstr list + +/// Make the instruction sequence for a "stdata" operation val mkStData : IlxUnionSpec * int * int -> ILInstr list -/// Make the instruction sequence for an ILX "brisnotdata" instruction +/// Make the instruction sequence for a "brisnotdata" operation val mkBrIsNotData : ILGlobals -> avoidHelpers:bool * IlxUnionSpec * int * ILCodeLabel -> ILInstr list /// Make the type definition for a union type @@ -39,11 +42,11 @@ type ICodeGen<'Mark> = abstract EmitInstr : ILInstr -> unit abstract EmitInstrs : ILInstr list -> unit -/// Emit the instruction sequence for an ILX "castdata" instruction -val emitCastData : ILGlobals -> ICodeGen<'Mark> -> canfail: bool * IlxUnionSpec * int -> unit +/// Emit the instruction sequence for a "castdata" operation +val emitCastData : ILGlobals -> ICodeGen<'Mark> -> canfail: bool * avoidHelpers:bool * IlxUnionSpec * int -> unit -/// Emit the instruction sequence for an ILX "lddatatag" instruction +/// Emit the instruction sequence for a "lddatatag" operation val emitLdDataTag : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec -> unit -/// Emit the instruction sequence for an ILX "switchdata" instruction +/// Emit the instruction sequence for a "switchdata" operation val emitDataSwitch : ILGlobals -> ICodeGen<'Mark> -> avoidHelpers:bool * IlxUnionSpec * (int * ILCodeLabel) list -> unit diff --git a/tests/fsharp/typecheck/sigs/neg95.bsl b/tests/fsharp/typecheck/sigs/neg95.bsl index 63c66b9823f..77c5eb51c38 100644 --- a/tests/fsharp/typecheck/sigs/neg95.bsl +++ b/tests/fsharp/typecheck/sigs/neg95.bsl @@ -1,2 +1,6 @@ -neg94.fs(5,6,5,18): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation \ No newline at end of file +neg95.fs(5,6,5,18): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation + +neg95.fs(12,6,12,17): typecheck error FS0954: This type definition involves an immediate cyclic reference through a struct field or inheritance relation + +neg95.fs(15,6,15,18): typecheck error FS3199: A union type which is a struct must have only one case. \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg95.fs b/tests/fsharp/typecheck/sigs/neg95.fs index 3a58778211b..6422fa14045 100644 --- a/tests/fsharp/typecheck/sigs/neg95.fs +++ b/tests/fsharp/typecheck/sigs/neg95.fs @@ -7,3 +7,9 @@ type StructRecord = X: float Y: StructRecord } + +[] +type StructUnion = StructUnion of float * StructUnion + +[] +type StructUnion2 = A of int | B of string From 75eec14421e5565965c6e99434dc0ac52d84743b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 15 Jun 2016 20:52:12 +0100 Subject: [PATCH 267/334] struct unions --- src/fsharp/AugmentWithHashCompare.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 842561c857b..8c59387adfd 100644 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -222,7 +222,7 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) com (mkRecdFieldGetViaExprAddr(thataddre, fref, tinst, m)) let expr = mkCompareTestConjuncts g m (List.map mkTest fields) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise tce expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thate expr let expr = mkBindThatAddr g m ty thataddrv tcv tce expr // will be optimized away if not necessary @@ -436,7 +436,7 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatv,that (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise tce expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thate expr let expr = mkBindThatAddr g m ty thataddrv tcv tce expr // will be optimized away if not necessary let expr = mkCompGenLet m tcv thate expr From e8ec49b9eaef88e9d834b381077f7bbef8cd5244 Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 15 Jun 2016 14:31:34 -0700 Subject: [PATCH 268/334] Fixed msbuild targets redirects --- setup/Swix/VisualFSharpVSIX/CommonFiles.swr | 12 ++++-------- setup/resources/Microsoft.FSharp.Shim.targets | 2 +- .../resources/Microsoft.Portable.FSharp.Shim.targets | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/setup/Swix/VisualFSharpVSIX/CommonFiles.swr b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr index ad2d8414de4..6bba4346f6f 100644 --- a/setup/Swix/VisualFSharpVSIX/CommonFiles.swr +++ b/setup/Swix/VisualFSharpVSIX/CommonFiles.swr @@ -10,15 +10,11 @@ vs.localizedResources title="Visual F# Tools" description="Deploy Visual F# Tools templates to Visual Studio" -folder "InstallDir:\MSBuild\15.0" - file source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" - file source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" +folder "InstallDir:MSBuild\Microsoft\VisualStudio\v15.0\FSharp" + file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" + file "Microsoft.Portable.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" -folder "InstallDir:\MSBuild\15.0\Bin" - file source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" - file source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" - -folder "InstallDir:\Common7\IDE\PublicAssemblies" +folder "InstallDir:Common7\IDE\PublicAssemblies" file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" diff --git a/setup/resources/Microsoft.FSharp.Shim.targets b/setup/resources/Microsoft.FSharp.Shim.targets index b08b2a619f0..e54e9c4de78 100644 --- a/setup/resources/Microsoft.FSharp.Shim.targets +++ b/setup/resources/Microsoft.FSharp.Shim.targets @@ -1,5 +1,5 @@ - + diff --git a/setup/resources/Microsoft.Portable.FSharp.Shim.targets b/setup/resources/Microsoft.Portable.FSharp.Shim.targets index e47c9ca059b..055c0d27415 100644 --- a/setup/resources/Microsoft.Portable.FSharp.Shim.targets +++ b/setup/resources/Microsoft.Portable.FSharp.Shim.targets @@ -1,5 +1,5 @@ - + From 4153ebbf428b61c800a82b6a2fdb9b36c0ebcacf Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 15 Jun 2016 23:13:48 +0100 Subject: [PATCH 269/334] fix for test --- src/fsharp/AugmentWithHashCompare.fs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 8c59387adfd..2769415f656 100644 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -111,6 +111,11 @@ let mkCombineHashGenerators g m exprs accv acce = //------------------------------------------------------------------------- let mkThatAddrLocal g m ty = mkCompGenLocal m "obj" (mkThisTy g ty) +let mkThatAddrLocalIfNeeded g m tcve ty = + if isStructTy g ty then + let thataddrv, thataddre = mkCompGenLocal m "obj" (mkThisTy g ty) + Some thataddrv, thataddre + else None,tcve let mkThisVarThatVar g m ty = let thisv,thise = mkThisVar g m ty @@ -129,6 +134,12 @@ let mkBindThatAddr g m ty thataddrv thatv thate expr = else mkCompGenLet m thataddrv thate expr +let mkBindThatAddrIfNeeded g m ty thataddrvOpt thatv thate expr = + match thataddrvOpt with + | None -> expr + | Some thataddrv -> + mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv)) expr + let mkDerefThis g m (thisv: Val) thise = if isByrefTy g thisv.Type then mkAddrGet m (mkLocalValRef thisv) else thise @@ -210,7 +221,7 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) com let fields = tycon.AllInstanceFieldsAsList let tinst,ty = mkMinimalTy g tcref let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = thate - let thataddrv,thataddre = mkThatAddrLocal g m ty // let thataddrv = &tcv, if a struct + let thataddrv,thataddre = mkThatAddrLocal g m tce ty // let thataddrv = &tcv, if a struct let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -381,14 +392,14 @@ let mkUnionCompare g tcref (tycon:Tycon) = /// Build the comparison implementation for a union type when parameterized by a comparer -let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatv,thate) compe = +let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,thatcaste) compe = let m = tycon.Range let ucases = tycon.UnionCasesAsList let tinst,ty = mkMinimalTy g tcref + let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = (thatobj :?> ty) + let thataddrvOpt,thataddre = mkThatAddrLocalIfNeeded g m tce ty // let thataddrv = &tcv if struct, otherwise thataddre is just tce let thistagv,thistage = mkCompGenLocal m "thisTag" g.int_ty let thattagv,thattage = mkCompGenLocal m "thatTag" g.int_ty - let thataddrv,thataddre = mkThatAddrLocal g m ty - let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = thate let expr = let mbuilder = new MatchBuilder(NoSequencePointAtInvisibleBinding,m ) @@ -436,10 +447,9 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatv,that (mkUnionCaseTagGetViaExprAddr (thataddre,tcref,tinst,m)) tagsEqTested) - let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thate expr - let expr = mkBindThatAddr g m ty thataddrv tcv tce expr - // will be optimized away if not necessary - let expr = mkCompGenLet m tcv thate expr + let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thatcaste expr + let expr = mkBindThatAddrIfNeeded g m ty thataddrvOpt tcv tce expr + let expr = mkCompGenLet m tcv thatcaste expr expr From 93f8799d5e57666891fa1cf9395a84e5c01e279f Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 15 Jun 2016 23:20:31 +0100 Subject: [PATCH 270/334] fix for test --- src/fsharp/AugmentWithHashCompare.fs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/fsharp/AugmentWithHashCompare.fs b/src/fsharp/AugmentWithHashCompare.fs index 2769415f656..5199dc223cc 100644 --- a/src/fsharp/AugmentWithHashCompare.fs +++ b/src/fsharp/AugmentWithHashCompare.fs @@ -130,14 +130,17 @@ let mkThatVarBind g m ty thataddrv expr = let mkBindThatAddr g m ty thataddrv thatv thate expr = if isStructTy g ty then - mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv)) expr + // let thataddrv = &thatv + mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv)) expr else - mkCompGenLet m thataddrv thate expr + // let thataddrv = that + mkCompGenLet m thataddrv thate expr -let mkBindThatAddrIfNeeded g m ty thataddrvOpt thatv thate expr = +let mkBindThatAddrIfNeeded m thataddrvOpt thatv expr = match thataddrvOpt with | None -> expr | Some thataddrv -> + // let thataddrv = &thatv mkCompGenLet m thataddrv (mkValAddr m (mkLocalValRef thatv)) expr let mkDerefThis g m (thisv: Val) thise = @@ -221,7 +224,7 @@ let mkRecdCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_,thate) com let fields = tycon.AllInstanceFieldsAsList let tinst,ty = mkMinimalTy g tcref let tcv,tce = mkCompGenLocal m "objTemp" ty // let tcv = thate - let thataddrv,thataddre = mkThatAddrLocal g m tce ty // let thataddrv = &tcv, if a struct + let thataddrv,thataddre = mkThatAddrLocal g m ty // let thataddrv = &tcv, if a struct let mkTest (fspec:RecdField) = let fty = fspec.FormalType @@ -448,7 +451,7 @@ let mkUnionCompareWithComparer g tcref (tycon:Tycon) (_thisv,thise) (_thatobjv,t tagsEqTested) let expr = if tycon.IsStructOrEnumTycon then expr else mkBindNullComparison g m thise thatcaste expr - let expr = mkBindThatAddrIfNeeded g m ty thataddrvOpt tcv tce expr + let expr = mkBindThatAddrIfNeeded m thataddrvOpt tcv expr let expr = mkCompGenLet m tcv thatcaste expr expr From 47077f6e7112f654ba3f2af9dd24219ce3ced8e5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 15 Jun 2016 23:46:37 +0100 Subject: [PATCH 271/334] limit conditional build and add more tests --- .../FSharp.Core.Unittests.fsproj | 2 +- .../FSharp.Core/RecordTypes.fs | 46 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 83ed633defa..4fc578c8f05 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -112,7 +112,7 @@ - + diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs index 694052fa4d2..2d9695b08fa 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/RecordTypes.fs @@ -325,4 +325,48 @@ let [] ``can properly construct a struct record using FSharpValue.MakeReco let d = (fields.[1] :?> int) Assert.AreEqual (999, d) - \ No newline at end of file +type DefaultLayoutMutableRecord = + { mutable First : int + mutable Second : float + mutable Third : decimal + mutable Fourth : int + } + +let inline CX_get_A(x: ^T) = + ( (^T : (member A : int) (x)) ) + +let inline CX_get_C(x: ^T) = + ( (^T : (member C : int) (x)) ) + +let inline CX_set_First(x: ^T, v) = + ( (^T : (member First : int with set) (x,v)) ) + + +type Members() = + static member CreateMutableStructRecord() = { M1 = 1; M2 = 2 } + + +let [] ``inline constraints resolve correctly`` () = + let v = CX_get_A ({ A = 1; B = 2 }) + Assert.AreEqual (1, v) + + let v2 = CX_get_C ({ C = 1; D = 2 }) + Assert.AreEqual (1, v2) + + let mutable m : DefaultLayoutMutableRecord = + { First = 0xbaad1 + Second = 0.987654 + Third = 100.32M + Fourth = 0xbaad4 } + + let v3 = CX_set_First (m,1) + Assert.AreEqual (1, m.First) + +let [] ``member setters resolve correctly`` () = + + let v = Members.CreateMutableStructRecord() + Assert.AreEqual (1, v.M1) + + //let v2 = Members.CreateMutableStructRecord(M1 = 100) + //Assert.AreEqual (100, v2.M1) + From 28d4b053d2600c31a99767e399efa77a0815b510 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 16 Jun 2016 10:19:19 +0100 Subject: [PATCH 272/334] fix tests --- .../ToplevelModule.il.bsl | 8 ++++---- .../ToplevelModuleP.il.bsl | 8 ++++---- .../ToplevelNamespace.il.bsl | 10 +++++----- .../ToplevelNamespaceP.il.bsl | 10 +++++----- .../Optimizations/Inlining/Match01.il.bsl | Bin 129528 -> 129528 bytes 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl index 075b68845ee..972eced84a0 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001158 Length: 0x000003FD } .module TopLevelModule.dll -// MVID: {575BE147-37F5-C118-A745-038347E15B57} +// MVID: {576266DB-37F5-C118-A745-0383DB666257} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00620000 +// Image base: 0x01090000 // =============== CLASS MEMBERS DECLARATION =================== @@ -685,7 +685,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -1483,7 +1483,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl index 76df7a86bfb..51e5cc6249a 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001158 Length: 0x000003FE } .module ToplevelModuleP.dll -// MVID: {575BE155-5A3A-8E4D-A745-038355E15B57} +// MVID: {576266E1-5A3A-8E4D-A745-0383E1666257} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x009B0000 +// Image base: 0x00A70000 // =============== CLASS MEMBERS DECLARATION =================== @@ -671,7 +671,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -1455,7 +1455,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl index 1d33d16bc4c..b9d03a5dc59 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001860 Length: 0x0000055C } .module ToplevelNamespace.dll -// MVID: {575BE14E-218B-729A-A745-03834EE15B57} +// MVID: {576266DE-218B-729A-A745-0383DE666257} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00F30000 +// Image base: 0x00D30000 // =============== CLASS MEMBERS DECLARATION =================== @@ -680,7 +680,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -1478,7 +1478,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -2276,7 +2276,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl index 15931872229..a419b7a9c0c 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl @@ -36,13 +36,13 @@ // Offset: 0x00001860 Length: 0x0000055D } .module ToplevelNamespaceP.dll -// MVID: {575BE15B-88D9-D7FD-A745-03835BE15B57} +// MVID: {576266E4-88D9-D7FD-A745-0383E4666257} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x003C0000 +// Image base: 0x01450000 // =============== CLASS MEMBERS DECLARATION =================== @@ -666,7 +666,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -1450,7 +1450,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 @@ -2234,7 +2234,7 @@ IL_0019: ldloc.0 IL_001a: stloc.1 - IL_001b: ldloc.1 + IL_001b: ldloc.0 IL_001c: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) IL_0021: brtrue.s IL_0025 diff --git a/tests/fsharpqa/Source/Optimizations/Inlining/Match01.il.bsl b/tests/fsharpqa/Source/Optimizations/Inlining/Match01.il.bsl index ddfd9dfcac162f511522f832a3e03e63377203a5..523f7efed861a5c2664420a96c43c1ce833e2920 100644 GIT binary patch delta 41 zcmV+^0M`Hb^9T6z2Y|Ez!q5j)0A&De0C1Nf&;fs!fHMJ3w~(p Date: Thu, 16 Jun 2016 17:05:41 +0100 Subject: [PATCH 273/334] minor fixes and more testing --- .../FSharp.Core/DiscrimantedUnionType.fs | 23 ++++ src/fsharp/PatternMatchCompilation.fs | 70 +++++------ src/ilx/EraseUnions.fs | 8 +- tests/fsharp/core/attributes/testlib.fs | 2 + tests/fsharp/core/fsfromcs/{lib.ml => lib.fs} | 2 +- .../core/fsfromfsviacs/{lib.ml => lib.fs} | 72 ++++++++++- tests/fsharp/core/fsfromfsviacs/lib2.cs | 4 + tests/fsharp/core/fsfromfsviacs/test.fsx | 64 ++++++++++ tests/fsharp/core/quotes/test.fsx | 119 +++++------------- tests/fsharp/core/tests_core.fs | 12 +- 10 files changed, 242 insertions(+), 134 deletions(-) rename tests/fsharp/core/fsfromcs/{lib.ml => lib.fs} (99%) rename tests/fsharp/core/fsfromfsviacs/{lib.ml => lib.fs} (51%) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs index 52ea6fbf388..73f548920dc 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs @@ -226,3 +226,26 @@ let ``struct unions hold [] [] metadata`` () = Assert.IsTrue (hasAttribute()) Assert.IsTrue (hasAttribute()) + +let [] ``can properly construct a struct union using FSharpValue.MakeUnionCase, and we get the fields`` () = + let cases = Microsoft.FSharp.Reflection.FSharpType.GetUnionCases(typeof) + + Assert.AreEqual (1, cases.Length) + let case = cases.[0] + + Assert.AreEqual ("SU", case.Name) + + let structUnion = Microsoft.FSharp.Reflection.FSharpValue.MakeUnion (case, [|box 1234; box 3456|]) + + Assert.IsTrue (structUnion.GetType().IsValueType) + + let fieldVals = Microsoft.FSharp.Reflection.FSharpValue.GetUnionFields(structUnion, typeof) + + Assert.AreEqual (2, fieldVals.Length) + + let c = (fieldVals.[0] :?> int) + Assert.AreEqual (1234, c) + + let c2 = (fieldVals.[1] :?> int) + Assert.AreEqual (3456, c2) + diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 22400641b79..6bff652145d 100644 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -493,7 +493,7 @@ let (|ListEmptyDiscrim|_|) g = function /// - Compact integer switches become a single switch. Non-compact integer /// switches, string switches and floating point switches are treated in the /// same way as Test.IsInst. -let rec BuildSwitch resPreBindOpt g expr edges dflt m = +let rec BuildSwitch inpExprOpt g expr edges dflt m = if verbose then dprintf "--> BuildSwitch@%a, #edges = %A, dflt.IsSome = %A\n" outputRange m (List.length edges) (Option.isSome dflt); match edges,dflt with | [], None -> failwith "internal error: no edges and no default" @@ -505,12 +505,12 @@ let rec BuildSwitch resPreBindOpt g expr edges dflt m = // 'isinst' tests where we have stored the result of the 'isinst' in a variable // In this case the 'expr' already holds the result of the 'isinst' test. - | (TCase(Test.IsInst _,success)):: edges, dflt when isSome resPreBindOpt -> + | (TCase(Test.IsInst _,success)):: edges, dflt when isSome inpExprOpt -> TDSwitch(expr,[TCase(Test.IsNull,BuildSwitch None g expr edges dflt m)],Some success,m) // isnull and isinst tests | (TCase((Test.IsNull | Test.IsInst _),_) as edge):: edges, dflt -> - TDSwitch(expr,[edge],Some (BuildSwitch resPreBindOpt g expr edges dflt m),m) + TDSwitch(expr,[edge],Some (BuildSwitch inpExprOpt g expr edges dflt m),m) #if OPTIMIZE_LIST_MATCHING // 'cons/nil' tests where we have stored the result of the cons test in an 'isinst' in a variable @@ -519,7 +519,7 @@ let rec BuildSwitch resPreBindOpt g expr edges dflt m = | [TCase(ListEmptyDiscrim g tinst, emptyCase)], Some consCase | [TCase(ListEmptyDiscrim g _, emptyCase); TCase(ListConsDiscrim g tinst, consCase)], None | [TCase(ListConsDiscrim g tinst, consCase); TCase(ListEmptyDiscrim g _, emptyCase)], None - when isSome resPreBindOpt -> + when isSome inpExprOpt -> TDSwitch(expr, [TCase(Test.IsNull, emptyCase)], Some consCase, m) #endif @@ -792,10 +792,10 @@ let CompilePatternBasic if debug then dprintf "chooseSimultaneousEdgeSet\n"; let simulSetOfEdgeDiscrims,fallthroughPathFrontiers = ChooseSimultaneousEdges frontiers path - let resPreBindOpt, bindOpt = ChoosePreBinder simulSetOfEdgeDiscrims subexpr + let inpExprOpt, bindOpt = ChoosePreBinder simulSetOfEdgeDiscrims subexpr // For each case, recursively compile the residue decision trees that result if that case successfully matches - let simulSetOfCases, _ = CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims resPreBindOpt + let simulSetOfCases, _ = CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims inpExprOpt assert (nonNil(simulSetOfCases)); @@ -812,8 +812,8 @@ let CompilePatternBasic // OK, build the whole tree and whack on the binding if any let finalDecisionTree = - let inpExprToSwitch = (match resPreBindOpt with Some vexp -> vexp | None -> GetSubExprOfInput subexpr) - let tree = BuildSwitch resPreBindOpt g inpExprToSwitch simulSetOfCases defaultTreeOpt matchm + let inpExprToSwitch = (match inpExprOpt with Some vexp -> vexp | None -> GetSubExprOfInput subexpr) + let tree = BuildSwitch inpExprOpt g inpExprToSwitch simulSetOfCases defaultTreeOpt matchm match bindOpt with | None -> tree | Some bind -> TDBind (bind,tree) @@ -904,7 +904,7 @@ let CompilePatternBasic let argexp = GetSubExprOfInput subexpr let vOpt,addrexp = mkExprAddrOfExprAux g true false NeverMutates argexp None matchm match vOpt with - | None -> None, None + | None -> Some addrexp, None | Some (v,e) -> if topv.IsMemberOrModuleBinding then AdjustValToTopVal v topv.ActualParent ValReprInfo.emptyValData; @@ -945,7 +945,7 @@ let CompilePatternBasic | _ -> None,None - and CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims (resPreBindOpt: Expr option) = + and CompileSimultaneousSet frontiers path refuted subexpr simulSetOfEdgeDiscrims (inpExprOpt: Expr option) = ([],simulSetOfEdgeDiscrims) ||> List.collectFold (fun taken (EdgeDiscrim(i',discrim,m)) -> // Check to see if we've already collected the edge for this case, in which case skip it. @@ -968,7 +968,7 @@ let CompilePatternBasic match discrim with | Test.UnionCase (ucref, tinst) when #if OPTIMIZE_LIST_MATCHING - isNone resPreBindOpt && + isNone inpExprOpt && #endif (isNil topgtvs && not topv.IsMemberOrModuleBinding && @@ -1000,7 +1000,7 @@ let CompilePatternBasic // Project a successful edge through the frontiers. let investigation = Investigation(i',discrim,path) - let frontiers = frontiers |> List.collect (GenerateNewFrontiersAfterSucccessfulInvestigation resPreBindOpt resPostBindOpt investigation) + let frontiers = frontiers |> List.collect (GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt investigation) let tree = InvestigateFrontiers refuted frontiers // Bind the resVar for the union case, if we have one let tree = @@ -1042,7 +1042,7 @@ let CompilePatternBasic // Build a new frontier that represents the result of a successful investigation // at rule point (i',discrim,path) - and GenerateNewFrontiersAfterSucccessfulInvestigation resPreBindOpt resPostBindOpt (Investigation(i',discrim,path)) (Frontier (i, active,valMap) as frontier) = + and GenerateNewFrontiersAfterSucccessfulInvestigation inpExprOpt resPostBindOpt (Investigation(i',discrim,path)) (Frontier (i, active,valMap) as frontier) = if debug then dprintf "projecting success of investigation encompassing rule %d through rule %d \n" i' i; if (isMemOfActives path active) then @@ -1068,14 +1068,14 @@ let CompilePatternBasic if (hasParam && i = i') || (discrimsEq g discrim (Option.get (getDiscrimOfPattern pat))) then let aparity = apinfo.Names.Length let accessf' j tpinst _e' = - assert resPreBindOpt.IsSome + assert inpExprOpt.IsSome if aparity <= 1 then - Option.get resPreBindOpt + Option.get inpExprOpt else let ucref = mkChoiceCaseRef g m aparity idx // TODO: In the future we will want active patterns to be able to return struct-unions // In that eventuality, we need to check we are taking the address correctly - mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get resPreBindOpt,ucref,instTypes tpinst resTys,j,exprm) + mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get inpExprOpt,ucref,instTypes tpinst resTys,j,exprm) mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) elif hasParam then @@ -1089,7 +1089,7 @@ let CompilePatternBasic let accessf' _j tpinst _ = // TODO: In the future we will want active patterns to be able to return struct-unions // In that eventuality, we need to check we are taking the address correctly - mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get resPreBindOpt, mkSomeCase g, instTypes tpinst resTys, 0, exprm) + mkUnionCaseFieldGetUnprovenViaExprAddr (Option.get inpExprOpt, mkSomeCase g, instTypes tpinst resTys, 0, exprm) mkSubFrontiers path accessf' active' [p] (fun path j -> PathQuery(path,int64 j)) else // Successful active patterns don't refute other patterns @@ -1098,15 +1098,15 @@ let CompilePatternBasic | TPat_unioncase (ucref1, tyargs, argpats,_) -> match discrim with | Test.UnionCase (ucref2, tinst) when g.unionCaseRefEq ucref1 ucref2 -> - let accessf' j tpinst e' = -#if OPTIMIZE_LIST_MATCHING - match resPreBindOpt with - | Some e -> mkUnionCaseFieldGetProvenViaExprAddr g (e,ucref1,tinst,j,exprm) - | None -> -#endif + let accessf' j tpinst exprIn = match resPostBindOpt with | Some e -> mkUnionCaseFieldGetProvenViaExprAddr (e,ucref1,tinst,j,exprm) - | None -> mkUnionCaseFieldGetUnprovenViaExprAddr (accessf tpinst e',ucref1,instTypes tpinst tyargs,j,exprm) + | None -> + let exprIn = + match inpExprOpt with + | Some addrexp -> addrexp + | None -> accessf tpinst exprIn + mkUnionCaseFieldGetUnprovenViaExprAddr (exprIn,ucref1,instTypes tpinst tyargs,j,exprm) mkSubFrontiers path accessf' active' argpats (fun path j -> PathUnionConstr(path,ucref1,tyargs,j)) | Test.UnionCase _ -> @@ -1119,7 +1119,7 @@ let CompilePatternBasic | TPat_array (argpats,ty,_) -> match discrim with | Test.ArrayLength (n,_) when List.length argpats = n -> - let accessf' j tpinst e' = mkCallArrayGet g exprm ty (accessf tpinst e') (mkInt g exprm j) + let accessf' j tpinst exprIn = mkCallArrayGet g exprm ty (accessf tpinst exprIn) (mkInt g exprm j) mkSubFrontiers path accessf' active' argpats (fun path j -> PathArray(path,ty,List.length argpats,j)) // Successful length tests refute all other lengths | Test.ArrayLength _ -> @@ -1130,7 +1130,7 @@ let CompilePatternBasic | TPat_exnconstr (ecref, argpats,_) -> match discrim with | Test.IsInst (_srcTy,tgtTy) when typeEquiv g (mkAppTy ecref []) tgtTy -> - let accessf' j tpinst e' = mkExnCaseFieldGet(accessf tpinst e',ecref,j,exprm) + let accessf' j tpinst exprIn = mkExnCaseFieldGet(accessf tpinst exprIn,ecref,j,exprm) mkSubFrontiers path accessf' active' argpats (fun path j -> PathExnConstr(path,ecref,j)) | _ -> // Successful type tests against one sealed type refute all other sealed types @@ -1142,16 +1142,16 @@ let CompilePatternBasic | Test.IsInst (_srcTy,tgtTy2) when typeEquiv g tgtTy1 tgtTy2 -> match pbindOpt with | Some pbind -> - let accessf' tpinst e' = + let accessf' tpinst exprIn = // Fetch the result from the place where we saved it, if possible - match resPreBindOpt with + match inpExprOpt with | Some e -> e | _ -> // Otherwise call the helper - mkCallUnboxFast g exprm (instType tpinst tgtTy1) (accessf tpinst e') + mkCallUnboxFast g exprm (instType tpinst tgtTy1) (accessf tpinst exprIn) - let (v,e') = BindSubExprOfInput g amap topgtvs pbind exprm (SubExpr(accessf',ve)) - [Frontier (i, active', valMap.Add v e' )] + let (v,exprIn) = BindSubExprOfInput g amap topgtvs pbind exprm (SubExpr(accessf',ve)) + [Frontier (i, active', valMap.Add v exprIn )] | None -> [Frontier (i, active', valMap)] @@ -1190,17 +1190,17 @@ let CompilePatternBasic | TPat_wild _ -> BindProjectionPatterns [] s | TPat_as(p',pbind,m) -> - let (v,e') = BindSubExprOfInput g amap topgtvs pbind m subExpr - BindProjectionPattern (Active(path,subExpr,p')) (accActive,accValMap.Add v e' ) + let (v,subExpr') = BindSubExprOfInput g amap topgtvs pbind m subExpr + BindProjectionPattern (Active(path,subExpr,p')) (accActive,accValMap.Add v subExpr' ) | TPat_tuple(ps,tyargs,_m) -> - let accessf' j tpinst e' = mkTupleFieldGet(accessf tpinst e',instTypes tpinst tyargs,j,exprm) + let accessf' j tpinst exprIn = mkTupleFieldGet(accessf tpinst exprIn,instTypes tpinst tyargs,j,exprm) let pathBuilder path j = PathTuple(path,tyargs,j) let newActives = List.mapi (mkSubActive pathBuilder accessf') ps BindProjectionPatterns newActives s | TPat_recd(tcref,tinst,ps,_m) -> let newActives = (ps,tcref.TrueInstanceFieldsAsRefList) ||> List.mapi2 (fun j p fref -> - let accessf' fref _j tpinst e' = mkRecdFieldGet g (accessf tpinst e',fref,instTypes tpinst tinst,exprm) + let accessf' fref _j tpinst exprIn = mkRecdFieldGet g (accessf tpinst exprIn,fref,instTypes tpinst tinst,exprm) let pathBuilder path j = PathRecd(path,tcref,tinst,j) mkSubActive pathBuilder (accessf' fref) j p) BindProjectionPatterns newActives s diff --git a/src/ilx/EraseUnions.fs b/src/ilx/EraseUnions.fs index c4cdfab0625..6edcb4c663b 100644 --- a/src/ilx/EraseUnions.fs +++ b/src/ilx/EraseUnions.fs @@ -905,6 +905,8 @@ let mkClassUnionDef ilg tref td cud = | SingleCase | RuntimeTypes | TailOrNull -> [] | IntegerTag -> [ mkTagFieldId ilg cuspec ] + let isStruct = match td.tdKind with ILTypeDefKind.ValueType -> true | _ -> false + let selfFields, selfMeths, selfProps = [ for alt in cud.cudAlternatives do @@ -912,9 +914,7 @@ let mkClassUnionDef ilg tref td cud = // TODO let fields = alt.FieldDefs |> Array.toList |> List.map mkUnionCaseFieldId let baseInit = - match td.tdKind with - | ILTypeDefKind.ValueType -> None - | _ -> + if isStruct then None else match td.Extends with | None -> Some ilg.tspec_Object | Some typ -> Some typ.TypeSpec @@ -936,7 +936,7 @@ let mkClassUnionDef ilg tref td cud = let selfAndTagFields = [ for (fldName,fldTy) in (selfFields @ tagFieldsInObject) do let fdef = mkHiddenGeneratedInstanceFieldDef ilg (fldName,fldTy, None, ILMemberAccess.Assembly) - yield { fdef with IsInitOnly=isTotallyImmutable } ] + yield { fdef with IsInitOnly= (not isStruct && isTotallyImmutable) } ] let ctorMeths = if (isNil selfFields && isNil tagFieldsInObject && nonNil selfMeths) diff --git a/tests/fsharp/core/attributes/testlib.fs b/tests/fsharp/core/attributes/testlib.fs index e5f00296b2c..eddb622fccc 100644 --- a/tests/fsharp/core/attributes/testlib.fs +++ b/tests/fsharp/core/attributes/testlib.fs @@ -116,3 +116,5 @@ module TypeParamAttributesDifferent = type ThisLibAssembly = X | Y + + diff --git a/tests/fsharp/core/fsfromcs/lib.ml b/tests/fsharp/core/fsfromcs/lib.fs similarity index 99% rename from tests/fsharp/core/fsfromcs/lib.ml rename to tests/fsharp/core/fsfromcs/lib.fs index 4e9936fb13c..1ca7ef43135 100644 --- a/tests/fsharp/core/fsfromcs/lib.ml +++ b/tests/fsharp/core/fsfromcs/lib.fs @@ -1,4 +1,4 @@ - +module Lib (* An F# library which we try to access from C# *) type Recd1 = { recd1field1: int } diff --git a/tests/fsharp/core/fsfromfsviacs/lib.ml b/tests/fsharp/core/fsfromfsviacs/lib.fs similarity index 51% rename from tests/fsharp/core/fsfromfsviacs/lib.ml rename to tests/fsharp/core/fsfromfsviacs/lib.fs index f40253dc634..ceb7bc8fbae 100644 --- a/tests/fsharp/core/fsfromfsviacs/lib.ml +++ b/tests/fsharp/core/fsfromfsviacs/lib.fs @@ -1,4 +1,4 @@ - +module Lib (* An F# library which we use in a C# library, where we in turn use both the F# component and the C# library together from F# *) type recd1 = { recd1field1: int } @@ -44,3 +44,73 @@ let tup4 = (2,3,4,5) + +module StructUnionsTests = + + [] + type U0 = U0 + + let f0 x = match x with U0 -> 1 + + let v0 = f0 U0 + + [] + type U1 = U1 of int + + let f1 x = match x with U1(x) -> x + x + + let v1 = f1 (U1(3)) + + [] + type U2 = U2 of int * int + + let f2 x = match x with U2(x,y) -> x + y + + let v2 = f2 (U2(3,4)) + + [] + type Ok3 = Ok3 of int * Ok3 list + +/// Nesting structs inside struct unions means taking the address of things during pattern matching +module NestedStructUnionsTests = + + [] + type U1 = U1 of System.DateTime * string + + [] + type U2 = U2 of U1 * U1 + + + let testPattern1(u2:U2) = + match u2 with + | U2(u1a,u1b) -> + match u1a, u1b with + | U1(dt1,s1), U1(dt2,s2) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern2(u2:U2) = + match u2 with + | U2(U1(dt1,s1),U1(dt2,s2)) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern3(u2:U2) = + match u2 with + | U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2) + + + let testPattern1mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(u1a,u1b) -> + match u1a, u1b with + | U1(dt1,s1), U1(dt2,s2) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern2mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(U1(dt1,s1),U1(dt2,s2)) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern3mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2) + + diff --git a/tests/fsharp/core/fsfromfsviacs/lib2.cs b/tests/fsharp/core/fsfromfsviacs/lib2.cs index c86e38e7ac6..969347a49f7 100644 --- a/tests/fsharp/core/fsfromfsviacs/lib2.cs +++ b/tests/fsharp/core/fsfromfsviacs/lib2.cs @@ -32,6 +32,10 @@ public class Lib2 public static FSharpRef ri1 = new FSharpRef(3); public static FSharpRef rr1 = new FSharpRef(r1); + public static Lib.StructUnionsTests.U0 u0 = Lib.StructUnionsTests.U0.U0; + public static Lib.StructUnionsTests.U1 u1 = Lib.StructUnionsTests.U1.NewU1(3); + public static Lib.StructUnionsTests.U2 u2 = Lib.StructUnionsTests.U2.NewU2(3,4); + static Lib2() { r3.recd3field3 = r3; } } diff --git a/tests/fsharp/core/fsfromfsviacs/test.fsx b/tests/fsharp/core/fsfromfsviacs/test.fsx index 742b0f284a5..2c0f1652a0c 100644 --- a/tests/fsharp/core/fsfromfsviacs/test.fsx +++ b/tests/fsharp/core/fsfromfsviacs/test.fsx @@ -27,7 +27,71 @@ let _ = test "fejio2dw" (Lib2.or1 = Some r1) let _ = test "fejio2dw" (Lib2.ri1 = ref 3) let _ = test "fejio2dw" (Lib2.rr1 = ref r1) +let _ = test "structunion3948" (Lib2.u0 = Lib.StructUnionsTests.U0) +let _ = test "structunion3949" (Lib2.u1 = Lib.StructUnionsTests.U1(3)) +let _ = test "structunion3949" (Lib2.u2 = Lib.StructUnionsTests.U2(3,4)) + +let _ = test "structunion3948" (compare Lib2.u0 Lib.StructUnionsTests.U0 = 0) +let _ = test "structunion3949" (compare Lib2.u1 (Lib.StructUnionsTests.U1(3)) = 0) +let _ = test "structunion394a" (compare Lib2.u1 (Lib.StructUnionsTests.U1(4)) = -1) +let _ = test "structunion394b" (compare Lib2.u1 (Lib.StructUnionsTests.U1(2)) = 1) +let dt = System.DateTime.Now +let u1a = Lib.NestedStructUnionsTests.U1(dt,"a") +let u1b = Lib.NestedStructUnionsTests.U1(dt,"b") +let u2 = Lib.NestedStructUnionsTests.U2(u1a,u1b) +let _ = test "structunion394b11" (Lib.NestedStructUnionsTests.testPattern1(u2)) +let _ = test "structunion394b22" (Lib.NestedStructUnionsTests.testPattern2(u2)) +let _ = test "structunion394b33" (Lib.NestedStructUnionsTests.testPattern3(u2)) +let _ = test "structunion394b14" (Lib.NestedStructUnionsTests.testPattern1mut(u2)) +let _ = test "structunion394b25" (Lib.NestedStructUnionsTests.testPattern2mut(u2)) +let _ = test "structunion394b36" (Lib.NestedStructUnionsTests.testPattern3mut(u2)) + + +module NestedStructPatternMatchingAcrossAssemblyBoundaries = + open Lib.NestedStructUnionsTests + + let testPattern1(u2:U2) = + match u2 with + | U2(u1a,u1b) -> + match u1a, u1b with + | U1(dt1,s1), U1(dt2,s2) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern2(u2:U2) = + match u2 with + | U2(U1(dt1,s1),U1(dt2,s2)) -> (dt1 = dt2) + + let testPattern3(u2:U2) = + match u2 with + | U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2) + + let testPattern1mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(u1a,u1b) -> + match u1a, u1b with + | U1(dt1,s1), U1(dt2,s2) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern2mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(U1(dt1,s1),U1(dt2,s2)) -> (dt1 = dt2) && (s1 = "a") && (s2 = "b") + + let testPattern3mut(u2:U2) = + let mutable u2 = u2 + match u2 with + | U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2) + + + let _ = test "structunion394b1a" (testPattern1(u2)) + let _ = test "structunion394b2b" (testPattern2(u2)) + let _ = test "structunion394b3c" (testPattern3(u2)) + + let _ = test "structunion394b1d" (testPattern1mut(u2)) + let _ = test "structunion394b2e" (testPattern2mut(u2)) + let _ = test "structunion394b3f" (testPattern3mut(u2)) + + (* public Lib.discr1_0 d10a = Lib.discr1_0.MkDiscr1_0_A(); public Lib.discr1_1 d11a = Lib.discr1_1.MkDiscr1_1_A(3); diff --git a/tests/fsharp/core/quotes/test.fsx b/tests/fsharp/core/quotes/test.fsx index 2c45e996577..2ad7e1386a4 100644 --- a/tests/fsharp/core/quotes/test.fsx +++ b/tests/fsharp/core/quotes/test.fsx @@ -1610,93 +1610,38 @@ module MoreQuotationsTests = let _ = <@@ v2.Int32ExtensionMethod5 @@> |> printfn "quote = %A" -module QuotationConstructionTests = - let arr = [| 1;2;3;4;5 |] - let f : int -> int = printfn "hello"; (fun x -> x) - let f2 : int * int -> int -> int = printfn "hello"; (fun (x,y) z -> x + y + z) - let F (x:int) = x - let F2 (x:int,y:int) (z:int) = x + y + z - - type Foo () = - member t.Item with get (index:int) = 1 - and set (index:int) (value:int) = () - - let ctorof q = match q with Patterns.NewObject(cinfo,_) -> cinfo | _ -> failwith "ctorof" - let methodof q = match q with DerivedPatterns.Lambdas(_,Patterns.Call(_,minfo,_)) -> minfo | _ -> failwith "methodof" - let fieldof q = match q with Patterns.FieldGet(_,finfo) -> finfo | _ -> failwith "fieldof" - let ucaseof q = match q with Patterns.NewUnionCase(ucinfo,_) -> ucinfo | _ -> failwith "ucaseof" - let getof q = match q with Patterns.PropertyGet(_,pinfo,_) -> pinfo | _ -> failwith "getof" - let setof q = match q with Patterns.PropertySet(_,pinfo,_,_) -> pinfo | _ -> failwith "setof" - check "vcknwwe01" (match Expr.AddressOf <@@ arr.[3] @@> with AddressOf(expr) -> expr = <@@ arr.[3] @@> | _ -> false) true - check "vcknwwe02" (match Expr.AddressSet (Expr.AddressOf <@@ arr.[3] @@>, <@@ 4 @@>) with AddressSet(AddressOf(expr),v) -> expr = <@@ arr.[3] @@> && v = <@@ 4 @@> | _ -> false) true - check "vcknwwe03" (match Expr.Application(<@@ f @@>,<@@ 5 @@>) with Application(f1,x) -> f1 = <@@ f @@> && x = <@@ 5 @@> | _ -> false) true - check "vcknwwe04" (match Expr.Applications(<@@ f @@>,[[ <@@ 5 @@> ]]) with Applications(f1,[[x]]) -> f1 = <@@ f @@> && x = <@@ 5 @@> | _ -> false) true - check "vcknwwe05" (match Expr.Applications(<@@ f2 @@>,[[ <@@ 5 @@>;<@@ 6 @@> ]; [ <@@ 7 @@> ]]) with Applications(f1,[[x;y];[z]]) -> f1 = <@@ f2 @@> && x = <@@ 5 @@> && y = <@@ 6 @@> && z = <@@ 7 @@> | _ -> false) true - check "vcknwwe06" (match Expr.Call(methodof <@@ F2 @@>,[ <@@ 5 @@>;<@@ 6 @@>; <@@ 7 @@> ]) with Call(None,minfo,[x;y;z]) -> minfo = methodof <@@ F2 @@> && x = <@@ 5 @@> && y = <@@ 6 @@> && z = <@@ 7 @@> | _ -> false) true - check "vcknwwe07" (Expr.Cast(<@@ 5 @@>) : Expr) (<@ 5 @>) - check "vcknwwe08" (try let _ = Expr.Cast(<@@ 5 @@>) : Expr in false with :? System.ArgumentException -> true) true - check "vcknwwe09" (match Expr.Coerce(<@@ 5 @@>, typeof) with Coerce(q,ty) -> ty = typeof && q = <@@ 5 @@> | _ -> false) true - check "vcknwwe0q" (match Expr.DefaultValue(typeof) with DefaultValue(ty) -> ty = typeof | _ -> false) true - check "vcknwwe0w" (match Expr.FieldGet(typeof.GetField("MaxValue")) with FieldGet(None,finfo) -> finfo = typeof.GetField("MaxValue") | _ -> false) true - check "vcknwwe0e" (match Expr.FieldSet(typeof.GetField("MaxValue"),<@@ 1 @@>) with FieldSet(None,finfo,v) -> finfo = typeof.GetField("MaxValue") && v = <@@ 1 @@> | _ -> false) true - check "vcknwwe0r" (match Expr.ForIntegerRangeLoop(Var.Global("i",typeof),<@@ 1 @@>,<@@ 10 @@>,<@@ () @@>) with ForIntegerRangeLoop(v,start,finish,body) -> v = Var.Global("i",typeof) && start = <@@ 1 @@> && finish = <@@ 10 @@> && body = <@@ () @@> | _ -> false) true - check "vcknwwe0t" (match Expr.GlobalVar("i") : Expr with Var(v) -> v = Var.Global("i",typeof) | _ -> false) true - check "vcknwwe0y" (match Expr.IfThenElse(<@@ true @@>,<@@ 1 @@>,<@@ 2 @@>) with IfThenElse(gd,t,e) -> gd = <@@ true @@> && t = <@@ 1 @@> && e = <@@ 2 @@> | _ -> false) true - check "vcknwwe0u" (match Expr.Lambda(Var.Global("i",typeof), <@@ 2 @@>) with Lambda(v,b) -> v = Var.Global("i",typeof) && b = <@@ 2 @@> | _ -> false) true - check "vcknwwe0i" (match Expr.Let(Var.Global("i",typeof), <@@ 2 @@>, <@@ 3 @@>) with Let(v,e,b) -> v = Var.Global("i",typeof) && e = <@@ 2 @@> && b = <@@ 3 @@> | _ -> false) true - check "vcknwwe0o" (match Expr.LetRecursive([(Var.Global("i",typeof), <@@ 2 @@>)], <@@ 3 @@>) with LetRecursive([(v,e)],b) -> v = Var.Global("i",typeof) && e = <@@ 2 @@> && b = <@@ 3 @@> | _ -> false) true - check "vcknwwe0p" (match Expr.LetRecursive([(Var.Global("i",typeof), <@@ 2 @@>);(Var.Global("j",typeof), <@@ 3 @@>)], <@@ 3 @@>) with LetRecursive([(v1,e1);(v2,e2)],b) -> v1 = Var.Global("i",typeof) && v2 = Var.Global("j",typeof) && e1 = <@@ 2 @@> && e2 = <@@ 3 @@> && b = <@@ 3 @@> | _ -> false) true - check "vcknwwe0a" (Expr.NewArray(typeof,[ <@@ 1 @@>; <@@ 2 @@> ])) <@@ [| 1;2 |] @@> - check "vcknwwe0s" (match Expr.NewDelegate(typeof>,[ Var.Global("i",typeof) ], <@@ () @@>) with NewDelegate(ty,[v],e) -> ty = typeof> && v = Var.Global("i",typeof) && e = <@@ () @@> | _ -> false) true - check "vcknwwe0d" (match Expr.NewObject(ctorof <@@ new obj() @@> ,[ ]) with NewObject(ty,[]) -> ty = ctorof <@@ new obj() @@> | _ -> false) true - check "vcknwwe0f" (match Expr.NewObject(ctorof <@@ new System.String('a',3) @@> ,[ <@@ 'b' @@>; <@@ 4 @@>]) with NewObject(ty,[x;y]) -> ty = ctorof <@@ new string('a',3) @@> && x = <@@ 'b' @@> && y = <@@ 4 @@> | _ -> false) true - check "vcknwwe0g" (Expr.NewRecord(typeof ,[ <@@ 4 @@> ])) <@@ { contents = 4 } @@> - check "vcknwwe0h" (try let _ = Expr.NewTuple([]) in false with :? System.ArgumentException -> true) true - check "vcknwwe0j" (try let _ = Expr.NewTuple([ <@@ 1 @@> ]) in true with :? System.ArgumentException -> false) true - check "vcknwwe0k" (match Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>]) with NewTuple([x;y]) -> x = <@@ 'b' @@> && y = <@@ 4 @@> | _ -> false) true - check "vcknwwe0l" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>])) <@@ ('b',4) @@> - check "vcknwwe0z" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>])) <@@ ('b',4,5) @@> - check "vcknwwe0x" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>])) <@@ ('b',4,5,6) @@> - check "vcknwwe0c" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>; <@@ 7 @@>])) <@@ ('b',4,5,6,7) @@> - check "vcknwwe0v" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>; <@@ 7 @@>; <@@ 8 @@>])) <@@ ('b',4,5,6,7,8) @@> - check "vcknwwe0b" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>; <@@ 7 @@>; <@@ 8 @@>; <@@ 9 @@>])) <@@ ('b',4,5,6,7,8,9) @@> - check "vcknwwe0n" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>; <@@ 7 @@>; <@@ 8 @@>; <@@ 9 @@>; <@@ 10 @@>])) <@@ ('b',4,5,6,7,8,9,10) @@> - check "vcknwwe0m" (Expr.NewTuple([ <@@ 'b' @@>; <@@ 4 @@>; <@@ 5 @@>; <@@ 6 @@>; <@@ 7 @@>; <@@ 8 @@>; <@@ 9 @@>; <@@ 10 @@>])) <@@ ('b',4,5,6,7,8,9,10) @@> - check "vcknwwe011" (Expr.NewUnionCase(ucaseof <@@ Some(3) @@>,[ <@@ 4 @@> ])) <@@ Some(4) @@> - check "vcknwwe022" (Expr.NewUnionCase(ucaseof <@@ None @@>,[ ])) <@@ None @@> - check "vcknwwe033" (try let _ = Expr.NewUnionCase(ucaseof <@@ Some(3) @@>,[ ]) in false with :? ArgumentException -> true) true - check "vcknwwe044" (try let _ = Expr.NewUnionCase(ucaseof <@@ None @@>,[ <@@ 1 @@> ]) in false with :? ArgumentException -> true) true - check "vcknwwe055" (Expr.PropertyGet(getof <@@ System.DateTime.Now @@>,[ ])) <@@ System.DateTime.Now @@> - check "vcknwwe066" (try let _ = Expr.PropertyGet(getof <@@ System.DateTime.Now @@>,[ <@@ 1 @@> ]) in false with :? ArgumentException -> true) true - check "vcknwwe077" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>)) <@@ "3".Length @@> - check "vcknwwe088" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>,[ ])) <@@ "3".Length @@> - #if Portable - #else - check "vcknwwe099" (Expr.PropertySet(<@@ (new System.Windows.Forms.Form()) @@>, setof <@@ (new System.Windows.Forms.Form()).Text <- "2" @@>, <@@ "3" @@> )) <@@ (new System.Windows.Forms.Form()).Text <- "3" @@> - #endif - check "vcknwwe099" (Expr.PropertySet(<@@ (new Foo()) @@>, setof <@@ (new Foo()).[3] <- 1 @@>, <@@ 2 @@> , [ <@@ 3 @@> ] )) <@@ (new Foo()).[3] <- 2 @@> -#if FSHARP_CORE_31 -#else - check "vcknwwe0qq1" (Expr.QuoteRaw(<@ "1" @>)) <@@ <@@ "1" @@> @@> - check "vcknwwe0qq2" (Expr.QuoteRaw(<@@ "1" @@>)) <@@ <@@ "1" @@> @@> - check "vcknwwe0qq3" (Expr.QuoteTyped(<@ "1" @>)) <@@ <@ "1" @> @@> - check "vcknwwe0qq4" (Expr.QuoteTyped(<@@ "1" @@>)) <@@ <@ "1" @> @@> -#endif - check "vcknwwe0ww" (Expr.Sequential(<@@ () @@>, <@@ 1 @@>)) <@@ (); 1 @@> - check "vcknwwe0ee" (Expr.TryFinally(<@@ 1 @@>, <@@ () @@>)) <@@ try 1 finally () @@> - check "vcknwwe0rr" (match Expr.TryWith(<@@ 1 @@>, Var.Global("e1",typeof), <@@ 1 @@>, Var.Global("e2",typeof), <@@ 2 @@>) with TryWith(b,v1,ef,v2,eh) -> b = <@@ 1 @@> && eh = <@@ 2 @@> && ef = <@@ 1 @@> && v1 = Var.Global("e1",typeof) && v2 = Var.Global("e2",typeof)| _ -> false) true - check "vcknwwe0tt" (match Expr.TupleGet(<@@ (1,2) @@>, 0) with TupleGet(b,n) -> b = <@@ (1,2) @@> && n = 0 | _ -> false) true - check "vcknwwe0yy" (match Expr.TupleGet(<@@ (1,2) @@>, 1) with TupleGet(b,n) -> b = <@@ (1,2) @@> && n = 1 | _ -> false) true - check "vcknwwe0uu" (try let _ = Expr.TupleGet(<@@ (1,2) @@>, 2) in false with :? ArgumentException -> true) true - check "vcknwwe0ii" (try let _ = Expr.TupleGet(<@@ (1,2) @@>, -1) in false with :? ArgumentException -> true) true - for i = 0 to 7 do - check "vcknwwe0oo" (match Expr.TupleGet(<@@ (1,2,3,4,5,6,7,8) @@>, i) with TupleGet(b,n) -> b = <@@ (1,2,3,4,5,6,7,8) @@> && n = i | _ -> false) true - check "vcknwwe0pp" (match Expr.TypeTest(<@@ new obj() @@>, typeof) with TypeTest(e,ty) -> e = <@@ new obj() @@> && ty = typeof | _ -> false) true - check "vcknwwe0aa" (match Expr.UnionCaseTest(<@@ [] : int list @@>, ucaseof <@@ [] : int list @@> ) with UnionCaseTest(e,uc) -> e = <@@ [] : int list @@> && uc = ucaseof <@@ [] : int list @@> | _ -> false) true - check "vcknwwe0ss" (Expr.Value(3)) <@@ 3 @@> - check "vcknwwe0dd" (match Expr.Var(Var.Global("i",typeof)) with Var(v) -> v = Var.Global("i",typeof) | _ -> false) true - check "vcknwwe0ff" (match Expr.VarSet(Var.Global("i",typeof), <@@ 4 @@>) with VarSet(v,q) -> v = Var.Global("i",typeof) && q = <@@ 4 @@> | _ -> false) true - check "vcknwwe0gg" (match Expr.WhileLoop(<@@ true @@>, <@@ () @@>) with WhileLoop(g,b) -> g = <@@ true @@> && b = <@@ () @@> | _ -> false) true +module QuotationStructUnionTests = + + [] + type T = | A of int + + test "check NewUnionCase" (<@ A(1) @> |> (function NewUnionCase(unionCase,args) -> true | _ -> false)) + + [] + let foo v = match v with | A(1) -> 0 | _ -> 1 + + test "check TryGetReflectedDefinition (local f)" + ((<@ foo (A(1)) @> |> (function Call(None,minfo,args) -> Quotations.Expr.TryGetReflectedDefinition(minfo).IsSome | _ -> false))) + + [] + let test3297327 v = match v with | A(1) -> 0 | _ -> 1 + + test "check TryGetReflectedDefinition (local f)" + ((<@ foo (A(1)) @> |> (function Call(None,minfo,args) -> Quotations.Expr.TryGetReflectedDefinition(minfo).IsSome | _ -> false))) + + + [] + type T2 = + | A1 of int * int + + test "check NewUnionCase" (<@ A1(1,2) @> |> (function NewUnionCase(unionCase,[ Int32 1; Int32 2 ]) -> true | _ -> false)) + + //[] + //type T3 = + // | A1 of int * int + // + //test "check NewUnionCase" (<@ A1(1,2) @> |> (function NewUnionCase(unionCase,[ Int32 1; Int32 2 ]) -> true | _ -> false)) + module EqualityOnExprDoesntFail = let q = <@ 1 @> diff --git a/tests/fsharp/core/tests_core.fs b/tests/fsharp/core/tests_core.fs index 4e2d891b1d2..68ec3baeb85 100644 --- a/tests/fsharp/core/tests_core.fs +++ b/tests/fsharp/core/tests_core.fs @@ -266,8 +266,8 @@ module FsFromCs = let csc = Printf.ksprintf (Commands.csc exec cfg.CSC) let fsc_flags = cfg.fsc_flags - // "%FSC%" %fsc_flags% -a --doc:lib.xml -o:lib.dll -g lib.ml - do! fsc "%s -a --doc:lib.xml -o:lib.dll -g" fsc_flags ["lib.ml"] + // "%FSC%" %fsc_flags% -a --doc:lib.xml -o:lib.dll -g lib.fs + do! fsc "%s -a --doc:lib.xml -o:lib.dll -g" fsc_flags ["lib.fs"] // "%PEVERIFY%" lib.dll do! peverify "lib.dll" @@ -275,8 +275,8 @@ module FsFromCs = // %CSC% /nologo /r:"%FSCOREDLLPATH%" /r:System.Core.dll /r:lib.dll /out:test.exe test.cs do! csc """/nologo /r:"%s" /r:System.Core.dll /r:lib.dll /out:test.exe""" cfg.FSCOREDLLPATH ["test.cs"] - // "%FSC%" %fsc_flags% -a --doc:lib--optimize.xml -o:lib--optimize.dll -g lib.ml - do! fsc """%s -a --doc:lib--optimize.xml -o:lib--optimize.dll -g""" fsc_flags ["lib.ml"] + // "%FSC%" %fsc_flags% -a --doc:lib--optimize.xml -o:lib--optimize.dll -g lib.fs + do! fsc """%s -a --doc:lib--optimize.xml -o:lib--optimize.dll -g""" fsc_flags ["lib.fs"] // "%PEVERIFY%" lib--optimize.dll do! peverify "lib--optimize.dll" @@ -316,8 +316,8 @@ module FsFromFsViaCs = let csc = Printf.ksprintf (Commands.csc exec cfg.CSC) let fsc_flags = cfg.fsc_flags - // "%FSC%" %fsc_flags% -a -o:lib.dll -g lib.ml - do! fsc "%s -a -o:lib.dll -g" fsc_flags ["lib.ml"] + // "%FSC%" %fsc_flags% -a -o:lib.dll -g lib.fs + do! fsc "%s -a -o:lib.dll -g" fsc_flags ["lib.fs"] // "%PEVERIFY%" lib.dll do! peverify "lib.dll" From b7eb48eedb5c38bde8d7d47ef61954b9b0b00021 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 16 Jun 2016 17:51:47 +0100 Subject: [PATCH 274/334] fix unit test build --- .../FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs index 73f548920dc..517e69a9200 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/DiscrimantedUnionType.fs @@ -239,7 +239,7 @@ let [] ``can properly construct a struct union using FSharpValue.MakeUnion Assert.IsTrue (structUnion.GetType().IsValueType) - let fieldVals = Microsoft.FSharp.Reflection.FSharpValue.GetUnionFields(structUnion, typeof) + let _uc, fieldVals = Microsoft.FSharp.Reflection.FSharpValue.GetUnionFields(structUnion, typeof) Assert.AreEqual (2, fieldVals.Length) From 6e23f1576b846607e353af12929fc0c809dcd0e1 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 16 Jun 2016 21:49:06 +0300 Subject: [PATCH 275/334] add isStatic flag to ClassLetBinding and fix static do test --- src/fsharp/TypeChecker.fs | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index e6df37e2e19..4a862ea90d3 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1039,7 +1039,7 @@ type DeclKind = | IntrinsicExtensionBinding /// Extensions to a type in a different assembly | ExtrinsicExtensionBinding - | ClassLetBinding + | ClassLetBinding of (* isStatic *) bool | ObjectExpressionOverrideBinding | ExpressionBinding @@ -1048,7 +1048,7 @@ type DeclKind = | ModuleOrMemberBinding -> true | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true - | ClassLetBinding -> false + | ClassLetBinding _ -> false | ObjectExpressionOverrideBinding -> false | ExpressionBinding -> false @@ -1059,7 +1059,7 @@ type DeclKind = | ModuleOrMemberBinding -> true | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true - | ClassLetBinding -> true + | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> false | ExpressionBinding -> false @@ -1079,7 +1079,7 @@ type DeclKind = | None -> AttributeTargets.Field ||| AttributeTargets.Method ||| AttributeTargets.Property | IntrinsicExtensionBinding -> AttributeTargets.Method ||| AttributeTargets.Property | ExtrinsicExtensionBinding -> AttributeTargets.Method ||| AttributeTargets.Property - | ClassLetBinding -> AttributeTargets.Field ||| AttributeTargets.Method + | ClassLetBinding _ -> AttributeTargets.Field ||| AttributeTargets.Method | ExpressionBinding -> enum 0 // indicates attributes not allowed on expression 'let' bindings // Note: now always true @@ -1088,7 +1088,7 @@ type DeclKind = | ModuleOrMemberBinding -> true | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true - | ClassLetBinding -> true + | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> true | ExpressionBinding -> true @@ -1097,7 +1097,7 @@ type DeclKind = | ModuleOrMemberBinding -> true | IntrinsicExtensionBinding -> true | ExtrinsicExtensionBinding -> true - | ClassLetBinding -> true + | ClassLetBinding _ -> true | ObjectExpressionOverrideBinding -> true | ExpressionBinding -> false @@ -1106,7 +1106,7 @@ type DeclKind = | ModuleOrMemberBinding -> OverridesOK | IntrinsicExtensionBinding -> WarnOnOverrides | ExtrinsicExtensionBinding -> ErrorOnOverrides - | ClassLetBinding -> ErrorOnOverrides + | ClassLetBinding _ -> ErrorOnOverrides | ObjectExpressionOverrideBinding -> OverridesOK | ExpressionBinding -> ErrorOnOverrides @@ -9650,7 +9650,8 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt | MemberKind.Constructor -> Some(".ctor") | _ -> Some(name.idText) | _ -> Some(name.idText) - | ClassLetBinding, DoBinding, _ -> Some(".ctor") + | ClassLetBinding(false), DoBinding, _ -> Some(".ctor") + | ClassLetBinding(true), DoBinding, _ -> Some(".cctor") | ModuleOrMemberBinding, StandaloneExpression, _ -> Some(".cctor") | _, _, _ -> envinner.eCallerMemberName @@ -9686,8 +9687,10 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if isThreadStatic then errorR(DeprecatedThreadStaticBindingWarning(mBinding)) if isVolatile then - if declKind <> ClassLetBinding then - errorR(Error(FSComp.SR.tcVolatileOnlyOnClassLetBindings(),mBinding)) + match declKind with + | ClassLetBinding(_) -> () + | _ -> errorR(Error(FSComp.SR.tcVolatileOnlyOnClassLetBindings(),mBinding)) + if (not isMutable || isThreadStatic) then errorR(Error(FSComp.SR.tcVolatileFieldsMustBeMutable(),mBinding)) @@ -11546,7 +11549,7 @@ module IncrClassChecking = begin // --- Create this for use inside constructor let thisId = ident ("this",m) let thisValScheme = ValScheme(thisId,NonGenericTypeScheme(thisTy),None,None,false,ValInline.Never,CtorThisVal,None,true,false,false,false) - let thisVal = MakeAndPublishVal cenv env (ParentNone,false,ClassLetBinding,ValNotInRecScope,thisValScheme,[],XmlDoc.Empty,None,false) + let thisVal = MakeAndPublishVal cenv env (ParentNone,false,ClassLetBinding(false),ValNotInRecScope,thisValScheme,[],XmlDoc.Empty,None,false) thisVal {TyconRef = tcref @@ -12530,14 +12533,14 @@ module TyconBindingChecking = begin if isRec then // Type check local recursive binding - let binds = binds |> List.map (fun bind -> RecBindingDefn(ExprContainerInfo,NoNewSlots,ClassLetBinding,bind)) + let binds = binds |> List.map (fun bind -> RecBindingDefn(ExprContainerInfo,NoNewSlots,ClassLetBinding(isStatic),bind)) let binds,env,tpenv = TcLetrec ErrorOnOverrides cenv envForBinding tpenv (binds,scopem(*bindsm*),scopem) let bindRs = [IncrClassBindingGroup(binds,isStatic,true)] binds,bindRs,env,tpenv else // Type check local binding - let binds,env,tpenv = TcLetBindings cenv envForBinding ExprContainerInfo ClassLetBinding tpenv (binds,bindsm,scopem) + let binds,env,tpenv = TcLetBindings cenv envForBinding ExprContainerInfo (ClassLetBinding(isStatic)) tpenv (binds,bindsm,scopem) let binds,bindRs = binds |> List.map (function From fe5d94199857c314fc45d4763004b14cbf717d4e Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 16 Jun 2016 22:24:25 +0300 Subject: [PATCH 276/334] fix merge --- src/fsharp/FSComp.txt | 3 +-- src/fsharp/TypeChecker.fs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index b96c189cf00..5f2d6a014c5 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1309,5 +1309,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3201,tcModuleAbbrevFirstInMutRec,"In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations" 3202,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3203,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" -3204,considerUpcastOperator,"The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator." -3205,CallerMemberNameIsOverriden,"The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." \ No newline at end of file +3204,CallerMemberNameIsOverriden,"The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute." \ No newline at end of file diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index d8e228776c2..e7e04d0d791 100644 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -12759,7 +12759,7 @@ module MutRecBindingChecking = if isRec then // Type check local recursive binding - let binds = binds |> List.map (fun bind -> RecBindingDefnInfo(ExprContainerInfo,NoNewSlots,ClassLetBinding(isStatic),bind)) + let binds = binds |> List.map (fun bind -> RecDefnBindingInfo(ExprContainerInfo,NoNewSlots,ClassLetBinding(isStatic),bind)) let binds,env,tpenv = TcLetrec ErrorOnOverrides cenv envForBinding tpenv (binds,scopem(*bindsm*),scopem) let bindRs = [IncrClassBindingGroup(binds,isStatic,true)] binds,bindRs,env,tpenv From 4c1f44409b22ce445bdf43d70e4c88d837b8b040 Mon Sep 17 00:00:00 2001 From: "Avi.Avni" Date: Thu, 16 Jun 2016 22:25:52 +0300 Subject: [PATCH 277/334] fix test --- .../Imported/CallerInfo/W_CallerMemberName.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs index 2ee25fac1b0..2e79d315582 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/W_CallerMemberName.fs @@ -1,4 +1,4 @@ -//The CallerMemberNameAttribute applied to parameter 'name' will have no effect. It is overridden by the CallerFilePathAttribute. +//The CallerMemberNameAttribute applied to parameter 'name' will have no effect. It is overridden by the CallerFilePathAttribute. namespace Test open System.Runtime.CompilerServices From cacc03f51f7ee043d3f5d60d04f687766634995e Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 00:01:04 +0100 Subject: [PATCH 278/334] allow elimination of more copy-of-struct locals --- src/fsharp/TastOps.fs | 25 ++++++++++++++----------- src/fsharp/TastOps.fsi | 2 +- src/fsharp/TypeChecker.fs | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index a1e9a6717f2..969265ac484 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -5041,14 +5041,14 @@ and remarkBind m (TBind(v,repr,_)) = //-------------------------------------------------------------------------- let isRecdOrStructFieldAllocObservable (f:RecdField) = not f.IsStatic && f.IsMutable -let ucaseAllocObservable (uc:UnionCase) = uc.FieldTable.FieldsByIndex |> Array.exists isRecdOrStructFieldAllocObservable -let isUnionCaseAllocObservable (uc:UnionCaseRef) = uc.UnionCase |> ucaseAllocObservable +let isUnionCaseAllocObservable (uc:UnionCase) = uc.FieldTable.FieldsByIndex |> Array.exists isRecdOrStructFieldAllocObservable +let isUnionCaseRefAllocObservable (uc:UnionCaseRef) = uc.UnionCase |> isUnionCaseAllocObservable let isRecdOrUnionOrStructTyconAllocObservable (_g:TcGlobals) (tycon:Tycon) = - if tycon.IsRecordTycon || tycon.IsStructOrEnumTycon then + if tycon.IsUnionTycon then + tycon.UnionCasesArray |> Array.exists isUnionCaseAllocObservable + elif tycon.IsRecordTycon || tycon.IsStructOrEnumTycon then tycon.AllFieldsArray |> Array.exists isRecdOrStructFieldAllocObservable - elif tycon.IsUnionTycon then - tycon.UnionCasesArray |> Array.exists ucaseAllocObservable else false @@ -5374,7 +5374,7 @@ let mkAndSimplifyMatch spBind exprm matchm ty tree targets = type Mutates = DefinitelyMutates | PossiblyMutates | NeverMutates exception DefensiveCopyWarning of string * range -let isRecdOrStuctTyImmutable g ty = +let isRecdOrStructTyImmutable g ty = match tryDestAppTy g ty with | None -> false | Some tcref -> @@ -5393,7 +5393,7 @@ let isRecdOrStuctTyImmutable g ty = // let g1 = A.G(1) // (fun () -> g1.x1) // -// Note: isRecdOrStuctTyImmutable implies PossiblyMutates or NeverMutates +// Note: isRecdOrStructTyImmutable implies PossiblyMutates or NeverMutates // // We only do this for true local or closure fields because we can't take adddresses of immutable static // fields across assemblies. @@ -5404,7 +5404,7 @@ let CanTakeAddressOfImmutableVal g (v:ValRef) mut = not v.IsMemberOrModuleBinding && (match mut with | NeverMutates -> true - | PossiblyMutates -> isRecdOrStuctTyImmutable g v.Type + | PossiblyMutates -> isRecdOrStructTyImmutable g v.Type | DefinitelyMutates -> false) let MustTakeAddressOfVal g (v:ValRef) = @@ -5423,13 +5423,13 @@ let CanTakeAddressOfRecdFieldRef g (rfref: RecdFieldRef) mut tinst = mut <> DefinitelyMutates && // We only do this if the field is defined in this assembly because we can't take adddresses across assemblies for immutable fields entityRefInThisAssembly g.compilingFslib rfref.TyconRef && - isRecdOrStuctTyImmutable g (actualTyOfRecdFieldRef rfref tinst) + isRecdOrStructTyImmutable g (actualTyOfRecdFieldRef rfref tinst) let CanTakeAddressOfUnionFieldRef g (uref: UnionCaseRef) mut tinst cidx = mut <> DefinitelyMutates && // We only do this if the field is defined in this assembly because we can't take adddresses across assemblies for immutable fields entityRefInThisAssembly g.compilingFslib uref.TyconRef && - isRecdOrStuctTyImmutable g (actualTyOfUnionFieldRef uref cidx tinst) + isRecdOrStructTyImmutable g (actualTyOfUnionFieldRef uref cidx tinst) let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m = @@ -5511,7 +5511,10 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress errorR(Error(FSComp.SR.tastInvalidMutationOfConstant(),m)); | PossiblyMutates -> warning(DefensiveCopyWarning(FSComp.SR.tastValueHasBeenCopied(),m)); - let tmp,_ = mkMutableCompGenLocal m "copyOfStruct" ty + let tmp,_ = + match mut with + | NeverMutates -> mkCompGenLocal m "copyOfStruct" ty + | _ -> mkMutableCompGenLocal m "copyOfStruct" ty Some (tmp,e), (mkValAddr m (mkLocalValRef tmp)) let mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut e addrExprVal m = diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 4eefb78177a..e99cabd7c14 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1046,7 +1046,7 @@ val TypeHasDefaultValue : TcGlobals -> range -> TType -> bool val isAbstractTycon : Tycon -> bool -val isUnionCaseAllocObservable : UnionCaseRef -> bool +val isUnionCaseRefAllocObservable : UnionCaseRef -> bool val isRecdOrUnionOrStructTyconRefAllocObservable : TcGlobals -> TyconRef -> bool val isExnAllocObservable : TyconRef -> bool val isUnionCaseFieldMutable : TcGlobals -> UnionCaseRef -> int -> bool diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 30085eac622..de38c64e531 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2037,7 +2037,7 @@ module GeneralizationHelpers = | Expr.Op(op,_,args,_) -> match op with | TOp.Tuple -> true - | TOp.UnionCase uc -> not (isUnionCaseAllocObservable uc) + | TOp.UnionCase uc -> not (isUnionCaseRefAllocObservable uc) | TOp.Recd(ctorInfo,tcref) -> match ctorInfo with | RecdExpr -> not (isRecdOrUnionOrStructTyconRefAllocObservable g tcref) From 6fd1c5ef3cae73562c78ff6d5a0e326c830749bf Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Thu, 16 Jun 2016 16:04:37 -0700 Subject: [PATCH 279/334] Not generating assembly versions if it already exists --- src/Microbuild.Settings.targets | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Microbuild.Settings.targets b/src/Microbuild.Settings.targets index da413419000..dbd0730806e 100644 --- a/src/Microbuild.Settings.targets +++ b/src/Microbuild.Settings.targets @@ -107,6 +107,7 @@ + @@ -155,9 +156,18 @@ throw new ArgumentException("Language " + Language + " is not supported"); } - AssemblyFileVersionPath = Path.GetTempFileName() + "." + Language; - Log.LogMessage("Generating AssemblyFileVersion file: " + AssemblyFileVersionPath, MessageImportance.High); - File.WriteAllText(AssemblyFileVersionPath, stringBuilder.ToString()); + var fileContents = stringBuilder.ToString(); + AssemblyFileVersionPath = Path.Combine(Path.GetTempPath(), string.Join(".", AssemblyName, "AssemblyFileVersion", Language)); + + if (File.Exists(AssemblyFileVersionPath) && File.ReadAllText(AssemblyFileVersionPath) == fileContents) + { + Log.LogMessage("Assembly file version already exists. Using: " + AssemblyFileVersionPath, MessageImportance.High); + } + else + { + Log.LogMessage("Generating AssemblyFileVersion file: " + AssemblyFileVersionPath, MessageImportance.High); + File.WriteAllText(AssemblyFileVersionPath, fileContents); + } ]]> @@ -199,6 +209,7 @@ Language="$(MicroBuildAssemblyFileLanguage)" ProductVersion="$(MicroBuildAssemblyVersion)" BuildNumber="$(BUILD_BUILDNUMBER)" + AssemblyName="$(AssemblyName)" Condition="'$(MicroBuildAssemblyFileLanguage)' != '' and '$(MicroBuildAssemblyVersion)' != ''"> From 0e72bebcf32127089d5c80a6fbb63ef703c5da46 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 00:17:08 +0100 Subject: [PATCH 280/334] add new test for struct union codegen --- .../Optimizations/Inlining/StructUnion01.fs | 39 + .../Inlining/StructUnion01.il.bsl | 725 ++++++++++++++++++ .../Source/Optimizations/Inlining/env.lst | 1 + 3 files changed, 765 insertions(+) create mode 100644 tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.fs create mode 100644 tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.il.bsl diff --git a/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.fs b/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.fs new file mode 100644 index 00000000000..d3e41ff4788 --- /dev/null +++ b/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.fs @@ -0,0 +1,39 @@ +// #NoMono #CodeGen #Optimizations +module StructUnion01 + +[] +type U = U of int * int + +let g1 (U(a,b)) = a + b + +let g2 u = + let (U(a,b)) = u + a + b + +let g3 (x:U) = + match x with + | U(3,a) -> a + | U(a,b) -> a + b + +let g4 (x:U) (y: U) = + match x,y with + | U(3,a), U(5,b) -> a + b + | U(a,b), U(c,d) -> a + b + c + d + +let f1 (x:U byref) = + let (U(a,b)) = x + a + b + +let f2 (x:U byref) = + match x with + | U(a,b) -> a + b + +let f3 (x:U byref) = + match x with + | U(3,a) -> a + | U(a,b) -> a + b + +let f4 (x:U byref) (y: U byref) = + match x,y with + | U(3,a), U(5,b) -> a + b + | U(a,b), U(c,d) -> a + b + c + d diff --git a/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.il.bsl b/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.il.bsl new file mode 100644 index 00000000000..95df244b59b --- /dev/null +++ b/tests/fsharpqa/Source/Optimizations/Inlining/StructUnion01.il.bsl @@ -0,0 +1,725 @@ + +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Copyright (c) Microsoft Corporation. All rights reserved. + + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:4:1:0 +} +.assembly StructUnion01 +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.StructUnion01 +{ + // Offset: 0x00000000 Length: 0x0000088A +} +.mresource public FSharpOptimizationData.StructUnion01 +{ + // Offset: 0x00000890 Length: 0x00000421 +} +.module StructUnion01.dll +// MVID: {576332E3-D3E9-6B24-A745-0383E3326357} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x007C0000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed StructUnion01 + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .class auto autochar serializable sealed nested public beforefieldinit U + extends [mscorlib]System.ValueType + implements class [mscorlib]System.IEquatable`1, + [mscorlib]System.Collections.IStructuralEquatable, + class [mscorlib]System.IComparable`1, + [mscorlib]System.IComparable, + [mscorlib]System.Collections.IStructuralComparable + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.StructAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerDisplayAttribute::.ctor(string) = ( 01 00 15 7B 5F 5F 44 65 62 75 67 44 69 73 70 6C // ...{__DebugDispl + 61 79 28 29 2C 6E 71 7D 00 00 ) // ay(),nq}.. + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 01 00 00 00 00 00 ) + .field assembly int32 item1 + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .field assembly int32 item2 + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .method public static valuetype StructUnion01/U + NewU(int32 item1, + int32 item2) cil managed + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32) = ( 01 00 08 00 00 00 00 00 00 00 00 00 ) + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: newobj instance void StructUnion01/U::.ctor(int32, + int32) + IL_0007: ret + } // end of method U::NewU + + .method assembly specialname rtspecialname + instance void .ctor(int32 item1, + int32 item2) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 15 (0xf) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: stfld int32 StructUnion01/U::item1 + IL_0007: ldarg.0 + IL_0008: ldarg.2 + IL_0009: stfld int32 StructUnion01/U::item2 + IL_000e: ret + } // end of method U::.ctor + + .method public hidebysig instance int32 + get_Item1() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 StructUnion01/U::item1 + IL_0006: ret + } // end of method U::get_Item1 + + .method public hidebysig instance int32 + get_Item2() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 StructUnion01/U::item2 + IL_0006: ret + } // end of method U::get_Item2 + + .method public hidebysig instance int32 + get_Tag() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 4 (0x4) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: pop + IL_0002: ldc.i4.0 + IL_0003: ret + } // end of method U::get_Tag + + .method assembly hidebysig specialname + instance object __DebugDisplay() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 27 (0x1b) + .maxstack 8 + IL_0000: ldstr "%+0.8A" + IL_0005: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5,class [FSharp.Core]Microsoft.FSharp.Core.Unit,string,string,string>::.ctor(string) + IL_000a: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatToString>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) + IL_000f: ldarg.0 + IL_0010: ldobj StructUnion01/U + IL_0015: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::Invoke(!0) + IL_001a: ret + } // end of method U::__DebugDisplay + + .method public hidebysig virtual final + instance int32 CompareTo(valuetype StructUnion01/U obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 77 (0x4d) + .maxstack 4 + .locals init (int32 V_0, + class [mscorlib]System.Collections.IComparer V_1, + int32 V_2, + int32 V_3) + IL_0000: ldarg.0 + IL_0001: pop + IL_0002: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0007: stloc.1 + IL_0008: ldarg.0 + IL_0009: ldfld int32 StructUnion01/U::item1 + IL_000e: stloc.2 + IL_000f: ldarg.1 + IL_0010: ldfld int32 StructUnion01/U::item1 + IL_0015: stloc.3 + IL_0016: ldloc.2 + IL_0017: ldloc.3 + IL_0018: bge.s IL_001d + + IL_001a: ldc.i4.m1 + IL_001b: br.s IL_0021 + + IL_001d: ldloc.2 + IL_001e: ldloc.3 + IL_001f: cgt + IL_0021: stloc.0 + IL_0022: ldloc.0 + IL_0023: ldc.i4.0 + IL_0024: bge.s IL_0028 + + IL_0026: ldloc.0 + IL_0027: ret + + IL_0028: ldloc.0 + IL_0029: ldc.i4.0 + IL_002a: ble.s IL_002e + + IL_002c: ldloc.0 + IL_002d: ret + + IL_002e: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0033: stloc.1 + IL_0034: ldarg.0 + IL_0035: ldfld int32 StructUnion01/U::item2 + IL_003a: stloc.2 + IL_003b: ldarg.1 + IL_003c: ldfld int32 StructUnion01/U::item2 + IL_0041: stloc.3 + IL_0042: ldloc.2 + IL_0043: ldloc.3 + IL_0044: bge.s IL_0048 + + IL_0046: ldc.i4.m1 + IL_0047: ret + + IL_0048: ldloc.2 + IL_0049: ldloc.3 + IL_004a: cgt + IL_004c: ret + } // end of method U::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 13 (0xd) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: unbox.any StructUnion01/U + IL_0007: call instance int32 StructUnion01/U::CompareTo(valuetype StructUnion01/U) + IL_000c: ret + } // end of method U::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj, + class [mscorlib]System.Collections.IComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 81 (0x51) + .maxstack 4 + .locals init (valuetype StructUnion01/U V_0, + valuetype StructUnion01/U& V_1, + int32 V_2, + int32 V_3, + int32 V_4) + IL_0000: ldarg.1 + IL_0001: unbox.any StructUnion01/U + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: stloc.1 + IL_000a: ldarg.0 + IL_000b: pop + IL_000c: ldarg.0 + IL_000d: ldfld int32 StructUnion01/U::item1 + IL_0012: stloc.3 + IL_0013: ldloc.1 + IL_0014: ldfld int32 StructUnion01/U::item1 + IL_0019: stloc.s V_4 + IL_001b: ldloc.3 + IL_001c: ldloc.s V_4 + IL_001e: bge.s IL_0023 + + IL_0020: ldc.i4.m1 + IL_0021: br.s IL_0028 + + IL_0023: ldloc.3 + IL_0024: ldloc.s V_4 + IL_0026: cgt + IL_0028: stloc.2 + IL_0029: ldloc.2 + IL_002a: ldc.i4.0 + IL_002b: bge.s IL_002f + + IL_002d: ldloc.2 + IL_002e: ret + + IL_002f: ldloc.2 + IL_0030: ldc.i4.0 + IL_0031: ble.s IL_0035 + + IL_0033: ldloc.2 + IL_0034: ret + + IL_0035: ldarg.0 + IL_0036: ldfld int32 StructUnion01/U::item2 + IL_003b: stloc.3 + IL_003c: ldloc.1 + IL_003d: ldfld int32 StructUnion01/U::item2 + IL_0042: stloc.s V_4 + IL_0044: ldloc.3 + IL_0045: ldloc.s V_4 + IL_0047: bge.s IL_004b + + IL_0049: ldc.i4.m1 + IL_004a: ret + + IL_004b: ldloc.3 + IL_004c: ldloc.s V_4 + IL_004e: cgt + IL_0050: ret + } // end of method U::CompareTo + + .method public hidebysig virtual final + instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 50 (0x32) + .maxstack 7 + .locals init (int32 V_0) + IL_0000: ldc.i4.0 + IL_0001: stloc.0 + IL_0002: ldarg.0 + IL_0003: pop + IL_0004: ldc.i4.0 + IL_0005: stloc.0 + IL_0006: ldc.i4 0x9e3779b9 + IL_000b: ldarg.0 + IL_000c: ldfld int32 StructUnion01/U::item2 + IL_0011: ldloc.0 + IL_0012: ldc.i4.6 + IL_0013: shl + IL_0014: ldloc.0 + IL_0015: ldc.i4.2 + IL_0016: shr + IL_0017: add + IL_0018: add + IL_0019: add + IL_001a: stloc.0 + IL_001b: ldc.i4 0x9e3779b9 + IL_0020: ldarg.0 + IL_0021: ldfld int32 StructUnion01/U::item1 + IL_0026: ldloc.0 + IL_0027: ldc.i4.6 + IL_0028: shl + IL_0029: ldloc.0 + IL_002a: ldc.i4.2 + IL_002b: shr + IL_002c: add + IL_002d: add + IL_002e: add + IL_002f: stloc.0 + IL_0030: ldloc.0 + IL_0031: ret + } // end of method U::GetHashCode + + .method public hidebysig virtual final + instance int32 GetHashCode() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 12 (0xc) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() + IL_0006: call instance int32 StructUnion01/U::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) + IL_000b: ret + } // end of method U::GetHashCode + + .method public hidebysig virtual final + instance bool Equals(object obj, + class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 53 (0x35) + .maxstack 4 + .locals init (valuetype StructUnion01/U V_0, + valuetype StructUnion01/U& V_1) + IL_0000: ldarg.1 + IL_0001: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) + IL_0006: brtrue.s IL_000a + + IL_0008: ldc.i4.0 + IL_0009: ret + + IL_000a: ldarg.1 + IL_000b: unbox.any StructUnion01/U + IL_0010: stloc.0 + IL_0011: ldloca.s V_0 + IL_0013: stloc.1 + IL_0014: ldarg.0 + IL_0015: pop + IL_0016: ldarg.0 + IL_0017: ldfld int32 StructUnion01/U::item1 + IL_001c: ldloc.1 + IL_001d: ldfld int32 StructUnion01/U::item1 + IL_0022: bne.un.s IL_0033 + + IL_0024: ldarg.0 + IL_0025: ldfld int32 StructUnion01/U::item2 + IL_002a: ldloc.1 + IL_002b: ldfld int32 StructUnion01/U::item2 + IL_0030: ceq + IL_0032: ret + + IL_0033: ldc.i4.0 + IL_0034: ret + } // end of method U::Equals + + .method public hidebysig virtual final + instance bool Equals(valuetype StructUnion01/U obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 36 (0x24) + .maxstack 4 + .locals init (valuetype StructUnion01/U& V_0) + IL_0000: ldarga.s obj + IL_0002: stloc.0 + IL_0003: ldarg.0 + IL_0004: pop + IL_0005: ldarg.0 + IL_0006: ldfld int32 StructUnion01/U::item1 + IL_000b: ldloc.0 + IL_000c: ldfld int32 StructUnion01/U::item1 + IL_0011: bne.un.s IL_0022 + + IL_0013: ldarg.0 + IL_0014: ldfld int32 StructUnion01/U::item2 + IL_0019: ldloc.0 + IL_001a: ldfld int32 StructUnion01/U::item2 + IL_001f: ceq + IL_0021: ret + + IL_0022: ldc.i4.0 + IL_0023: ret + } // end of method U::Equals + + .method public hidebysig virtual final + instance bool Equals(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 23 (0x17) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: call bool [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/IntrinsicFunctions::TypeTestGeneric(object) + IL_0006: brtrue.s IL_000a + + IL_0008: ldc.i4.0 + IL_0009: ret + + IL_000a: ldarg.0 + IL_000b: ldarg.1 + IL_000c: unbox.any StructUnion01/U + IL_0011: call instance bool StructUnion01/U::Equals(valuetype StructUnion01/U) + IL_0016: ret + } // end of method U::Equals + + .property instance int32 Tag() + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .get instance int32 StructUnion01/U::get_Tag() + } // end of property U::Tag + .property instance int32 Item1() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32, + int32) = ( 01 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .get instance int32 StructUnion01/U::get_Item1() + } // end of property U::Item1 + .property instance int32 Item2() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32, + int32) = ( 01 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .get instance int32 StructUnion01/U::get_Item2() + } // end of property U::Item2 + } // end of class U + + .method public static int32 g1(valuetype StructUnion01/U _arg1) cil managed + { + // Code size 16 (0x10) + .maxstack 8 + IL_0000: ldarga.s _arg1 + IL_0002: ldfld int32 StructUnion01/U::item1 + IL_0007: ldarga.s _arg1 + IL_0009: ldfld int32 StructUnion01/U::item2 + IL_000e: add + IL_000f: ret + } // end of method StructUnion01::g1 + + .method public static int32 g2(valuetype StructUnion01/U u) cil managed + { + // Code size 16 (0x10) + .maxstack 8 + IL_0000: ldarga.s u + IL_0002: ldfld int32 StructUnion01/U::item1 + IL_0007: ldarga.s u + IL_0009: ldfld int32 StructUnion01/U::item2 + IL_000e: add + IL_000f: ret + } // end of method StructUnion01::g2 + + .method public static int32 g3(valuetype StructUnion01/U x) cil managed + { + // Code size 42 (0x2a) + .maxstack 8 + IL_0000: ldarga.s x + IL_0002: ldfld int32 StructUnion01/U::item1 + IL_0007: ldc.i4.3 + IL_0008: sub + IL_0009: switch ( + IL_0022) + IL_0012: ldarga.s x + IL_0014: ldfld int32 StructUnion01/U::item1 + IL_0019: ldarga.s x + IL_001b: ldfld int32 StructUnion01/U::item2 + IL_0020: add + IL_0021: ret + + IL_0022: ldarga.s x + IL_0024: ldfld int32 StructUnion01/U::item2 + IL_0029: ret + } // end of method StructUnion01::g3 + + .method public static int32 g4(valuetype StructUnion01/U x, + valuetype StructUnion01/U y) cil managed + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationArgumentCountsAttribute::.ctor(int32[]) = ( 01 00 02 00 00 00 01 00 00 00 01 00 00 00 00 00 ) + // Code size 126 (0x7e) + .maxstack 6 + .locals init (int32 V_0, + int32 V_1, + int32 V_2, + int32 V_3) + IL_0000: ldarga.s x + IL_0002: ldfld int32 StructUnion01/U::item1 + IL_0007: ldc.i4.3 + IL_0008: sub + IL_0009: switch ( + IL_003a) + IL_0012: ldarga.s y + IL_0014: ldfld int32 StructUnion01/U::item2 + IL_0019: stloc.0 + IL_001a: ldarga.s y + IL_001c: ldfld int32 StructUnion01/U::item1 + IL_0021: stloc.1 + IL_0022: ldarga.s x + IL_0024: ldfld int32 StructUnion01/U::item2 + IL_0029: stloc.2 + IL_002a: ldarga.s x + IL_002c: ldfld int32 StructUnion01/U::item1 + IL_0031: stloc.3 + IL_0032: ldloc.3 + IL_0033: ldloc.2 + IL_0034: add + IL_0035: ldloc.1 + IL_0036: add + IL_0037: ldloc.0 + IL_0038: add + IL_0039: ret + + IL_003a: ldarga.s y + IL_003c: ldfld int32 StructUnion01/U::item1 + IL_0041: ldc.i4.5 + IL_0042: sub + IL_0043: switch ( + IL_006e) + IL_004c: ldarga.s y + IL_004e: ldfld int32 StructUnion01/U::item2 + IL_0053: ldarga.s y + IL_0055: ldfld int32 StructUnion01/U::item1 + IL_005a: ldarga.s x + IL_005c: ldfld int32 StructUnion01/U::item2 + IL_0061: ldarga.s x + IL_0063: ldfld int32 StructUnion01/U::item1 + IL_0068: stloc.3 + IL_0069: stloc.2 + IL_006a: stloc.1 + IL_006b: stloc.0 + IL_006c: br.s IL_0032 + + IL_006e: ldarga.s x + IL_0070: ldfld int32 StructUnion01/U::item2 + IL_0075: ldarga.s y + IL_0077: ldfld int32 StructUnion01/U::item2 + IL_007c: add + IL_007d: ret + } // end of method StructUnion01::g4 + + .method public static int32 f1(valuetype StructUnion01/U& x) cil managed + { + // Code size 23 (0x17) + .maxstack 4 + .locals init (valuetype StructUnion01/U V_0) + IL_0000: ldarg.0 + IL_0001: ldobj StructUnion01/U + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: ldfld int32 StructUnion01/U::item1 + IL_000e: ldloca.s V_0 + IL_0010: ldfld int32 StructUnion01/U::item2 + IL_0015: add + IL_0016: ret + } // end of method StructUnion01::f1 + + .method public static int32 f2(valuetype StructUnion01/U& x) cil managed + { + // Code size 23 (0x17) + .maxstack 4 + .locals init (valuetype StructUnion01/U V_0) + IL_0000: ldarg.0 + IL_0001: ldobj StructUnion01/U + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: ldfld int32 StructUnion01/U::item1 + IL_000e: ldloca.s V_0 + IL_0010: ldfld int32 StructUnion01/U::item2 + IL_0015: add + IL_0016: ret + } // end of method StructUnion01::f2 + + .method public static int32 f3(valuetype StructUnion01/U& x) cil managed + { + // Code size 49 (0x31) + .maxstack 4 + .locals init (valuetype StructUnion01/U V_0) + IL_0000: ldarg.0 + IL_0001: ldobj StructUnion01/U + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: ldfld int32 StructUnion01/U::item1 + IL_000e: ldc.i4.3 + IL_000f: sub + IL_0010: switch ( + IL_0029) + IL_0019: ldloca.s V_0 + IL_001b: ldfld int32 StructUnion01/U::item1 + IL_0020: ldloca.s V_0 + IL_0022: ldfld int32 StructUnion01/U::item2 + IL_0027: add + IL_0028: ret + + IL_0029: ldloca.s V_0 + IL_002b: ldfld int32 StructUnion01/U::item2 + IL_0030: ret + } // end of method StructUnion01::f3 + + .method public static int32 f4(valuetype StructUnion01/U& x, + valuetype StructUnion01/U& y) cil managed + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationArgumentCountsAttribute::.ctor(int32[]) = ( 01 00 02 00 00 00 01 00 00 00 01 00 00 00 00 00 ) + // Code size 146 (0x92) + .maxstack 6 + .locals init (valuetype StructUnion01/U V_0, + valuetype StructUnion01/U V_1, + int32 V_2, + int32 V_3, + int32 V_4, + int32 V_5) + IL_0000: ldarg.0 + IL_0001: ldobj StructUnion01/U + IL_0006: stloc.0 + IL_0007: ldarg.1 + IL_0008: ldobj StructUnion01/U + IL_000d: stloc.1 + IL_000e: ldloca.s V_0 + IL_0010: ldfld int32 StructUnion01/U::item1 + IL_0015: ldc.i4.3 + IL_0016: sub + IL_0017: switch ( + IL_004c) + IL_0020: ldloca.s V_1 + IL_0022: ldfld int32 StructUnion01/U::item2 + IL_0027: stloc.2 + IL_0028: ldloca.s V_1 + IL_002a: ldfld int32 StructUnion01/U::item1 + IL_002f: stloc.3 + IL_0030: ldloca.s V_0 + IL_0032: ldfld int32 StructUnion01/U::item2 + IL_0037: stloc.s V_4 + IL_0039: ldloca.s V_0 + IL_003b: ldfld int32 StructUnion01/U::item1 + IL_0040: stloc.s V_5 + IL_0042: ldloc.s V_5 + IL_0044: ldloc.s V_4 + IL_0046: add + IL_0047: ldloc.3 + IL_0048: add + IL_0049: ldloc.2 + IL_004a: add + IL_004b: ret + + IL_004c: ldloca.s V_1 + IL_004e: ldfld int32 StructUnion01/U::item1 + IL_0053: ldc.i4.5 + IL_0054: sub + IL_0055: switch ( + IL_0082) + IL_005e: ldloca.s V_1 + IL_0060: ldfld int32 StructUnion01/U::item2 + IL_0065: ldloca.s V_1 + IL_0067: ldfld int32 StructUnion01/U::item1 + IL_006c: ldloca.s V_0 + IL_006e: ldfld int32 StructUnion01/U::item2 + IL_0073: ldloca.s V_0 + IL_0075: ldfld int32 StructUnion01/U::item1 + IL_007a: stloc.s V_5 + IL_007c: stloc.s V_4 + IL_007e: stloc.3 + IL_007f: stloc.2 + IL_0080: br.s IL_0042 + + IL_0082: ldloca.s V_0 + IL_0084: ldfld int32 StructUnion01/U::item2 + IL_0089: ldloca.s V_1 + IL_008b: ldfld int32 StructUnion01/U::item2 + IL_0090: add + IL_0091: ret + } // end of method StructUnion01::f4 + +} // end of class StructUnion01 + +.class private abstract auto ansi sealed ''.$StructUnion01 + extends [mscorlib]System.Object +{ +} // end of class ''.$StructUnion01 + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/Source/Optimizations/Inlining/env.lst b/tests/fsharpqa/Source/Optimizations/Inlining/env.lst index 36d62b41f3d..29c1d15832e 100644 --- a/tests/fsharpqa/Source/Optimizations/Inlining/env.lst +++ b/tests/fsharpqa/Source/Optimizations/Inlining/env.lst @@ -1,2 +1,3 @@ NoMT SOURCE=Match01.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Match01.dll" # Match01.fs NoMT SOURCE=Match02.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Match02.dll" # Match02.fs +NoMT SOURCE=StructUnion01.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd StructUnion01.dll" # Match02.fs From 583214b7c5a2375cdae0844c7ab9b81e0b0ce767 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 01:32:43 +0100 Subject: [PATCH 281/334] fix new test for struct union codegen --- tests/fsharpqa/Source/Optimizations/Inlining/env.lst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Optimizations/Inlining/env.lst b/tests/fsharpqa/Source/Optimizations/Inlining/env.lst index 29c1d15832e..9c95c7c6545 100644 --- a/tests/fsharpqa/Source/Optimizations/Inlining/env.lst +++ b/tests/fsharpqa/Source/Optimizations/Inlining/env.lst @@ -1,3 +1,3 @@ NoMT SOURCE=Match01.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Match01.dll" # Match01.fs NoMT SOURCE=Match02.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Match02.dll" # Match02.fs -NoMT SOURCE=StructUnion01.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd StructUnion01.dll" # Match02.fs +NoMT SOURCE=StructUnion01.fs SCFLAGS="-a --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd StructUnion01.dll" # StructUnion01.fs From 691db9ed1b3b38202ec5ea8e3eca6569294b9b4a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 10:18:21 +0100 Subject: [PATCH 282/334] Test CI --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dcb8ea2e968..a8fd7602bb3 100644 --- a/README.md +++ b/README.md @@ -95,3 +95,4 @@ Although the primary focus of this repo is F# for Windows and the Visual Studio Keep up with the Visual F# Team and the development of the Visual F# Tools by following us [@VisualFSharp](https://twitter.com/VisualFSharp) or subscribing to our [team blog](http://blogs.msdn.com/b/fsharpteam/). + From 0143a7a06f979f04a47027bfdf4e43c8f5dc1dbd Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 15 Jun 2016 16:03:48 +0200 Subject: [PATCH 283/334] Remove unused permitFsharpKeywords switch --- src/fsharp/lexhelp.fs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 25f90ab688f..c0a7cf9257b 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -312,16 +312,13 @@ module Keywords = let KeywordToken s = keywordTable.[s] - /// ++GLOBAL MUTABLE STATE. Note this is a deprecated, undocumented command line option anyway, we can ignore it. - let mutable permitFsharpKeywords = true - let IdentifierToken args (lexbuf:UnicodeLexing.Lexbuf) (s:string) = if IsCompilerGeneratedName s then warning(Error(FSComp.SR.lexhlpIdentifiersContainingAtSymbolReserved(), lexbuf.LexemeRange)); args.resourceManager.InternIdentifierToken s let KeywordOrIdentifierToken args (lexbuf:UnicodeLexing.Lexbuf) s = - if not permitFsharpKeywords && List.contains s unreserveWords then + if List.contains s unreserveWords then // You can assume this condition never fires - this is a deprecated, undocumented command line option anyway, we can ignore it. IdentifierToken args lexbuf s else From 540a0fe0caa22d88ca53330e659a5d1d306eb336 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 15 Jun 2016 16:08:27 +0200 Subject: [PATCH 284/334] Remove deprecated condition from lexer --- src/fsharp/lexhelp.fs | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index c0a7cf9257b..80ca5951edd 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -305,9 +305,9 @@ module Keywords = keywordList |> List.map (fun (_, w, _) -> w) let keywordTable = - // TODO: this doesn't need to be a multi-map, a dictionary will do let tab = System.Collections.Generic.Dictionary(100) - for (_mode,keyword,token) in keywordList do tab.Add(keyword,token) + for (_mode,keyword,token) in keywordList do + tab.Add(keyword,token) tab let KeywordToken s = keywordTable.[s] @@ -318,32 +318,30 @@ module Keywords = args.resourceManager.InternIdentifierToken s let KeywordOrIdentifierToken args (lexbuf:UnicodeLexing.Lexbuf) s = - if List.contains s unreserveWords then - // You can assume this condition never fires - this is a deprecated, undocumented command line option anyway, we can ignore it. - IdentifierToken args lexbuf s - else - let mutable v = Unchecked.defaultof<_> - if keywordTable.TryGetValue(s, &v) then - if (match v with RESERVED -> true | _ -> false) then - warning(ReservedKeyword(FSComp.SR.lexhlpIdentifierReserved(s), lexbuf.LexemeRange)); - IdentifierToken args lexbuf s - else v - else + let mutable v = Unchecked.defaultof<_> + if keywordTable.TryGetValue(s, &v) then + if (match v with RESERVED -> true | _ -> false) then + warning(ReservedKeyword(FSComp.SR.lexhlpIdentifierReserved(s), lexbuf.LexemeRange)); + IdentifierToken args lexbuf s + else v + else match s with | "__SOURCE_DIRECTORY__" -> let filename = fileOfFileIndex lexbuf.StartPos.FileIndex - let dirname = if filename = stdinMockFilename then - System.IO.Directory.GetCurrentDirectory() - else - filename |> FileSystem.GetFullPathShim (* asserts that path is already absolute *) - |> System.IO.Path.GetDirectoryName + let dirname = + if filename = stdinMockFilename then + System.IO.Directory.GetCurrentDirectory() + else + filename + |> FileSystem.GetFullPathShim (* asserts that path is already absolute *) + |> System.IO.Path.GetDirectoryName KEYWORD_STRING dirname | "__SOURCE_FILE__" -> - KEYWORD_STRING (System.IO.Path.GetFileName((fileOfFileIndex lexbuf.StartPos.FileIndex))) + KEYWORD_STRING (System.IO.Path.GetFileName((fileOfFileIndex lexbuf.StartPos.FileIndex))) | "__LINE__" -> - KEYWORD_STRING (string lexbuf.StartPos.Line) + KEYWORD_STRING (string lexbuf.StartPos.Line) | _ -> - IdentifierToken args lexbuf s + IdentifierToken args lexbuf s /// A utility to help determine if an identifier needs to be quoted let QuoteIdentifierIfNeeded (s : string) : string = From 9d003381e49cc4af0583896aaa02836a759080be Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 15 Jun 2016 16:11:16 +0200 Subject: [PATCH 285/334] use pattern matching in lexer --- src/fsharp/lexhelp.fs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 80ca5951edd..76e317797bf 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -306,7 +306,7 @@ module Keywords = let keywordTable = let tab = System.Collections.Generic.Dictionary(100) - for (_mode,keyword,token) in keywordList do + for _,keyword,token in keywordList do tab.Add(keyword,token) tab @@ -318,13 +318,14 @@ module Keywords = args.resourceManager.InternIdentifierToken s let KeywordOrIdentifierToken args (lexbuf:UnicodeLexing.Lexbuf) s = - let mutable v = Unchecked.defaultof<_> - if keywordTable.TryGetValue(s, &v) then - if (match v with RESERVED -> true | _ -> false) then + match keywordTable.TryGetValue s with + | true,v -> + match v with + | RESERVED -> warning(ReservedKeyword(FSComp.SR.lexhlpIdentifierReserved(s), lexbuf.LexemeRange)); IdentifierToken args lexbuf s - else v - else + | _ -> v + | _ -> match s with | "__SOURCE_DIRECTORY__" -> let filename = fileOfFileIndex lexbuf.StartPos.FileIndex From 6a60bd27525aa4a98441fb191dd474ee7dc8a25d Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 15 Jun 2016 16:14:44 +0200 Subject: [PATCH 286/334] Remove unused permitFsharpKeywords switch --- src/fsharp/CompileOptions.fs | 2 +- src/fsharp/lexhelp.fsi | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 60f34d73267..11a178d9cea 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -891,7 +891,7 @@ let compilingFsLib20Flag (tcConfigB : TcConfigBuilder) = let compilingFsLib40Flag (tcConfigB : TcConfigBuilder) = CompilerOption("compiling-fslib-40", tagNone, OptionUnit (fun () -> tcConfigB.compilingFslib40 <- true; ), Some(InternalCommandLineOption("--compiling-fslib-40", rangeCmdArgs)), None) let mlKeywordsFlag = - CompilerOption("ml-keywords", tagNone, OptionUnit (fun () -> Lexhelp.Keywords.permitFsharpKeywords <- false), Some(DeprecatedCommandLineOptionNoDescription("--ml-keywords", rangeCmdArgs)), None) + CompilerOption("ml-keywords", tagNone, OptionUnit (fun () -> ()), Some(DeprecatedCommandLineOptionNoDescription("--ml-keywords", rangeCmdArgs)), None) let gnuStyleErrorsFlag tcConfigB = CompilerOption("gnu-style-errors", tagNone, OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.EmacsErrors), Some(DeprecatedCommandLineOptionNoDescription("--gnu-style-errors", rangeCmdArgs)), None) diff --git a/src/fsharp/lexhelp.fsi b/src/fsharp/lexhelp.fsi index 4ef4e5edfbb..2d427760799 100644 --- a/src/fsharp/lexhelp.fsi +++ b/src/fsharp/lexhelp.fsi @@ -67,5 +67,4 @@ module Keywords = val KeywordOrIdentifierToken : lexargs -> UnicodeLexing.Lexbuf -> string -> Parser.token val IdentifierToken : lexargs -> UnicodeLexing.Lexbuf -> string -> Parser.token val QuoteIdentifierIfNeeded : string -> string - val mutable permitFsharpKeywords : bool val keywordNames : string list From e441f49e479e9403f06e164407add43dd62efecf Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 14:07:24 +0100 Subject: [PATCH 287/334] use structs instead of hierarchy of objects in ilwrite.fs --- src/absil/ilwrite.fs | 213 ++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 113 deletions(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index ac8b23f5b14..f9c76c710cd 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -334,29 +334,6 @@ type StringIndex = int let BlobIndex (x:BlobIndex) : int = x let StringIndex (x:StringIndex) : int = x -/// Abstract, general type of metadata table rows -type IGenericRow = - abstract GetGenericRow : unit -> RowElement[] - -/// Shared rows are used for the ILTypeRef, ILMethodRef, ILMethodSpec, etc. tables -/// where entries can be shared and need to be made unique through hash-cons'ing -type ISharedRow = - inherit IGenericRow - -/// This is the representation of shared rows is used for most shared row types. -/// Rows ILAssemblyRef and ILMethodRef are very common and are given their own -/// representations. -type SimpleSharedRow(elems: RowElement[]) = - let hashCode = hash elems // precompute to give more efficient hashing and equality comparisons - interface ISharedRow with - member x.GetGenericRow() = elems - member x.GenericRow = elems - override x.GetHashCode() = hashCode - override x.Equals(obj:obj) = - match obj with - | :? SimpleSharedRow as y -> elems = y.GenericRow - | _ -> false - let inline combineHash x2 acc = 37 * acc + x2 // (acc <<< 6 + acc >>> 2 + x2 + 0x9e3779b9) let hashRow (elems:RowElement[]) = @@ -375,44 +352,45 @@ let equalRows (elems:RowElement[]) (elems2:RowElement[]) = i <- i + 1 ok -/// Unshared rows are used for definitional tables where elements do not need to be made unique -/// e.g. ILMethodDef and ILTypeDef. Most tables are like this. We don't precompute a -/// hash code for these rows, and indeed the GetHashCode and Equals should not be needed. -type UnsharedRow(elems: RowElement[]) = - interface IGenericRow with - member x.GetGenericRow() = elems + +/// This is the representation of shared rows is used for most shared row types. +/// Rows ILAssemblyRef and ILMethodRef are very common and are given their own +/// representations. +[] +type SharedRow(elems: RowElement[], hashCode: int) = member x.GenericRow = elems - override x.GetHashCode() = hashRow elems + override x.GetHashCode() = hashCode override x.Equals(obj:obj) = match obj with - | :? UnsharedRow as y -> equalRows elems y.GenericRow + | :? SharedRow as y -> equalRows elems y.GenericRow | _ -> false - -/// Special representation for ILAssemblyRef rows with pre-computed hash -type AssemblyRefRow(s1,s2,s3,s4,l1,b1,nameIdx,str2,b2) = + +let SharedRow(elems: RowElement[]) = new SharedRow(elems, hashRow elems) + +/// Special representation : Note, only hashing by name +let AssemblyRefRow(s1,s2,s3,s4,l1,b1,nameIdx,str2,b2) = let hashCode = hash nameIdx let genericRow = [| UShort s1; UShort s2; UShort s3; UShort s4; ULong l1; Blob b1; StringE nameIdx; StringE str2; Blob b2 |] - interface ISharedRow with - member x.GetGenericRow() = genericRow - member x.GenericRow = genericRow - override x.GetHashCode() = hashCode - override x.Equals(obj:obj) = - match obj with - | :? AssemblyRefRow as y -> equalRows genericRow y.GenericRow - | _ -> false + new SharedRow(genericRow, hashCode) -/// Special representation of a very common kind of row with pre-computed hash -type MemberRefRow(mrp:RowElement,nmIdx:StringIndex,blobIdx:BlobIndex) = - let hash = combineHash (hash blobIdx) (combineHash (hash nmIdx) (hash mrp)) +/// Special representation the computes the hash more efficiently +let MemberRefRow(mrp:RowElement,nmIdx:StringIndex,blobIdx:BlobIndex) = + let hashCode = combineHash (hash blobIdx) (combineHash (hash nmIdx) (hash mrp)) let genericRow = [| mrp; StringE nmIdx; Blob blobIdx |] - interface ISharedRow with - member x.GetGenericRow() = genericRow - member x.GenericRow = genericRow - override x.GetHashCode() = hash + new SharedRow(genericRow, hashCode) + +/// Unshared rows are used for definitional tables where elements do not need to be made unique +/// e.g. ILMethodDef and ILTypeDef. Most tables are like this. We don't precompute a +/// hash code for these rows, and indeed the GetHashCode and Equals should not be needed. +[] +type UnsharedRow(elems: RowElement[]) = + member x.GenericRow = elems + override x.GetHashCode() = hashRow elems override x.Equals(obj:obj) = match obj with - | :? MemberRefRow as y -> equalRows genericRow y.GenericRow + | :? UnsharedRow as y -> equalRows elems y.GenericRow | _ -> false + //===================================================================== //===================================================================== @@ -555,6 +533,18 @@ type TypeDefTableKey = TdKey of string list (* enclosing *) * string (* type nam // The Writer Context //--------------------------------------------------------------------- +[] +type MetadataTable = + | Shared of MetadataTable + | Unshared of MetadataTable + member t.FindOrAddSharedEntry(x) = match t with Shared u -> u.FindOrAddSharedEntry(x) | _ -> failwith "incorrect table kind" + member t.AddSharedEntry(x) = match t with | Shared u -> u.AddSharedEntry(x) | _ -> failwith "incorrect table kind" + member t.AddUnsharedEntry(x) = match t with Unshared u -> u.AddUnsharedEntry(x) | _ -> failwith "shared" + member t.EntriesAsArray = match t with Shared u -> u.EntriesAsArray | _ -> failwith "incorrect table kind" + member t.SetRowsOfTable rows = match t with Shared u -> u.SetRowsOfTable rows | _ -> failwith "incorrect table kind" + member t.Count = match t with Unshared u -> u.Count | Shared u -> u.Count + + [] type cenv = { primaryAssembly: ILScopeRef @@ -583,8 +573,8 @@ type cenv = trefCache: Dictionary /// The following are all used to generate unique items in the output - tables: array> - AssemblyRefs: MetadataTable + tables: MetadataTable[] + AssemblyRefs: MetadataTable fieldDefs: MetadataTable methodDefIdxsByKey: MetadataTable methodDefIdxs: Dictionary @@ -608,13 +598,13 @@ type cenv = member cenv.GetCode() = cenv.codeChunks.Close() -let FindOrAddRow (cenv:cenv) tbl (x:IGenericRow) = cenv.GetTable(tbl).FindOrAddSharedEntry x +let FindOrAddSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).FindOrAddSharedEntry x // Shared rows must be hash-cons'd to be made unique (no duplicates according to contents) -let AddSharedRow (cenv:cenv) tbl (x:ISharedRow) = cenv.GetTable(tbl).AddSharedEntry (x :> IGenericRow) +let AddSimpleSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).AddSharedEntry x // Unshared rows correspond to definition elements (e.g. a ILTypeDef or a ILMethodDef) -let AddUnsharedRow (cenv:cenv) tbl (x:UnsharedRow) = cenv.GetTable(tbl).AddUnsharedEntry (x :> IGenericRow) +let AddUnsharedRow (cenv:cenv) tbl (x:UnsharedRow) = cenv.GetTable(tbl).AddUnsharedEntry x let metadataSchemaVersionSupportedByCLRVersion v = // Whidbey Beta 1 version numbers are between 2.0.40520.0 and 2.0.40607.0 @@ -724,23 +714,23 @@ let rec GetAssemblyRefAsRow cenv (aref:ILAssemblyRef) = BlobIndex (match aref.Hash with None -> 0 | Some s -> GetBytesAsBlobIdx cenv s)) and GetAssemblyRefAsIdx cenv aref = - FindOrAddRow cenv TableNames.AssemblyRef (GetAssemblyRefAsRow cenv aref) + FindOrAddSharedRow cenv TableNames.AssemblyRef (GetAssemblyRefAsRow cenv aref) and GetModuleRefAsRow cenv (mref:ILModuleRef) = - SimpleSharedRow + SharedRow [| StringE (GetStringHeapIdx cenv mref.Name) |] and GetModuleRefAsFileRow cenv (mref:ILModuleRef) = - SimpleSharedRow + SharedRow [| ULong (if mref.HasMetadata then 0x0000 else 0x0001) StringE (GetStringHeapIdx cenv mref.Name) (match mref.Hash with None -> Blob 0 | Some s -> Blob (GetBytesAsBlobIdx cenv s)) |] and GetModuleRefAsIdx cenv mref = - FindOrAddRow cenv TableNames.ModuleRef (GetModuleRefAsRow cenv mref) + FindOrAddSharedRow cenv TableNames.ModuleRef (GetModuleRefAsRow cenv mref) and GetModuleRefAsFileIdx cenv mref = - FindOrAddRow cenv TableNames.File (GetModuleRefAsFileRow cenv mref) + FindOrAddSharedRow cenv TableNames.File (GetModuleRefAsFileRow cenv mref) // -------------------------------------------------------------------- // Does a ILScopeRef point to this module? @@ -767,12 +757,12 @@ let GetScopeRefAsImplementationElem cenv scoref = let rec GetTypeRefAsTypeRefRow cenv (tref:ILTypeRef) = let nselem,nelem = GetTypeNameAsElemPair cenv tref.Name let rs1,rs2 = GetResolutionScopeAsElem cenv (tref.Scope,tref.Enclosing) - SimpleSharedRow [| ResolutionScope (rs1,rs2); nelem; nselem |] + SharedRow [| ResolutionScope (rs1,rs2); nelem; nselem |] and GetTypeRefAsTypeRefIdx cenv tref = let mutable res = 0 if cenv.trefCache.TryGetValue(tref,&res) then res else - let res = FindOrAddRow cenv TableNames.TypeRef (GetTypeRefAsTypeRefRow cenv tref) + let res = FindOrAddSharedRow cenv TableNames.TypeRef (GetTypeRefAsTypeRefRow cenv tref) cenv.trefCache.[tref] <- res res @@ -861,10 +851,10 @@ and GetTypeAsBlobIdx cenv env (ty:ILType) = GetBytesAsBlobIdx cenv (GetTypeAsBytes cenv env ty) and GetTypeAsTypeSpecRow cenv env (ty:ILType) = - SimpleSharedRow [| Blob (GetTypeAsBlobIdx cenv env ty) |] + SharedRow [| Blob (GetTypeAsBlobIdx cenv env ty) |] and GetTypeAsTypeSpecIdx cenv env ty = - FindOrAddRow cenv TableNames.TypeSpec (GetTypeAsTypeSpecRow cenv env ty) + FindOrAddSharedRow cenv TableNames.TypeSpec (GetTypeAsTypeSpecRow cenv env ty) and EmitType cenv env bb ty = match ty with @@ -1305,8 +1295,7 @@ and GetMethodRefInfoAsBlobIdx cenv env info = let GetMethodRefInfoAsMemberRefIdx cenv env ((_,typ,_,_,_,_,_) as minfo) = let fenv = envForMethodRef env typ - FindOrAddRow cenv TableNames.MemberRef - (MethodRefInfoAsMemberRefRow cenv env fenv minfo) + FindOrAddSharedRow cenv TableNames.MemberRef (MethodRefInfoAsMemberRefRow cenv env fenv minfo) let GetMethodRefInfoAsMethodRefOrDef isAlwaysMethodDef cenv env ((nm,typ:ILType,cc,args,ret,varargs,genarity) as minfo) = if isNone varargs && (isAlwaysMethodDef || isTypeLocal typ) then @@ -1327,8 +1316,8 @@ let rec GetMethodSpecInfoAsMethodSpecIdx cenv env (nm,typ,cc,args,ret,varargs,mi bb.EmitByte e_IMAGE_CEE_CS_CALLCONV_GENERICINST bb.EmitZ32 minst.Length minst |> ILList.iter (EmitType cenv env bb)) - FindOrAddRow cenv TableNames.MethodSpec - (SimpleSharedRow + FindOrAddSharedRow cenv TableNames.MethodSpec + (SharedRow [| MethodDefOrRef (mdorTag,mdorRow) Blob (GetBytesAsBlobIdx cenv blob) |]) @@ -1374,16 +1363,8 @@ and InfoOfMethodSpec (mspec:ILMethodSpec,varargs) = let rec GetOverridesSpecAsMemberRefIdx cenv env ospec = let fenv = envForOverrideSpec ospec - let row = - MethodRefInfoAsMemberRefRow cenv env fenv - (ospec.MethodRef.Name, - ospec.EnclosingType, - ospec.MethodRef.CallingConv, - ospec.MethodRef.ArgTypes, - ospec.MethodRef.ReturnType, - None, - ospec.MethodRef.GenericArity) - FindOrAddRow cenv TableNames.MemberRef row + let row = MethodRefInfoAsMemberRefRow cenv env fenv (ospec.MethodRef.Name, ospec.EnclosingType, ospec.MethodRef.CallingConv, ospec.MethodRef.ArgTypes, ospec.MethodRef.ReturnType, None, ospec.MethodRef.GenericArity) + FindOrAddSharedRow cenv TableNames.MemberRef row and GetOverridesSpecAsMethodDefOrRef cenv env (ospec:ILOverridesSpec) = let typ = ospec.EnclosingType @@ -1401,16 +1382,8 @@ and GetOverridesSpecAsMethodDefOrRef cenv env (ospec:ILOverridesSpec) = // -------------------------------------------------------------------- let rec GetMethodRefAsMemberRefIdx cenv env fenv (mref:ILMethodRef) = - let row = - MethodRefInfoAsMemberRefRow cenv env fenv - (mref.Name, - mkILNonGenericBoxedTy mref.EnclosingTypeRef, - mref.CallingConv, - mref.ArgTypes, - mref.ReturnType, - None, - mref.GenericArity) - FindOrAddRow cenv TableNames.MemberRef row + let row = MethodRefInfoAsMemberRefRow cenv env fenv (mref.Name, mkILNonGenericBoxedTy mref.EnclosingTypeRef, mref.CallingConv, mref.ArgTypes, mref.ReturnType, None, mref.GenericArity) + FindOrAddSharedRow cenv TableNames.MemberRef row and GetMethodRefAsCustomAttribType cenv (mref:ILMethodRef) = let fenv = envForNonGenericMethodRef mref @@ -1468,7 +1441,7 @@ let rec GetFieldSpecAsMemberRefRow cenv env fenv (fspec:ILFieldSpec) = and GetFieldSpecAsMemberRefIdx cenv env fspec = let fenv = envForFieldSpec fspec - FindOrAddRow cenv TableNames.MemberRef (GetFieldSpecAsMemberRefRow cenv env fenv fspec) + FindOrAddSharedRow cenv TableNames.MemberRef (GetFieldSpecAsMemberRefRow cenv env fenv fspec) // REVIEW: write into an accumuating buffer and EmitFieldSpecSig cenv env (bb: ByteBuffer) (fspec:ILFieldSpec) = @@ -1507,10 +1480,10 @@ let GetCallsigAsBlobIdx cenv env (callsig:ILCallingSignature,varargs) = callsig.ReturnType,varargs,0)) let GetCallsigAsStandAloneSigRow cenv env x = - SimpleSharedRow [| Blob (GetCallsigAsBlobIdx cenv env x) |] + SharedRow [| Blob (GetCallsigAsBlobIdx cenv env x) |] let GetCallsigAsStandAloneSigIdx cenv env info = - FindOrAddRow cenv TableNames.StandAloneSig (GetCallsigAsStandAloneSigRow cenv env info) + FindOrAddSharedRow cenv TableNames.StandAloneSig (GetCallsigAsStandAloneSigRow cenv env info) // -------------------------------------------------------------------- // local signatures --> BlobHeap idx @@ -1525,7 +1498,7 @@ let GetLocalSigAsBlobHeapIdx cenv env locals = GetBytesAsBlobIdx cenv (emitBytesViaBuffer (fun bb -> EmitLocalSig cenv env bb locals)) let GetLocalSigAsStandAloneSigIdx cenv env locals = - SimpleSharedRow [| Blob (GetLocalSigAsBlobHeapIdx cenv env locals) |] + SharedRow [| Blob (GetLocalSigAsBlobHeapIdx cenv env locals) |] @@ -1793,7 +1766,7 @@ module Codebuf = // for all instructions. // -------------------------------------------------------------------- - let encodingsForNoArgInstrs = System.Collections.Generic.Dictionary<_,_>(300, HashIdentity.Structural) + let encodingsForNoArgInstrs = Dictionary<_,_>(300, HashIdentity.Structural) let _ = List.iter (fun (x,mk) -> encodingsForNoArgInstrs.[mk] <- x) @@ -2260,7 +2233,7 @@ let GenILMethodBody mname cenv env (il: ILMethodBody) = if cenv.generatePdb then il.Locals |> ILList.toArray |> Array.map (fun l -> // Write a fake entry for the local signature headed by e_IMAGE_CEE_CS_CALLCONV_FIELD. This is referenced by the PDB file - ignore (FindOrAddRow cenv TableNames.StandAloneSig (SimpleSharedRow [| Blob (GetFieldDefTypeAsBlobIdx cenv env l.Type) |])) + ignore (FindOrAddSharedRow cenv TableNames.StandAloneSig (SharedRow [| Blob (GetFieldDefTypeAsBlobIdx cenv env l.Type) |])) // Now write the type GetTypeAsBytes cenv env l.Type) else @@ -2289,7 +2262,7 @@ let GenILMethodBody mname cenv env (il: ILMethodBody) = let localToken = if ILList.isEmpty il.Locals then 0x0 else getUncodedToken TableNames.StandAloneSig - (FindOrAddRow cenv TableNames.StandAloneSig (GetLocalSigAsStandAloneSigIdx cenv env il.Locals)) + (FindOrAddSharedRow cenv TableNames.StandAloneSig (GetLocalSigAsStandAloneSigIdx cenv env il.Locals)) let alignedCodeSize = align 0x4 codeSize let codePadding = (alignedCodeSize - codeSize) @@ -2428,14 +2401,14 @@ let rec GetGenericParamAsGenericParamRow cenv _env idx owner gp = let mdVersionMajor,_ = metadataSchemaVersionSupportedByCLRVersion cenv.desiredMetadataVersion if (mdVersionMajor = 1) then - SimpleSharedRow + SharedRow [| UShort (uint16 idx) UShort (uint16 flags) TypeOrMethodDef (fst owner, snd owner) StringE (GetStringHeapIdx cenv gp.Name) TypeDefOrRefOrSpec (tdor_TypeDef, 0) (* empty kind field in deprecated metadata *) |] else - SimpleSharedRow + SharedRow [| UShort (uint16 idx) UShort (uint16 flags) TypeOrMethodDef (fst owner, snd owner) @@ -2453,12 +2426,12 @@ and GenGenericParamConstraintPass4 cenv env gpidx ty = and GenGenericParamPass3 cenv env idx owner gp = // here we just collect generic params, its constraints\custom attributes will be processed on pass4 // shared since we look it up again below in GenGenericParamPass4 - AddSharedRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) + AddSimpleSharedRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) |> ignore and GenGenericParamPass4 cenv env idx owner gp = - let gpidx = FindOrAddRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) + let gpidx = FindOrAddSharedRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) GenCustomAttrsPass3Or4 cenv (hca_GenericParam, gpidx) gp.CustomAttrs gp.Constraints |> ILList.iter (GenGenericParamConstraintPass4 cenv env gpidx) @@ -2927,16 +2900,16 @@ let rowElemCompare (e1: RowElement) (e2: RowElement) = if c <> 0 then c else compare e1.Tag e2.Tag -let SortTableRows tab (rows:IGenericRow[]) = +let SortTableRows tab (rows:SharedRow[]) = if List.memAssoc tab sortedTableInfo then - let rows = rows |> Array.map (fun row -> row.GetGenericRow()) + let rows = rows |> Array.map (fun row -> row.GenericRow) let col = List.assoc tab sortedTableInfo rows // This needs to be a stable sort, so we use Lsit.sortWith |> Array.toList |> List.sortWith (fun r1 r2 -> rowElemCompare r1.[col] r2.[col]) |> Array.ofList - |> Array.map (fun arr -> (SimpleSharedRow arr) :> IGenericRow) + |> Array.map SharedRow else rows @@ -2978,26 +2951,40 @@ let generateIL requiredDataFixups (desiredMetadataVersion,generatePdb, ilg : ILG nextCodeAddr = cilStartAddress data = ByteBuffer.Create 200 resources = ByteBuffer.Create 200 - tables= Array.init 64 (fun i -> MetadataTable<_>.New ("row table "+string i,System.Collections.Generic.EqualityComparer.Default)) - AssemblyRefs = MetadataTable<_>.New("ILAssemblyRef",System.Collections.Generic.EqualityComparer.Default) - documents=MetadataTable<_>.New("pdbdocs",System.Collections.Generic.EqualityComparer.Default) + tables= + Array.init 64 (fun i -> + if (i = TableNames.AssemblyRef.Index || + i = TableNames.MemberRef.Index || + i = TableNames.ModuleRef.Index || + i = TableNames.File.Index || + i = TableNames.TypeRef.Index || + i = TableNames.TypeSpec.Index || + i = TableNames.MethodSpec.Index || + i = TableNames.StandAloneSig.Index || + i = TableNames.GenericParam.Index) then + MetadataTable.Shared (MetadataTable.New ("row table "+string i,EqualityComparer.Default)) + else + MetadataTable.Unshared (MetadataTable.New ("row table "+string i,EqualityComparer.Default))) + + AssemblyRefs = MetadataTable<_>.New("ILAssemblyRef",EqualityComparer.Default) + documents=MetadataTable<_>.New("pdbdocs",EqualityComparer.Default) trefCache=new Dictionary<_,_>(100) pdbinfo= new ResizeArray<_>(200) moduleGuid= Array.zeroCreate 16 - fieldDefs= MetadataTable<_>.New("field defs",System.Collections.Generic.EqualityComparer.Default) - methodDefIdxsByKey = MetadataTable<_>.New("method defs",System.Collections.Generic.EqualityComparer.Default) + fieldDefs= MetadataTable<_>.New("field defs",EqualityComparer.Default) + methodDefIdxsByKey = MetadataTable<_>.New("method defs",EqualityComparer.Default) // This uses reference identity on ILMethodDef objects methodDefIdxs = new Dictionary<_,_>(100, HashIdentity.Reference) - propertyDefs = MetadataTable<_>.New("property defs",System.Collections.Generic.EqualityComparer.Default) - eventDefs = MetadataTable<_>.New("event defs",System.Collections.Generic.EqualityComparer.Default) - typeDefs = MetadataTable<_>.New("type defs",System.Collections.Generic.EqualityComparer.Default) + propertyDefs = MetadataTable<_>.New("property defs",EqualityComparer.Default) + eventDefs = MetadataTable<_>.New("event defs",EqualityComparer.Default) + typeDefs = MetadataTable<_>.New("type defs",EqualityComparer.Default) entrypoint=None generatePdb=generatePdb // These must use structural comparison since they are keyed by arrays guids=MetadataTable<_>.New("guids",HashIdentity.Structural) blobs= MetadataTable<_>.New("blobs",HashIdentity.Structural) - strings= MetadataTable<_>.New("strings",System.Collections.Generic.EqualityComparer.Default) - userStrings= MetadataTable<_>.New("user strings",System.Collections.Generic.EqualityComparer.Default) } + strings= MetadataTable<_>.New("strings",EqualityComparer.Default) + userStrings= MetadataTable<_>.New("user strings",EqualityComparer.Default) } // Now the main compilation step GenModule cenv m @@ -3346,7 +3333,7 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls // The tables themselves for rows in sortedTables do for row in rows do - let row = row.GetGenericRow() + let row = row.GenericRow for x in row do // Emit the coded token for the array element let t = x.Tag From eab154e8417b72b7996704b7809c9530e38b088b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 14:22:26 +0100 Subject: [PATCH 288/334] fix build --- src/absil/ilwrite.fs | 48 ++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index f9c76c710cd..73b8eac11df 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -537,11 +537,12 @@ type TypeDefTableKey = TdKey of string list (* enclosing *) * string (* type nam type MetadataTable = | Shared of MetadataTable | Unshared of MetadataTable - member t.FindOrAddSharedEntry(x) = match t with Shared u -> u.FindOrAddSharedEntry(x) | _ -> failwith "incorrect table kind" - member t.AddSharedEntry(x) = match t with | Shared u -> u.AddSharedEntry(x) | _ -> failwith "incorrect table kind" - member t.AddUnsharedEntry(x) = match t with Unshared u -> u.AddUnsharedEntry(x) | _ -> failwith "shared" - member t.EntriesAsArray = match t with Shared u -> u.EntriesAsArray | _ -> failwith "incorrect table kind" - member t.SetRowsOfTable rows = match t with Shared u -> u.SetRowsOfTable rows | _ -> failwith "incorrect table kind" + member t.FindOrAddSharedEntry(x) = match t with Shared u -> u.FindOrAddSharedEntry(x) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.AddSharedEntry(x) = match t with | Shared u -> u.AddSharedEntry(x) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.AddUnsharedEntry(x) = match t with Unshared u -> u.AddUnsharedEntry(x) | Shared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.RowsOfSharedTable = match t with Shared u -> u.EntriesAsArray | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.RowsOfUnsharedTable = match t with Unshared u -> u.EntriesAsArray | Shared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.SetRowsOfSharedTable rows = match t with Shared u -> u.SetRowsOfTable (Array.map SharedRow rows) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name member t.Count = match t with Unshared u -> u.Count | Shared u -> u.Count @@ -2900,18 +2901,19 @@ let rowElemCompare (e1: RowElement) (e2: RowElement) = if c <> 0 then c else compare e1.Tag e2.Tag +let TableRequiresSorting tab = + List.memAssoc tab sortedTableInfo + let SortTableRows tab (rows:SharedRow[]) = - if List.memAssoc tab sortedTableInfo then - let rows = rows |> Array.map (fun row -> row.GenericRow) - let col = List.assoc tab sortedTableInfo - rows - // This needs to be a stable sort, so we use Lsit.sortWith - |> Array.toList - |> List.sortWith (fun r1 r2 -> rowElemCompare r1.[col] r2.[col]) - |> Array.ofList - |> Array.map SharedRow - else - rows + assert (TableRequiresSorting tab) + let rows = rows |> Array.map (fun row -> row.GenericRow) + let col = List.assoc tab sortedTableInfo + rows + // This needs to be a stable sort, so we use Lsit.sortWith + |> Array.toList + |> List.sortWith (fun r1 r2 -> rowElemCompare r1.[col] r2.[col]) + |> Array.ofList + //|> Array.map SharedRow let timestamp = absilWriteGetTimeStamp () @@ -2932,7 +2934,7 @@ let GenModule (cenv : cenv) (modul: ILModuleDef) = // Hence we need to sort it before we emit any entries in GenericParamConstraint\CustomAttributes that are attached to generic params. // Note this mutates the rows in a table. 'SetRowsOfTable' clears // the key --> index map since it is no longer valid - cenv.GetTable(TableNames.GenericParam).SetRowsOfTable (SortTableRows TableNames.GenericParam (cenv.GetTable(TableNames.GenericParam).EntriesAsArray)) + cenv.GetTable(TableNames.GenericParam).SetRowsOfSharedTable (SortTableRows TableNames.GenericParam (cenv.GetTable(TableNames.GenericParam).RowsOfSharedTable)) GenTypeDefsPass4 [] cenv tds reportTime cenv.showTimes "Module Generation Pass 4" @@ -3015,7 +3017,7 @@ let generateIL requiredDataFixups (desiredMetadataVersion,generatePdb, ilg : ILG let userStrings = cenv.userStrings.EntriesAsArray |> Array.map System.Text.Encoding.Unicode.GetBytes let blobs = cenv.blobs.EntriesAsArray let guids = cenv.guids.EntriesAsArray - let tables = cenv.tables |> Array.map (fun t -> t.EntriesAsArray) + let tables = cenv.tables let code = cenv.GetCode() // turn idx tbls into token maps let mappings = @@ -3092,7 +3094,7 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls generateIL requiredDataFixups (desiredMetadataVersion,generatePdb,ilg,emitTailcalls,showTimes) modul noDebugData cilStartAddress reportTime showTimes "Generated Tables and Code" - let tableSize (tab: TableName) = tables.[tab.Index].Length + let tableSize (tab: TableName) = tables.[tab.Index].Count // Now place the code let codeSize = code.Length @@ -3148,7 +3150,7 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls let (valid1,valid2),_ = (((0,0), 0), tables) ||> Array.fold (fun ((valid1,valid2) as valid,n) rows -> let valid = - if rows.Length = 0 then valid else + if rows.Count = 0 then valid else ( (if n < 32 then valid1 ||| (1 <<< n ) else valid1), (if n >= 32 then valid2 ||| (1 <<< (n-32)) else valid2) ) (valid,n+1)) @@ -3211,7 +3213,10 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls reportTime showTimes "Build String/Blob Address Tables" let sortedTables = - Array.init 64 (fun i -> tables.[i] |> SortTableRows (TableName.FromIndex i)) + Array.init 64 (fun i -> + let tab = tables.[i] + let tabName = TableName.FromIndex i + if TableRequiresSorting tabName then SortTableRows tabName tab.RowsOfSharedTable else tab.RowsOfUnsharedTable |> Array.map (fun u -> u.GenericRow)) reportTime showTimes "Sort Tables" @@ -3333,7 +3338,6 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls // The tables themselves for rows in sortedTables do for row in rows do - let row = row.GenericRow for x in row do // Emit the coded token for the array element let t = x.Tag From 80cd434c7ad216733b50d27f5532161c9225c381 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 14:36:24 +0100 Subject: [PATCH 289/334] fix build --- src/absil/ilwrite.fs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 73b8eac11df..7ba60ed789d 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -353,6 +353,8 @@ let equalRows (elems:RowElement[]) (elems2:RowElement[]) = ok +type GenericRow = RowElement[] + /// This is the representation of shared rows is used for most shared row types. /// Rows ILAssemblyRef and ILMethodRef are very common and are given their own /// representations. @@ -537,12 +539,11 @@ type TypeDefTableKey = TdKey of string list (* enclosing *) * string (* type nam type MetadataTable = | Shared of MetadataTable | Unshared of MetadataTable - member t.FindOrAddSharedEntry(x) = match t with Shared u -> u.FindOrAddSharedEntry(x) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name - member t.AddSharedEntry(x) = match t with | Shared u -> u.AddSharedEntry(x) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name - member t.AddUnsharedEntry(x) = match t with Unshared u -> u.AddUnsharedEntry(x) | Shared u -> failwithf "incorrect table kind, u.name = %s" u.name - member t.RowsOfSharedTable = match t with Shared u -> u.EntriesAsArray | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name - member t.RowsOfUnsharedTable = match t with Unshared u -> u.EntriesAsArray | Shared u -> failwithf "incorrect table kind, u.name = %s" u.name - member t.SetRowsOfSharedTable rows = match t with Shared u -> u.SetRowsOfTable (Array.map SharedRow rows) | Unshared u -> failwithf "incorrect table kind, u.name = %s" u.name + member t.FindOrAddSharedEntry(x) = match t with Shared u -> u.FindOrAddSharedEntry(x) | Unshared u -> failwithf "FindOrAddSharedEntry: incorrect table kind, u.name = %s" u.name + member t.AddSharedEntry(x) = match t with | Shared u -> u.AddSharedEntry(x) | Unshared u -> failwithf "AddSharedEntry: incorrect table kind, u.name = %s" u.name + member t.AddUnsharedEntry(x) = match t with Unshared u -> u.AddUnsharedEntry(x) | Shared u -> failwithf "AddUnsharedEntry: incorrect table kind, u.name = %s" u.name + member t.GenericRowsOfTable = match t with Unshared u -> u.EntriesAsArray |> Array.map (fun x -> x.GenericRow) | Shared u -> u.EntriesAsArray |> Array.map (fun x -> x.GenericRow) + member t.SetRowsOfSharedTable rows = match t with Shared u -> u.SetRowsOfTable (Array.map SharedRow rows) | Unshared u -> failwithf "SetRowsOfSharedTable: incorrect table kind, u.name = %s" u.name member t.Count = match t with Unshared u -> u.Count | Shared u -> u.Count @@ -2904,9 +2905,8 @@ let rowElemCompare (e1: RowElement) (e2: RowElement) = let TableRequiresSorting tab = List.memAssoc tab sortedTableInfo -let SortTableRows tab (rows:SharedRow[]) = +let SortTableRows tab (rows:GenericRow[]) = assert (TableRequiresSorting tab) - let rows = rows |> Array.map (fun row -> row.GenericRow) let col = List.assoc tab sortedTableInfo rows // This needs to be a stable sort, so we use Lsit.sortWith @@ -2934,7 +2934,7 @@ let GenModule (cenv : cenv) (modul: ILModuleDef) = // Hence we need to sort it before we emit any entries in GenericParamConstraint\CustomAttributes that are attached to generic params. // Note this mutates the rows in a table. 'SetRowsOfTable' clears // the key --> index map since it is no longer valid - cenv.GetTable(TableNames.GenericParam).SetRowsOfSharedTable (SortTableRows TableNames.GenericParam (cenv.GetTable(TableNames.GenericParam).RowsOfSharedTable)) + cenv.GetTable(TableNames.GenericParam).SetRowsOfSharedTable (SortTableRows TableNames.GenericParam (cenv.GetTable(TableNames.GenericParam).GenericRowsOfTable)) GenTypeDefsPass4 [] cenv tds reportTime cenv.showTimes "Module Generation Pass 4" @@ -3216,7 +3216,8 @@ let writeILMetadataAndCode (generatePdb,desiredMetadataVersion,ilg,emitTailcalls Array.init 64 (fun i -> let tab = tables.[i] let tabName = TableName.FromIndex i - if TableRequiresSorting tabName then SortTableRows tabName tab.RowsOfSharedTable else tab.RowsOfUnsharedTable |> Array.map (fun u -> u.GenericRow)) + let rows = tab.GenericRowsOfTable + if TableRequiresSorting tabName then SortTableRows tabName rows else rows) reportTime showTimes "Sort Tables" From d705557e0c900f41645ea1d5ba892d0fd36e51b6 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 17 Jun 2016 16:47:26 +0100 Subject: [PATCH 290/334] first draft of fixed support --- VisualFSharp.sln | 87 +++------------------- src/fsharp/FSComp.txt | 1 + src/fsharp/IlxGen.fs | 46 ++++++------ src/fsharp/TypeChecker.fs | 69 ++++++++++++------ src/fsharp/ast.fs | 12 +++- src/fsharp/lexhelp.fs | 3 +- src/fsharp/pars.fsy | 4 ++ src/fsharp/tast.fs | 147 ++++++++++++++++++++------------------ 8 files changed, 179 insertions(+), 190 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index 6224d843be1..26f1b2787c2 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler", "src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject @@ -120,7 +120,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\It EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpVsix", "vsintegration\VisualFSharpVsix\VisualFSharpVsix.csproj", "{E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D3244A8B-4C62-4247-8DE9-29A32EBA67FB}" + ProjectSection(SolutionItems) = preProject + Performance2.psess = Performance2.psess + Performance3.psess = Performance3.psess + EndProjectSection +EndProject Global + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 @@ -130,54 +139,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.Build.0 = Debug|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.ActiveCfg = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.Build.0 = Proto|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.Build.0 = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.ActiveCfg = Release|Any CPU - {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.ActiveCfg = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.Build.0 = Debug|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.ActiveCfg = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.Build.0 = Proto|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.Build.0 = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.ActiveCfg = Release|Any CPU - {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.ActiveCfg = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.Build.0 = Debug|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.ActiveCfg = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.Build.0 = Proto|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.Build.0 = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.ActiveCfg = Release|Any CPU - {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.ActiveCfg = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.Build.0 = Debug|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.ActiveCfg = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.Build.0 = Proto|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.Build.0 = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.ActiveCfg = Release|Any CPU - {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -502,18 +463,6 @@ Global {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.ActiveCfg = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.Build.0 = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.ActiveCfg = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.Build.0 = Debug|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.Build.0 = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.ActiveCfg = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.Build.0 = Proto|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.Build.0 = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.ActiveCfg = Release|Any CPU - {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.Build.0 = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -753,14 +702,6 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|Any CPU.Build.0 = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.ActiveCfg = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.Build.0 = Release|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.Build.0 = VSRelease|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -773,14 +714,6 @@ Global {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|Any CPU.Build.0 = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.ActiveCfg = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.Build.0 = Release|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.Build.0 = VSDebug|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU - {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.Build.0 = VSRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 5bbff5d3ffa..2d4980f3c8f 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1307,3 +1307,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3201,tcModuleAbbrevFirstInMutRec,"In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations" 3202,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3203,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" +3204,tcFixedNotAllowed,"'fixed' may only be used in a declaration of the form 'use x = fixed array-or-address-or-string-expression'" diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 2c5de389d77..722dda09238 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1277,7 +1277,7 @@ type CodeGenBuffer(m:range, alreadyUsedLocals:int, zapFirstSeqPointToStart:bool) = - let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType)>(10) + let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType * bool)>(10) let codebuf = new ResizeArray(200) let exnSpecs = new ResizeArray(10) @@ -1416,20 +1416,20 @@ type CodeGenBuffer(m:range, member cgbuf.MethodName = methodName member cgbuf.PreallocatedArgCount = alreadyUsedArgs - member cgbuf.AllocLocal(ranges,ty) = + member cgbuf.AllocLocal(ranges,ty,isFixed) = let j = locals.Count - locals.Add((ranges,ty)); + locals.Add((ranges,ty,isFixed)); j - member cgbuf.ReallocLocal(cond,ranges,ty) = + member cgbuf.ReallocLocal(cond,ranges,ty,isFixed) = let j = match ResizeArray.tryFindIndexi cond locals with | Some j -> - let (prevRanges,_) = locals.[j] - locals.[j] <- ((ranges@prevRanges),ty); + let (prevRanges,_,isFixed) = locals.[j] + locals.[j] <- ((ranges@prevRanges),ty,isFixed); j | None -> - cgbuf.AllocLocal(ranges,ty) + cgbuf.AllocLocal(ranges,ty,isFixed) let j = j + alreadyUsedLocals j @@ -1561,7 +1561,7 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee let localDebugSpecs : ILLocalDebugInfo list = locals - |> List.mapi (fun i (nms,_) -> List.map (fun nm -> (i,nm)) nms) + |> List.mapi (fun i (nms,_,_isFixed) -> List.map (fun nm -> (i,nm)) nms) |> List.concat |> List.map (fun (i,(nm,(start,finish))) -> { Range=(start.CodeLabel, finish.CodeLabel); @@ -1569,7 +1569,8 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee let ilLocals = locals - |> List.map (fun (infos, ty) -> + |> List.map (fun (infos, ty,isFixed) -> + let loc = // in interactive environment, attach name and range info to locals to improve debug experience if cenv.opts.isInteractive && cenv.opts.generateDebugSymbols then match infos with @@ -1579,7 +1580,8 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee | [] -> mkILLocal ty None // if not interactive, don't bother adding this info else - mkILLocal ty None) + mkILLocal ty None + if isFixed then { loc with IsPinned=true } else loc) (ilLocals, maxStack, @@ -2175,7 +2177,7 @@ and UnionCodeGen (cgbuf: CodeGenBuffer) = { new EraseUnions.ICodeGen with member __.CodeLabel(m) = m.CodeLabel member __.GenerateDelayMark() = CG.GenerateDelayMark cgbuf "unionCodeGenMark" - member __.GenLocal(ilty) = cgbuf.AllocLocal([],ilty) |> uint16 + member __.GenLocal(ilty) = cgbuf.AllocLocal([],ilty,false) |> uint16 member __.SetMarkToHere(m) = CG.SetMarkToHere cgbuf m member __.EmitInstr x = CG.EmitInstr cgbuf (pop 0) (Push []) x member __.EmitInstrs xs = CG.EmitInstrs cgbuf (pop 0) (Push []) xs } @@ -2504,7 +2506,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = // Only save arguments that have effects if Optimizer.ExprHasEffect cenv.g laterArg then let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv.amap m cenv.g eenv.tyenv - let loc,eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy) scopeMarks + let loc,eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false) scopeMarks GenExpr cenv cgbuf eenv SPSuppress laterArg Continue EmitSetLocal cgbuf loc Choice1Of2 (ilTy,loc),eenv @@ -2637,7 +2639,7 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = CountCallFuncInstructions(); // Generate the code code an ILX callfunc operation - let instrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps + let instrs = EraseClosures.mkCallFunc cenv.g.ilxPubCloEnv (fun ty -> cgbuf.AllocLocal([], ty,false) |> uint16) eenv.tyenv.Count isTailCall ilxClosureApps CG.EmitInstrs cgbuf (pop (1+args.Length)) (Push [ilActualRetTy]) instrs; // Done compiling indirect call... @@ -2660,7 +2662,7 @@ and GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) = let afterHandler = CG.GenerateDelayMark cgbuf "afterHandler" let eenvinner = {eenvinner with withinSEH = true} let ilResultTy = GenType cenv.amap m cenv.g eenvinner.tyenv resty - let whereToSave,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy) (startTryMark,endTryMark) + let whereToSave,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) // Generate the body of the try. In the normal case (SequencePointAtTry) we generate a sequence point // both on the 'try' keyword and on the start of the expression in the 'try'. For inlined code and @@ -2820,7 +2822,7 @@ and GenForLoop cenv cgbuf eenv (spFor,v,e1,dir,e2,loopBody,m) sequel = let finishIdx,eenvinner = if isFSharpStyle then - let v,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop",m), cenv.g.ilg.typ_int32) (start,finish) + let v,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("endLoop",m), cenv.g.ilg.typ_int32, false) (start,finish) v, eenvinner else -1,eenvinner @@ -3253,7 +3255,7 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = | _ -> let ilTy = GenType cenv.amap m cenv.g eenv.tyenv ty LocalScope "ilzero" cgbuf (fun scopeMarks -> - let locIdx, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy) scopeMarks + let locIdx, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks // "initobj" (Generated by EmitInitLocal) doesn't work on byref types // But ilzero(&ty) only gets generated in the built-in get-address function so // we can just rely on zeroinit of all IL locals. @@ -5391,14 +5393,14 @@ and GenStoreVal cgbuf eenv m (vspec:Val) = // Allocate locals for values //-------------------------------------------------------------------------- -and AllocLocal cenv cgbuf eenv compgen (v,ty) (scopeMarks: Mark * Mark) = +and AllocLocal cenv cgbuf eenv compgen (v,ty,isFixed) (scopeMarks: Mark * Mark) = // The debug range for the local let ranges = if compgen then [] else [(v,scopeMarks)] // Get an index for the local let j = if cenv.opts.localOptimizationsAreOn - then cgbuf.ReallocLocal((fun i (_,ty') -> not (IntMap.mem i eenv.liveLocals) && (ty = ty')),ranges,ty) - else cgbuf.AllocLocal(ranges,ty) + then cgbuf.ReallocLocal((fun i (_,ty',isFixed') -> not isFixed' && not isFixed && not (IntMap.mem i eenv.liveLocals) && (ty = ty')),ranges,ty,isFixed) + else cgbuf.AllocLocal(ranges,ty,isFixed) j, { eenv with liveLocals = IntMap.add j () eenv.liveLocals } and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = @@ -5414,11 +5416,11 @@ and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let cloinfo,_,_ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) cloinfo - let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object) scopeMarks + let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks Local (idx,Some(ref (NamedLocalIlxClosureInfoGenerator cloinfoGenerate))),eenv else (* normal local *) - let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v) scopeMarks + let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, GenTypeOfVal cenv eenv v, v.IsFixed) scopeMarks Local (idx,None),eenv let eenv = AddStorageForVal cenv.g (v,notlazy repr) eenv Some repr, eenv @@ -5488,7 +5490,7 @@ and AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v eenv = /// - and because IL requires empty stack following a forward br (jump). and EmitSaveStack cenv cgbuf eenv m scopeMarks = let savedStack = (cgbuf.GetCurrentStack()) - let savedStackLocals,eenvinner = List.mapFold (fun eenv ty -> AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill",m), ty) scopeMarks) eenv savedStack + let savedStackLocals,eenvinner = List.mapFold (fun eenv ty -> AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("spill",m), ty, false) scopeMarks) eenv savedStack List.iter (EmitSetLocal cgbuf) savedStackLocals; cgbuf.AssertEmptyStack(); (savedStack,savedStackLocals),eenvinner (* need to return, it marks locals "live" *) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c8cfc054800..59e69508f1f 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1207,10 +1207,11 @@ type CheckedBindingInfo = TType * range * SequencePointInfoForBinding * - bool * (* compiler generated? *) - Const option (* literal value? *) - member x.Expr = let (CheckedBindingInfo(_,_,_,_,_,_,_,expr,_,_,_,_,_,_)) = x in expr - member x.SeqPoint = let (CheckedBindingInfo(_,_,_,_,_,_,_,_,_,_,_,spBind,_,_)) = x in spBind + bool * // compiler generated? + Const option * // literal value? + bool // fixed? + member x.Expr = let (CheckedBindingInfo(_,_,_,_,_,_,_,expr,_,_,_,_,_,_,_)) = x in expr + member x.SeqPoint = let (CheckedBindingInfo(_,_,_,_,_,_,_,_,_,_,_,spBind,_,_,_)) = x in spBind //------------------------------------------------------------------------- // Helpers related to type schemes @@ -5499,6 +5500,9 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = | SynExpr.Assert (x,m) -> TcAssertExpr cenv overallTy env m tpenv x + | SynExpr.Fixed (_,m) -> + error(Error(FSComp.SR.tcFixedNotAllowed(),m)) + // e : ty | SynExpr.Typed (e,cty,m) -> let tgty,tpenv = TcTypeAndRecover cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv cty @@ -6262,7 +6266,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo,bind) = | _ -> implty --> NewInferenceType () - let (CheckedBindingInfo(inlineFlag,immut,bindingAttribs,_,_,ExplicitTyparInfo(_,declaredTypars,_),nameToPrelimValSchemeMap,rhsExpr,_,_,m,_,_,_),tpenv) = + let (CheckedBindingInfo(inlineFlag,immut,bindingAttribs,_,_,ExplicitTyparInfo(_,declaredTypars,_),nameToPrelimValSchemeMap,rhsExpr,_,_,m,_,_,_,_),tpenv) = let flex, tpenv = TcNonrecBindingTyparDecls cenv env tpenv bind TcNormalizedBinding ObjectExpressionOverrideBinding cenv env tpenv bindingTy None NoSafeInitInfo ([],flex) bind @@ -9727,8 +9731,7 @@ and TcLinearLetExprs bodyChecker cenv env overallTy builder tpenv (processUseBin // TcLinearLetExprs processes multiple 'let' bindings in a tail recursive way // We process one binding, then look for additional linear bindings and accumulate the builder continuation. // Don't processes 'use' bindings (e.g. in sequence expressions) unless directed to. - let mkf,envinner,tpenv = - TcLetBinding cenv isUse env ExprContainerInfo ExpressionBinding tpenv (binds,m,body.Range) + let mkf,envinner,tpenv = TcLetBinding cenv isUse env ExprContainerInfo ExpressionBinding tpenv (binds,m,body.Range) let builder' x = builder (mkf x) match body with | SynExpr.LetOrUse (isRec',isUse',binds',bodyExpr,m') when (not isUse' || processUseBindings) -> @@ -9784,6 +9787,11 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt let attrTgt = DeclKind.AllowedAttribTargets memberFlagsOpt declKind + let isFixed,rhsExpr,overallPatTy,overallExprTy = + match rhsExpr with + | SynExpr.Fixed (e,_) -> true, e, NewInferenceType(), overallTy + | e -> false, e, overallTy, overallTy + // Check the attributes of the binding, parameters or return value let TcAttrs tgt attrs = let attrs = TcAttributes cenv envinner tgt attrs @@ -9798,6 +9806,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt let argAttribs = spatsL |> List.map (SynInfo.InferSynArgInfoFromSimplePats >> List.map (SynInfo.AttribsOfArgData >> TcAttrs AttributeTargets.Parameter)) + let retAttribs = match rtyOpt with | Some (SynBindingReturnInfo(_,_,retAttrs)) -> TcAttrs AttributeTargets.ReturnValue retAttrs @@ -9817,6 +9826,10 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if (not isMutable || isThreadStatic) then errorR(Error(FSComp.SR.tcVolatileFieldsMustBeMutable(),mBinding)) + if isFixed then + if declKind <> ExpressionBinding || isInline || isMutable then + errorR(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) + if HasFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute valAttribs then if not declKind.CanBeDllImport || (match memberFlagsOpt with Some memberFlags -> memberFlags.IsInstance | _ -> false) then errorR(Error(FSComp.SR.tcDllImportNotAllowed(),mBinding)) @@ -9828,12 +9841,16 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if isSome(memberFlagsOpt) then errorR(Error(FSComp.SR.tcEntryPointAttributeRequiresFunctionInModule(),mBinding)) else - UnifyTypes cenv env mBinding overallTy (mkArrayType cenv.g cenv.g.string_ty --> cenv.g.int_ty) + UnifyTypes cenv env mBinding overallPatTy (mkArrayType cenv.g cenv.g.string_ty --> cenv.g.int_ty) if isMutable && isInline then errorR(Error(FSComp.SR.tcMutableValuesCannotBeInline(),mBinding)) + if isMutable && nonNil declaredTypars then errorR(Error(FSComp.SR.tcMutableValuesMayNotHaveGenericParameters(),mBinding)) + let flex = if isMutable then dontInferTypars else flex + if isMutable && nonNil spatsL then errorR(Error(FSComp.SR.tcMutableValuesSyntax(),mBinding)) + let isInline = if isInline && isNil spatsL && isNil declaredTypars then errorR(Error(FSComp.SR.tcOnlyFunctionsCanBeInline(),mBinding)) @@ -9848,7 +9865,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt // Check the pattern of the l.h.s. of the binding let tcPatPhase2,(tpenv,nameToPrelimValSchemeMap,_) = - TcPat AllIdsOK cenv envinner (Some(partialValReprInfo)) (inlineFlag,flex,argAndRetAttribs,isMutable,vis,compgen) (tpenv,NameMap.empty,Set.empty) overallTy pat + TcPat AllIdsOK cenv envinner (Some(partialValReprInfo)) (inlineFlag,flex,argAndRetAttribs,isMutable,vis,compgen) (tpenv,NameMap.empty,Set.empty) overallPatTy pat // Add active pattern result names to the environment @@ -9891,10 +9908,17 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt (match rhsExpr with SynExpr.Lambda _ -> false | _ -> true) && synExprContainsError rhsExpr conditionallySuppressErrorReporting atTopNonLambdaDefn (fun () -> - tc cenv overallTy envinner tpenv rhsExpr) + tc cenv overallExprTy envinner tpenv rhsExpr) + + if isFixed then + match overallExprTy with + | ty when isByrefTy cenv.g ty -> UnifyTypes cenv env mBinding overallExprTy overallPatTy + | ty when isStringTy cenv.g ty -> UnifyTypes cenv env mBinding (mkNativePtrType cenv.g cenv.g.char_ty) overallPatTy + | ty when isArray1DTy cenv.g ty -> UnifyTypes cenv env mBinding (mkByrefTy cenv.g (destArrayTy cenv.g overallExprTy)) overallPatTy + | _ -> error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) if bkind = StandaloneExpression && not cenv.isScript then - UnifyUnitType cenv env.DisplayEnv mBinding overallTy (Some rhsExpr') |> ignore + UnifyUnitType cenv env.DisplayEnv mBinding overallPatTy (Some rhsExpr') |> ignore // Assert the return type of an active pattern match apinfoOpt with @@ -9906,7 +9930,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt () // Check other attributes - let hasLiteralAttr,konst = TcLiteral cenv overallTy env tpenv (valAttribs,rhsExpr) + let hasLiteralAttr,konst = TcLiteral cenv overallExprTy env tpenv (valAttribs,rhsExpr) if hasLiteralAttr && isThreadStatic then errorR(Error(FSComp.SR.tcIllegalAttributesForLiteral(),mBinding)) if hasLiteralAttr && isMutable then @@ -9916,7 +9940,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if hasLiteralAttr && nonNil declaredTypars then errorR(Error(FSComp.SR.tcLiteralCannotHaveGenericParameters(),mBinding)) - CheckedBindingInfo(inlineFlag,true,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr',argAndRetAttribs,overallTy,mBinding,spBind,compgen,konst),tpenv + CheckedBindingInfo(inlineFlag,true,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr',argAndRetAttribs,overallPatTy,mBinding,spBind,compgen,konst,isFixed),tpenv and TcLiteral cenv overallTy env tpenv (attrs,synLiteralValExpr) = let hasLiteralAttr = HasFSharpAttribute cenv.g cenv.g.attrib_LiteralAttribute attrs @@ -10171,7 +10195,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope let denv = env.DisplayEnv GeneralizationHelpers.CanonicalizePartialInferenceProblem (cenv,denv,bindsm) (binds' |> List.collect (fun tbinfo -> - let (CheckedBindingInfo(_,_,_,_,_,flex,_,_,_,tauTy,_,_,_,_)) = tbinfo + let (CheckedBindingInfo(_,_,_,_,_,flex,_,_,_,tauTy,_,_,_,_,_)) = tbinfo let (ExplicitTyparInfo(_,declaredTypars,_)) = flex let maxInferredTypars = (freeInTypeLeftToRight cenv.g false tauTy) declaredTypars @ maxInferredTypars)) @@ -10180,7 +10204,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope // Generalize the bindings... (((fun x -> x), env, tpenv), binds') ||> List.fold (fun (mkf_sofar,env,tpenv) tbinfo -> - let (CheckedBindingInfo(inlineFlag,immut,attrs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr,_,tauTy,m,spBind,_,konst)) = tbinfo + let (CheckedBindingInfo(inlineFlag,immut,attrs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr,_,tauTy,m,spBind,_,konst,isFixed)) = tbinfo let enclosingDeclaredTypars = [] let (ExplicitTyparInfo(_,declaredTypars,canInferTypars)) = flex let allDeclaredTypars = enclosingDeclaredTypars @ declaredTypars @@ -10214,7 +10238,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope match pat' with // Don't introduce temporary or 'let' for 'match against wild' or 'match against unit' - | (TPat_wild _ | TPat_const (Const.Unit,_)) when not isUse && isNil generalizedTypars -> + | (TPat_wild _ | TPat_const (Const.Unit,_)) when not isUse && not isFixed && isNil generalizedTypars -> let mk_seq_bind (tm,tmty) = (mkSequential SequencePointsAtSeq m rhse tm, tmty) (mk_seq_bind << mkf_sofar,env,tpenv) @@ -10226,13 +10250,15 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope // nice: don't introduce awful temporary for r.h.s. in the 99% case where we know what we're binding it to | TPat_as (pat1,PBind(v,TypeScheme(generalizedTypars',_)),_) when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> + + if isFixed then v.SetIsFixed() v, pat1 | _ when mustinline(inlineFlag) -> error(Error(FSComp.SR.tcInvalidInlineSpecification(),m)) | _ -> let tmp,_ = mkCompGenLocal m "patternInput" (generalizedTypars +-> tauTy) - if isUse then + if isUse || isFixed then errorR(Error(FSComp.SR.tcInvalidUseBinding(),m)) // This assignment forces representation as module value, to maintain the invariant from the @@ -10251,7 +10277,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope matchx,tmty let mkCleanup (tm,tmty) = - if isUse then + if isUse && not isFixed then (allValsDefinedByPattern,(tm,tmty)) ||> FlatList.foldBack (fun v (tm,tmty) -> AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css v.Range NoTrace cenv.g.system_IDisposable_typ v.Type let cleanupE = BuildDisposableCleanup cenv env m v @@ -11026,7 +11052,7 @@ and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgr let rbinfo = pgrbind.RecBindingInfo let vspec = rbinfo.Val - let (CheckedBindingInfo(inlineFlag,immut,_,_,_,_,_,expr,_,_,m,_,_,_)) = pgrbind.CheckedBinding + let (CheckedBindingInfo(inlineFlag,immut,_,_,_,_,_,expr,_,_,m,_,_,_,_)) = pgrbind.CheckedBinding let (ExplicitTyparInfo(rigidCopyOfDeclaredTypars,declaredTypars,_)) = rbinfo.ExplicitTyparInfo let allDeclaredTypars = rbinfo.EnclosingDeclaredTypars @ declaredTypars @@ -11065,8 +11091,11 @@ and TcLetrecComputeSupportForBinding cenv (pgrbind : PreGeneralizationRecursiveB and TcLetrecGeneralizeBinding cenv denv generalizedTypars (pgrbind : PreGeneralizationRecursiveBinding) : PostGeneralizationRecursiveBinding = let (RBInfo(_,_,enclosingDeclaredTypars,_,vspec,flex,partialValReprInfo,memberInfoOpt,_,_,_,vis,_,declKind)) = pgrbind.RecBindingInfo - let (CheckedBindingInfo(inlineFlag,_,_,_,_,_,_,expr,argAttribs,_,_,_,compgen,_)) = pgrbind.CheckedBinding + let (CheckedBindingInfo(inlineFlag,_,_,_,_,_,_,expr,argAttribs,_,_,_,compgen,_,isFixed)) = pgrbind.CheckedBinding + if isFixed then + errorR(Error(FSComp.SR.tcFixedNotAllowed(),expr.Range)) + let _,tau = vspec.TypeScheme let pvalscheme1 = PrelimValScheme1(vspec.Id,flex,tau,Some(partialValReprInfo),memberInfoOpt,false,inlineFlag,NormalVal,argAttribs,vis,compgen) diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index afae87233d0..03a9f4c0fe4 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -683,6 +683,10 @@ and /// Inserted for error recovery when there is "expr." and missing tokens or error recovery after the dot | DiscardAfterMissingQualificationAfterDot of SynExpr * range + + /// 'use x = fixed expr' + | Fixed of SynExpr * range + /// Get the syntactic range of source code covered by this construct. member e.Range = match e with @@ -742,6 +746,7 @@ and | SynExpr.YieldOrReturnFrom (_,_,m) | SynExpr.LetOrUseBang (_,_,_,_,_,_,m) | SynExpr.DoBang (_,m) -> m + | SynExpr.Fixed (_,m) -> m | SynExpr.Ident id -> id.idRange /// range ignoring any (parse error) extra trailing dots member e.RangeSansAnyExtraDot = @@ -802,6 +807,7 @@ and | SynExpr.DotGet (expr,_,lidwd,m) -> if lidwd.ThereIsAnExtraDotAtTheEnd then unionRanges expr.Range lidwd.RangeSansAnyExtraDot else m | SynExpr.LongIdent (_,lidwd,_,_) -> lidwd.RangeSansAnyExtraDot | SynExpr.DiscardAfterMissingQualificationAfterDot (expr,_) -> expr.Range + | SynExpr.Fixed (_,m) -> m | SynExpr.Ident id -> id.idRange /// Attempt to get the range of the first token or initial portion only - this is extremely ad-hoc, just a cheap way to improve a certain 'query custom operation' error range member e.RangeOfFirstPortion = @@ -869,6 +875,7 @@ and let e = (pat.Range : range).Start mkRange m.FileName start e | SynExpr.Ident id -> id.idRange + | SynExpr.Fixed (_,m) -> m and @@ -2234,8 +2241,9 @@ let rec synExprContainsError inpExpr = | SynExpr.TraitCall(_,_,e,_) | SynExpr.YieldOrReturn (_,e,_) | SynExpr.YieldOrReturnFrom (_,e,_) - | SynExpr.DoBang (e,_) - | SynExpr.Paren(e,_,_,_) -> + | SynExpr.DoBang (e,_) + | SynExpr.Fixed (e,_) + | SynExpr.Paren (e,_,_,_) -> walkExpr e | SynExpr.NamedIndexedPropertySet (_,e1,e2,_) diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 25f90ab688f..2a0ceee9778 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -218,6 +218,7 @@ module Keywords = FSHARP, "extern" ,EXTERN; ALWAYS, "false" ,FALSE; ALWAYS, "finally" ,FINALLY; + FSHARP, "fixed" ,FIXED; ALWAYS, "for" ,FOR; ALWAYS, "fun" ,FUN; ALWAYS, "function" ,FUNCTION; @@ -284,7 +285,7 @@ module Keywords = [ "atomic"; "break"; "checked"; "component"; "constraint"; "constructor"; "continue"; "eager"; - "fixed"; "fori"; "functor"; + "fori"; "functor"; "include"; "measure"; "method"; "mixin"; "object"; diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 4095b35841e..27aab7b2575 100755 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -252,6 +252,7 @@ let rangeOfLongIdent(lid:LongIdent) = %token OBLOCKEND OBLOCKEND_COMING_SOON OBLOCKEND_IS_HERE /* LexFilter #light inserts when closing CtxtSeqBlock(_,_,AddBlockEnd) */ %token OINTERFACE_MEMBER /* inserted for non-paranthetical use of 'INTERFACE', i.e. not INTERFACE/END */ +%token FIXED %token ODUMMY /* These are artificial */ @@ -3284,6 +3285,9 @@ declExpr: { let spBind = SequencePointAtForLoop(rhs2 parseState 1 2) let (a,b,_) = $2 in SynExpr.ForEach(spBind,SeqExprOnly true,true,a,b,$4,unionRanges (rhs parseState 1) $4.Range) } + | FIXED declExpr + { SynExpr.Fixed($2, (unionRanges (rhs parseState 1) $2.Range)) } + | RARROW typedSeqExprBlockR { errorR(Error(FSComp.SR.parsArrowUseIsLimited(),lhs parseState)); SynExpr.YieldOrReturn((true,true),$2, (unionRanges (rhs parseState 1) $2.Range)) } diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index ea59e6e7238..5e338e3294a 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -110,133 +110,140 @@ type ValFlags(flags:int64) = new (recValInfo, baseOrThis, isCompGen, inlineInfo, isMutable, isModuleOrMemberBinding, isExtensionMember, isIncrClassSpecialMember, isTyFunc, allowTypeInst, isGeneratedEventVal) = let flags = (match baseOrThis with - | BaseVal -> 0b000000000000000000L - | CtorThisVal -> 0b000000000000000010L - | NormalVal -> 0b000000000000000100L - | MemberThisVal -> 0b000000000000000110L) ||| - (if isCompGen then 0b000000000000001000L - else 0b000000000000000000L) ||| + | BaseVal -> 0b0000000000000000000L + | CtorThisVal -> 0b0000000000000000010L + | NormalVal -> 0b0000000000000000100L + | MemberThisVal -> 0b0000000000000000110L) ||| + (if isCompGen then 0b0000000000000001000L + else 0b00000000000000000000L) ||| (match inlineInfo with - | ValInline.PseudoVal -> 0b000000000000000000L - | ValInline.Always -> 0b000000000000010000L - | ValInline.Optional -> 0b000000000000100000L - | ValInline.Never -> 0b000000000000110000L) ||| + | ValInline.PseudoVal -> 0b0000000000000000000L + | ValInline.Always -> 0b0000000000000010000L + | ValInline.Optional -> 0b0000000000000100000L + | ValInline.Never -> 0b0000000000000110000L) ||| (match isMutable with - | Immutable -> 0b000000000000000000L - | Mutable -> 0b000000000001000000L) ||| + | Immutable -> 0b0000000000000000000L + | Mutable -> 0b0000000000001000000L) ||| (match isModuleOrMemberBinding with - | false -> 0b000000000000000000L - | true -> 0b000000000010000000L) ||| + | false -> 0b0000000000000000000L + | true -> 0b0000000000010000000L) ||| (match isExtensionMember with - | false -> 0b000000000000000000L - | true -> 0b000000000100000000L) ||| + | false -> 0b0000000000000000000L + | true -> 0b0000000000100000000L) ||| (match isIncrClassSpecialMember with - | false -> 0b000000000000000000L - | true -> 0b000000001000000000L) ||| + | false -> 0b0000000000000000000L + | true -> 0b0000000001000000000L) ||| (match isTyFunc with - | false -> 0b000000000000000000L - | true -> 0b000000010000000000L) ||| + | false -> 0b0000000000000000000L + | true -> 0b0000000010000000000L) ||| (match recValInfo with - | ValNotInRecScope -> 0b000000000000000000L - | ValInRecScope true -> 0b000000100000000000L - | ValInRecScope false -> 0b000001000000000000L) ||| + | ValNotInRecScope -> 0b0000000000000000000L + | ValInRecScope true -> 0b0000000100000000000L + | ValInRecScope false -> 0b0000001000000000000L) ||| (match allowTypeInst with - | false -> 0b000000000000000000L - | true -> 0b000100000000000000L) ||| + | false -> 0b0000000000000000000L + | true -> 0b0000100000000000000L) ||| (match isGeneratedEventVal with - | false -> 0b000000000000000000L - | true -> 0b100000000000000000L) + | false -> 0b0000000000000000000L + | true -> 0b0100000000000000000L) ValFlags(flags) member x.BaseOrThisInfo = - match (flags &&& 0b000000000000000110L) with - | 0b000000000000000000L -> BaseVal - | 0b000000000000000010L -> CtorThisVal - | 0b000000000000000100L -> NormalVal - | 0b000000000000000110L -> MemberThisVal + match (flags &&& 0b0000000000000000110L) with + | 0b0000000000000000000L -> BaseVal + | 0b0000000000000000010L -> CtorThisVal + | 0b0000000000000000100L -> NormalVal + | 0b0000000000000000110L -> MemberThisVal | _ -> failwith "unreachable" - member x.IsCompilerGenerated = (flags &&& 0b000000000000001000L) <> 0x0L + member x.IsCompilerGenerated = (flags &&& 0b0000000000000001000L) <> 0x0L member x.SetIsCompilerGenerated(isCompGen) = - let flags = (flags &&& ~~~0b000000000000001000L) ||| + let flags = (flags &&& ~~~0b0000000000000001000L) ||| (match isCompGen with - | false -> 0b000000000000000000L - | true -> 0b000000000000001000L) + | false -> 0b0000000000000000000L + | true -> 0b0000000000000001000L) ValFlags(flags) member x.InlineInfo = - match (flags &&& 0b000000000000110000L) with - | 0b000000000000000000L -> ValInline.PseudoVal - | 0b000000000000010000L -> ValInline.Always - | 0b000000000000100000L -> ValInline.Optional - | 0b000000000000110000L -> ValInline.Never + match (flags &&& 0b0000000000000110000L) with + | 0b0000000000000000000L -> ValInline.PseudoVal + | 0b0000000000000010000L -> ValInline.Always + | 0b0000000000000100000L -> ValInline.Optional + | 0b0000000000000110000L -> ValInline.Never | _ -> failwith "unreachable" member x.MutabilityInfo = - match (flags &&& 0b000000000001000000L) with - | 0b000000000000000000L -> Immutable - | 0b000000000001000000L -> Mutable + match (flags &&& 0b0000000000001000000L) with + | 0b0000000000000000000L -> Immutable + | 0b0000000000001000000L -> Mutable | _ -> failwith "unreachable" member x.IsMemberOrModuleBinding = - match (flags &&& 0b000000000010000000L) with - | 0b000000000000000000L -> false - | 0b000000000010000000L -> true + match (flags &&& 0b0000000000010000000L) with + | 0b0000000000000000000L -> false + | 0b0000000000010000000L -> true | _ -> failwith "unreachable" - member x.SetIsMemberOrModuleBinding = ValFlags(flags ||| 0b000000000010000000L) + member x.SetIsMemberOrModuleBinding = ValFlags(flags ||| 0b0000000000010000000L) - member x.IsExtensionMember = (flags &&& 0b000000000100000000L) <> 0L - member x.IsIncrClassSpecialMember = (flags &&& 0b000000001000000000L) <> 0L - member x.IsTypeFunction = (flags &&& 0b000000010000000000L) <> 0L + member x.IsExtensionMember = (flags &&& 0b0000000000100000000L) <> 0L + member x.IsIncrClassSpecialMember = (flags &&& 0b0000000001000000000L) <> 0L + member x.IsTypeFunction = (flags &&& 0b0000000010000000000L) <> 0L - member x.RecursiveValInfo = match (flags &&& 0b000001100000000000L) with - | 0b000000000000000000L -> ValNotInRecScope - | 0b000000100000000000L -> ValInRecScope(true) - | 0b000001000000000000L -> ValInRecScope(false) + member x.RecursiveValInfo = match (flags &&& 0b0000001100000000000L) with + | 0b0000000000000000000L -> ValNotInRecScope + | 0b0000000100000000000L -> ValInRecScope(true) + | 0b0000001000000000000L -> ValInRecScope(false) | _ -> failwith "unreachable" member x.SetRecursiveValInfo(recValInfo) = let flags = - (flags &&& ~~~0b000001100000000000L) ||| + (flags &&& ~~~0b0000001100000000000L) ||| (match recValInfo with - | ValNotInRecScope -> 0b000000000000000000L - | ValInRecScope(true) -> 0b000000100000000000L - | ValInRecScope(false) -> 0b000001000000000000L) + | ValNotInRecScope -> 0b0000000000000000000L + | ValInRecScope(true) -> 0b0000000100000000000L + | ValInRecScope(false) -> 0b0000001000000000000L) ValFlags(flags) - member x.MakesNoCriticalTailcalls = (flags &&& 0b000010000000000000L) <> 0L + member x.MakesNoCriticalTailcalls = (flags &&& 0b0000010000000000000L) <> 0L - member x.SetMakesNoCriticalTailcalls = ValFlags(flags ||| 0b000010000000000000L) + member x.SetMakesNoCriticalTailcalls = ValFlags(flags ||| 0b0000010000000000000L) - member x.PermitsExplicitTypeInstantiation = (flags &&& 0b000100000000000000L) <> 0L - member x.HasBeenReferenced = (flags &&& 0b001000000000000000L) <> 0L + member x.PermitsExplicitTypeInstantiation = (flags &&& 0b0000100000000000000L) <> 0L + member x.HasBeenReferenced = (flags &&& 0b0001000000000000000L) <> 0L - member x.SetHasBeenReferenced = ValFlags(flags ||| 0b001000000000000000L) + member x.SetHasBeenReferenced = ValFlags(flags ||| 0b0001000000000000000L) - member x.IsCompiledAsStaticPropertyWithoutField = (flags &&& 0b010000000000000000L) <> 0L + member x.IsCompiledAsStaticPropertyWithoutField = (flags &&& 0b0010000000000000000L) <> 0L - member x.SetIsCompiledAsStaticPropertyWithoutField = ValFlags(flags ||| 0b010000000000000000L) + member x.SetIsCompiledAsStaticPropertyWithoutField = ValFlags(flags ||| 0b0010000000000000000L) - member x.IsGeneratedEventVal = (flags &&& 0b100000000000000000L) <> 0L + + member x.IsGeneratedEventVal = (flags &&& 0b0100000000000000000L) <> 0L + + member x.IsFixed = (flags &&& 0b1000000000000000000L) <> 0L + + member x.SetIsFixed = ValFlags(flags ||| 0b1000000000000000000L) + + /// Get the flags as included in the F# binary metadata member x.PickledBits = // Clear the RecursiveValInfo, only used during inference and irrelevant across assembly boundaries // Clear the IsCompiledAsStaticPropertyWithoutField, only used to determine whether to use a true field for a value, and to eliminate the optimization info for observable bindings // Clear the HasBeenReferenced, only used to report "unreferenced variable" warnings and to help collect 'it' values in FSI.EXE // Clear the IsGeneratedEventVal, since there's no use in propagating specialname information for generated add/remove event vals - (flags &&& ~~~0b011001100000000000L) + (flags &&& ~~~0b1011001100000000000L) /// Represents the kind of a type parameter [] @@ -2190,6 +2197,9 @@ and /// Indicates if the backing field for a static value is suppressed. member x.IsCompiledAsStaticPropertyWithoutField = x.Data.val_flags.IsCompiledAsStaticPropertyWithoutField + /// Indicates if the value is pinned/fixed + member x.IsFixed = x.Data.val_flags.IsFixed + /// Indicates if this value allows the use of an explicit type instantiation (i.e. does it itself have explicit type arguments, /// or does it have a signature?) member x.PermitsExplicitTypeInstantiation = x.Data.val_flags.PermitsExplicitTypeInstantiation @@ -2382,6 +2392,7 @@ and member x.SetMakesNoCriticalTailcalls() = x.Data.val_flags <- x.Data.val_flags.SetMakesNoCriticalTailcalls member x.SetHasBeenReferenced() = x.Data.val_flags <- x.Data.val_flags.SetHasBeenReferenced member x.SetIsCompiledAsStaticPropertyWithoutField() = x.Data.val_flags <- x.Data.val_flags.SetIsCompiledAsStaticPropertyWithoutField + member x.SetIsFixed() = x.Data.val_flags <- x.Data.val_flags.SetIsFixed member x.SetValReprInfo info = x.Data.val_repr_info <- info member x.SetType ty = x.Data.val_type <- ty member x.SetOtherRange m = x.Data.val_other_range <- Some m From 07567504d49b74bae0ab1f2955fd8eede3c1b27d Mon Sep 17 00:00:00 2001 From: Lincoln Atkinson Date: Sun, 19 Jun 2016 12:46:22 -0700 Subject: [PATCH 291/334] Update CallerFilePath tests to use current platform's path separator --- .../Imported/CallerInfo/CallerFilePath.fs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs index a807e51b4b5..c44f97e4d53 100644 --- a/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs +++ b/tests/fsharpqa/Source/Conformance/SpecialAttributesAndTypes/Imported/CallerInfo/CallerFilePath.fs @@ -12,11 +12,14 @@ type MyTy([] ?p0 : string) = path module Program = - let matchesPath path (s : string) = - s.EndsWith(path) - && not (s.Contains("\\\\")) - && not (path.Contains("\\.\\")) - && not (path.Contains("\\..\\")) + let doubleSeparator = "##".Replace('#', System.IO.Path.DirectorySeparatorChar) + let sameDirectory = "#.#".Replace('#', System.IO.Path.DirectorySeparatorChar) + let parentDirectory = ".." + let matchesPath (path : string) (s : string) = + s.EndsWith(path.Replace('#', System.IO.Path.DirectorySeparatorChar)) + && not (s.Contains(doubleSeparator)) + && not (s.Contains(sameDirectory)) + && not (s.Contains(parentDirectory)) [] @@ -25,7 +28,7 @@ module Program = let o1 = MyTy("42") match o.Path with - | Some(path) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | Some(path) when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#CallerFilePath.fs" path -> () | x -> failwithf "Unexpected: %A" x match o1.Path with @@ -33,7 +36,7 @@ module Program = | x -> failwithf "Unexpected: %A" x match MyTy.GetCallerFilePath() with - | Some(path) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | Some(path) when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#CallerFilePath.fs" path -> () | x -> failwithf "Unexpected: %A" x match MyTy.GetCallerFilePath("42") with @@ -41,7 +44,7 @@ module Program = | x -> failwithf "Unexpected: %A" x match CallerInfoTest.FilePath() with - | path when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | path when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#CallerFilePath.fs" path -> () | x -> failwithf "Unexpected: %A" x match CallerInfoTest.FilePath("xyz") with @@ -49,17 +52,17 @@ module Program = | x -> failwithf "Unexpected: %A" x match CallerInfoTest.AllInfo(21) with - | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\CallerFilePath.fs" path -> () + | (path, _, _) when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#CallerFilePath.fs" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x # 345 "qwerty1" match CallerInfoTest.AllInfo(123) with - | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty1" path -> () + | (path, _, _) when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#qwerty1" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x # 456 "qwerty2" match CallerInfoTest.AllInfo(123) with - | (path, _, _) when matchesPath "Conformance\\SpecialAttributesAndTypes\\Imported\\CallerInfo\\qwerty2" path -> () + | (path, _, _) when matchesPath "Conformance#SpecialAttributesAndTypes#Imported#CallerInfo#qwerty2" path -> () | x -> failwithf "Unexpected C# result with multiple parameter types: %A" x 0 \ No newline at end of file From 8abdb3e65bc3fc0266968d258a6f7d8257ae643b Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 11:55:44 +0100 Subject: [PATCH 292/334] undo rename of an indentifier --- src/absil/ilwrite.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 7ba60ed789d..667051456cb 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -603,7 +603,7 @@ type cenv = let FindOrAddSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).FindOrAddSharedEntry x // Shared rows must be hash-cons'd to be made unique (no duplicates according to contents) -let AddSimpleSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).AddSharedEntry x +let AddSharedRow (cenv:cenv) tbl x = cenv.GetTable(tbl).AddSharedEntry x // Unshared rows correspond to definition elements (e.g. a ILTypeDef or a ILMethodDef) let AddUnsharedRow (cenv:cenv) tbl (x:UnsharedRow) = cenv.GetTable(tbl).AddUnsharedEntry x @@ -2428,7 +2428,7 @@ and GenGenericParamConstraintPass4 cenv env gpidx ty = and GenGenericParamPass3 cenv env idx owner gp = // here we just collect generic params, its constraints\custom attributes will be processed on pass4 // shared since we look it up again below in GenGenericParamPass4 - AddSimpleSharedRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) + AddSharedRow cenv TableNames.GenericParam (GetGenericParamAsGenericParamRow cenv env idx owner gp) |> ignore From 1c9dba4e7afa5bde0d8f281ddf79f6eabd585fc9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 16:48:06 +0100 Subject: [PATCH 293/334] fixed implementation --- src/absil/ilwrite.fs | 13 +- src/fsharp/FSComp.txt | 3 +- src/fsharp/IlxGen.fs | 2 +- src/fsharp/Optimizer.fs | 2 + src/fsharp/TastOps.fs | 4 +- src/fsharp/TastOps.fsi | 2 + src/fsharp/TcGlobals.fs | 3 + src/fsharp/TypeChecker.fs | 120 ++++++++--- tests/fsharp/typecheck/sigs/neg97.bsl | 10 +- tests/fsharp/typecheck/sigs/neg97.fs | 17 ++ .../TestFunction24.il.netfx4.bsl | 189 ++++++++++++++++++ .../EmittedIL/TestFunctions/Testfunction24.fs | 31 +++ .../CodeGen/EmittedIL/TestFunctions/env.lst | 1 + 13 files changed, 365 insertions(+), 32 deletions(-) create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 667051456cb..98a17a556bf 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -849,6 +849,12 @@ and GetTypeAsTypeDefOrRef cenv env (ty:ILType) = and GetTypeAsBytes cenv env ty = emitBytesViaBuffer (fun bb -> EmitType cenv env bb ty) +and GetTypeOfLocalAsBytes cenv env (l: ILLocal) = + emitBytesViaBuffer (fun bb -> + if l.IsPinned then + bb.EmitByte et_PINNED + EmitType cenv env bb l.Type) + and GetTypeAsBlobIdx cenv env (ty:ILType) = GetBytesAsBlobIdx cenv (GetTypeAsBytes cenv env ty) @@ -1494,7 +1500,10 @@ let GetCallsigAsStandAloneSigIdx cenv env info = let EmitLocalSig cenv env (bb: ByteBuffer) (locals: ILLocals) = bb.EmitByte e_IMAGE_CEE_CS_CALLCONV_LOCAL_SIG bb.EmitZ32 locals.Length - locals |> ILList.iter (fun l -> EmitType cenv env bb l.Type) + locals |> ILList.iter (fun l -> + if l.IsPinned then + bb.EmitByte et_PINNED + EmitType cenv env bb l.Type) let GetLocalSigAsBlobHeapIdx cenv env locals = GetBytesAsBlobIdx cenv (emitBytesViaBuffer (fun bb -> EmitLocalSig cenv env bb locals)) @@ -2237,7 +2246,7 @@ let GenILMethodBody mname cenv env (il: ILMethodBody) = // Write a fake entry for the local signature headed by e_IMAGE_CEE_CS_CALLCONV_FIELD. This is referenced by the PDB file ignore (FindOrAddSharedRow cenv TableNames.StandAloneSig (SharedRow [| Blob (GetFieldDefTypeAsBlobIdx cenv env l.Type) |])) // Now write the type - GetTypeAsBytes cenv env l.Type) + GetTypeOfLocalAsBytes cenv env l) else [| |] diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 2d4980f3c8f..7972f13ca76 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1307,4 +1307,5 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3201,tcModuleAbbrevFirstInMutRec,"In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations" 3202,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3203,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" -3204,tcFixedNotAllowed,"'fixed' may only be used in a declaration of the form 'use x = fixed array-or-address-or-string-expression'" +3204,tcFixedNotAllowed,"Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string'" +3205,tcCouldNotFindOffsetToStringData,"Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression." \ No newline at end of file diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 722dda09238..2f3ebdb58c4 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1569,7 +1569,7 @@ let CodeGenThen cenv mgbuf (zapFirstSeqPointToStart,entryPointInfo,methodName,ee let ilLocals = locals - |> List.map (fun (infos, ty,isFixed) -> + |> List.map (fun (infos, ty, isFixed) -> let loc = // in interactive environment, attach name and range info to locals to improve debug experience if cenv.opts.isInteractive && cenv.opts.generateDebugSymbols then diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 186113ed2a2..c046e7be579 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -1254,6 +1254,7 @@ let ValueIsUsedOrHasEffect cenv fvs (b:Binding,binfo) = not (cenv.settings.EliminateUnusedBindings()) || isSome v.MemberInfo || binfo.HasEffect || + v.IsFixed || Zset.contains v (fvs()) let rec SplitValuesByIsUsedOrHasEffect cenv fvs x = @@ -1344,6 +1345,7 @@ let TryEliminateBinding cenv _env (TBind(vspec1,e1,spBind)) e2 _m = if not (cenv.optimizing && cenv.settings.EliminateImmediatelyConsumedLocals()) && not vspec1.IsCompilerGenerated then None + elif vspec1.IsFixed then None else // Peephole on immediate consumption of single bindings, e.g. "let x = e in x" --> "e" // REVIEW: enhance this by general elimination of bindings to diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 57320d2205e..9425ea99de5 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -1181,6 +1181,8 @@ let mkStaticRecdFieldGetAddr(fref,tinst,m) = Expr.Op (TOp.ValFieldGetAd let mkStaticRecdFieldGet(fref,tinst,m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [],m) let mkStaticRecdFieldSet(fref,tinst,e,m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e],m) +let mkArrayElemAddress g (readonly,isNativePtr,shape,elemTy,aexpr,nexpr,m) = Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],[aexpr;nexpr],m) + let mkRecdFieldSetViaExprAddr(e1,fref,tinst,e2,m) = Expr.Op (TOp.ValFieldSet(fref), tinst, [e1;e2],m) let mkUnionCaseTagGet(e1,cref,tinst,m) = Expr.Op (TOp.UnionCaseTagGet(cref), tinst, [e1],m) @@ -5443,7 +5445,7 @@ let rec mkExprAddrOfExpr g mustTakeAddress useReadonlyForGenericArrayAddress mut match addrExprVal with | Some(vf) -> valRefEq g vf g.addrof2_vref | _ -> false - (fun x -> x), Expr.Op (TOp.ILAsm ([IL.I_ldelema(readonly,isNativePtr,shape,mkILTyvarTy 0us)],[mkByrefTy g elemTy]), [elemTy],[aexpr;nexpr],m) + (fun x -> x), mkArrayElemAddress g (readonly,isNativePtr,shape,elemTy,aexpr,nexpr,m) // LVALUE: "e.[n1,n2]", "e.[n1,n2,n3]", "e.[n1,n2,n3,n4]" where e is an array of structs | Expr.App(Expr.Val(vf,_,_),_,[elemTy],(aexpr::args),_) diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index e4719f1b86f..58b602d92cb 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -196,6 +196,8 @@ val mkExnCaseFieldGet : Expr * TyconRef * int val mkUnionCaseFieldSet : Expr * UnionCaseRef * TypeInst * int * Expr * range -> Expr val mkExnCaseFieldSet : Expr * TyconRef * int * Expr * range -> Expr +val mkArrayElemAddress : TcGlobals -> ILReadonly * bool * ILArrayShape * TType * Expr * Expr * range -> Expr + //------------------------------------------------------------------------- // Compiled view of tuples //------------------------------------------------------------------------- diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index a02124d5e42..a27c50ca268 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -218,6 +218,7 @@ type public TcGlobals = system_Array_typ : TType system_Object_typ : TType system_IDisposable_typ : TType + system_RuntimeHelpers_typ : TType system_Value_typ : TType system_Delegate_typ : TType system_MulticastDelegate_typ : TType @@ -616,6 +617,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa let sysLinq = ["System";"Linq"] let sysCollections = ["System";"Collections"] let sysGenerics = ["System";"Collections";"Generic"] + let sysCompilerServices = ["System";"Runtime";"CompilerServices"] let lazy_tcr = mkSysTyconRef sys "Lazy`1" let fslib_IEvent2_tcr = mk_MFControl_tcref fslibCcu "IEvent`2" @@ -1099,6 +1101,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa system_Array_typ = mkSysNonGenericTy sys "Array" system_Object_typ = mkSysNonGenericTy sys "Object" system_IDisposable_typ = mkSysNonGenericTy sys "IDisposable" + system_RuntimeHelpers_typ = mkSysNonGenericTy sysCompilerServices "RuntimeHelpers" system_Value_typ = mkSysNonGenericTy sys "ValueType" system_Delegate_typ = mkSysNonGenericTy sys "Delegate" system_MulticastDelegate_typ = mkSysNonGenericTy sys "MulticastDelegate" diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 59e69508f1f..0602b72c5ea 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2946,6 +2946,17 @@ let BuildDisposableCleanup cenv env m (v:Val) = let inpe = mkCoerceExpr(exprForVal v.Range v,cenv.g.obj_ty,m,v.Type) mkIsInstConditional cenv.g m cenv.g.system_IDisposable_typ inpe disposeObjVar disposeExpr (mkUnit cenv.g m) +/// Build call to get_OffsetToStringData as part of 'fixed' +let BuildOffsetToStringData cenv env m = + let ad = env.eAccessRights + let offsetToStringDataMethod = + match TryFindIntrinsicOrExtensionMethInfo cenv env m ad "get_OffsetToStringData" cenv.g.system_RuntimeHelpers_typ with + | [x] -> x + | _ -> error(Error(FSComp.SR.tcCouldNotFindOffsetToStringData(),m)) + + let offsetExpr,_ = BuildPossiblyConditionalMethodCall cenv env NeverMutates m false offsetToStringDataMethod NormalValUse [] [] [] + offsetExpr + let BuildILFieldGet g amap m objExpr (finfo:ILFieldInfo) = let fref = finfo.ILFieldRef let isValueType = finfo.IsValueType @@ -9775,6 +9786,62 @@ and TcStaticOptimizationConstraint cenv env tpenv c = let tp',tpenv = TcTypar cenv env NewTyparsOK tpenv tp TTyconIsStruct(mkTyparTy tp'),tpenv + +/// Fix up the r.h.s. of a 'use x = fixed expr' +and TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, mBinding) = + match overallExprTy with + | ty when isByrefTy cenv.g ty -> + let okByRef = + match stripExpr rhsExprChecked with + | Expr.Op (op,tyargs,args,_) -> + match op,tyargs,args with + | TOp.ValFieldGetAddr rfref,_,[_] -> not rfref.Tycon.IsStructOrEnumTycon + | TOp.ILAsm ([ I_ldflda (fspec)],_),_,_ -> fspec.EnclosingType.Boxity = ILBoxity.AsObject + | TOp.ILAsm ([ I_ldelema _],_),_,_ -> true + | TOp.RefAddrGet _,_,_ -> true + | _ -> false + | _ -> false + if not okByRef then + error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) + UnifyTypes cenv env mBinding overallExprTy overallPatTy + rhsExprChecked + + | ty when isStringTy cenv.g ty -> + let charPtrTy = (mkNativePtrType cenv.g cenv.g.char_ty) + UnifyTypes cenv env mBinding charPtrTy overallPatTy + let stringObjAsPtr = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_I], [ charPtrTy ]),[],[rhsExprChecked],mBinding) + // For strings 'use x = fixed str', we actually generate two pinned variables + // let pinned x = + // let pinned tmp = (char*) str + // tmp + get_OffsettoStringData() + // This is the easiest codegen for F# + + // Store the string into a pinned local + mkCompGenLetIn mBinding "pinnedString" charPtrTy stringObjAsPtr (fun (v,ve) -> + v.SetIsFixed() + let addrOffset = BuildOffsetToStringData cenv env mBinding + let stringPlusOffset = Expr.Op (TOp.ILAsm ([ AI_add ], [ charPtrTy ]),[],[ve; addrOffset],mBinding) + // check for non-null + mkNullTest cenv.g mBinding ve ve stringPlusOffset) + + | ty when isArray1DTy cenv.g ty -> + let elemTy = destArrayTy cenv.g overallExprTy + let elemPtrTy = mkByrefTy cenv.g elemTy + UnifyTypes cenv env mBinding elemPtrTy overallPatTy + // Store the array into a local + mkCompGenLetIn mBinding "tmpArray" overallExprTy rhsExprChecked (fun (_,ve) -> + // This is &arr.[0] + let elemZeroAddress = mkArrayElemAddress cenv.g (ILReadonly.NormalAddress,false,ILArrayShape.SingleDimensional,elemTy,ve,mkInt32 cenv.g mBinding 0,mBinding) + // check for non-null and non-empty + let zero = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_U], [ elemPtrTy ]),[],[mkInt32 cenv.g mBinding 0],mBinding) + // This is arr.Length + let arrayLengthExpr = mkCallArrayLength cenv.g mBinding elemTy ve + mkNullTest cenv.g mBinding ve zero (mkNullTest cenv.g mBinding arrayLengthExpr zero elemZeroAddress)) + + + | _ -> error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) + + /// Binding checking code, for all bindings including let bindings, let-rec bindings, member bindings and object-expression bindings and and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt safeInitInfo (enclosingDeclaredTypars,(ExplicitTyparInfo(_,declaredTypars,_) as flex)) bind = let envinner = AddDeclaredTypars NoCheckForDuplicateTypars (enclosingDeclaredTypars@declaredTypars) env @@ -9896,29 +9963,26 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt // If binding a ctor then set the ugly counter that permits us to write ctor expressions on the r.h.s. let isCtor = (match memberFlagsOpt with Some memberFlags -> memberFlags.MemberKind = MemberKind.Constructor | _ -> false) - let tc = - if isCtor then TcExprThatIsCtorBody (safeThisValOpt, safeInitInfo) - else TcExprThatCantBeCtorBody - // At each module binding, dive into the expression to check for syntax errors and suppress them if they show. // Don't do this for lambdas, because we always check for suppression for all lambda bodies in TcIteratedLambdas - let rhsExpr',tpenv = + let rhsExprChecked,tpenv = let atTopNonLambdaDefn = DeclKind.IsModuleOrMemberOrExtensionBinding declKind && (match rhsExpr with SynExpr.Lambda _ -> false | _ -> true) && synExprContainsError rhsExpr + conditionallySuppressErrorReporting atTopNonLambdaDefn (fun () -> - tc cenv overallExprTy envinner tpenv rhsExpr) - if isFixed then - match overallExprTy with - | ty when isByrefTy cenv.g ty -> UnifyTypes cenv env mBinding overallExprTy overallPatTy - | ty when isStringTy cenv.g ty -> UnifyTypes cenv env mBinding (mkNativePtrType cenv.g cenv.g.char_ty) overallPatTy - | ty when isArray1DTy cenv.g ty -> UnifyTypes cenv env mBinding (mkByrefTy cenv.g (destArrayTy cenv.g overallExprTy)) overallPatTy - | _ -> error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) + if isCtor then TcExprThatIsCtorBody (safeThisValOpt, safeInitInfo) cenv overallExprTy envinner tpenv rhsExpr + else TcExprThatCantBeCtorBody cenv overallExprTy envinner tpenv rhsExpr) if bkind = StandaloneExpression && not cenv.isScript then - UnifyUnitType cenv env.DisplayEnv mBinding overallPatTy (Some rhsExpr') |> ignore + UnifyUnitType cenv env.DisplayEnv mBinding overallPatTy (Some rhsExprChecked) |> ignore + + // Fix up the r.h.s. expression for 'fixed' + let rhsExprChecked = + if isFixed then TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, mBinding) + else rhsExprChecked // Assert the return type of an active pattern match apinfoOpt with @@ -9940,7 +10004,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if hasLiteralAttr && nonNil declaredTypars then errorR(Error(FSComp.SR.tcLiteralCannotHaveGenericParameters(),mBinding)) - CheckedBindingInfo(inlineFlag,true,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr',argAndRetAttribs,overallPatTy,mBinding,spBind,compgen,konst,isFixed),tpenv + CheckedBindingInfo(inlineFlag,true,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExprChecked,argAndRetAttribs,overallPatTy,mBinding,spBind,compgen,konst,isFixed),tpenv and TcLiteral cenv overallTy env tpenv (attrs,synLiteralValExpr) = let hasLiteralAttr = HasFSharpAttribute cenv.g cenv.g.attrib_LiteralAttribute attrs @@ -10233,13 +10297,13 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope let prelimRecValues = NameMap.map fst values // Now bind the r.h.s. to the l.h.s. - let rhse = mkTypeLambda m generalizedTypars (rhsExpr,tauTy) + let rhsExpr = mkTypeLambda m generalizedTypars (rhsExpr,tauTy) match pat' with // Don't introduce temporary or 'let' for 'match against wild' or 'match against unit' | (TPat_wild _ | TPat_const (Const.Unit,_)) when not isUse && not isFixed && isNil generalizedTypars -> - let mk_seq_bind (tm,tmty) = (mkSequential SequencePointsAtSeq m rhse tm, tmty) + let mk_seq_bind (tm,tmty) = (mkSequential SequencePointsAtSeq m rhsExpr tm, tmty) (mk_seq_bind << mkf_sofar,env,tpenv) | _ -> @@ -10251,7 +10315,8 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope | TPat_as (pat1,PBind(v,TypeScheme(generalizedTypars',_)),_) when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> - if isFixed then v.SetIsFixed() + if isFixed then + v.SetIsFixed() v, pat1 | _ when mustinline(inlineFlag) -> error(Error(FSComp.SR.tcInvalidInlineSpecification(),m)) @@ -10265,25 +10330,28 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope // type checker that anything related to binding module-level values is marked with an // val_repr_info, val_actual_parent and is_topbind if (DeclKind.MustHaveArity declKind) then - AdjustValToTopVal tmp altActualParent (InferArityOfExprBinding cenv.g tmp rhse) + AdjustValToTopVal tmp altActualParent (InferArityOfExprBinding cenv.g tmp rhsExpr) tmp,pat' - let mkRhsBind (tm,tmty) = (mkLet spBind m tmp rhse tm),tmty + let mkRhsBind (bodyExpr,bodyExprTy) = + let letExpr = mkLet spBind m tmp rhsExpr bodyExpr + letExpr,bodyExprTy + let allValsDefinedByPattern = (NameMap.range prelimRecValues |> FlatList.ofList) - let mkPatBind (tm,tmty) = + let mkPatBind (bodyExpr,bodyExprTy) = let valsDefinedByMatching = FlatListSet.remove valEq tmp allValsDefinedByPattern - let matchx = CompilePatternForMatch cenv env m m true ThrowIncompleteMatchException (tmp,generalizedTypars) [TClause(pat'',None,TTarget(valsDefinedByMatching,tm,SuppressSequencePointAtTarget),m)] tauTy tmty + let matchx = CompilePatternForMatch cenv env m m true ThrowIncompleteMatchException (tmp,generalizedTypars) [TClause(pat'',None,TTarget(valsDefinedByMatching,bodyExpr,SuppressSequencePointAtTarget),m)] tauTy bodyExprTy let matchx = if (DeclKind.ConvertToLinearBindings declKind) then LinearizeTopMatch cenv.g altActualParent matchx else matchx - matchx,tmty + matchx,bodyExprTy - let mkCleanup (tm,tmty) = + let mkCleanup (bodyExpr,bodyExprTy) = if isUse && not isFixed then - (allValsDefinedByPattern,(tm,tmty)) ||> FlatList.foldBack (fun v (tm,tmty) -> + (allValsDefinedByPattern,(bodyExpr,bodyExprTy)) ||> FlatList.foldBack (fun v (bodyExpr,bodyExprTy) -> AddCxTypeMustSubsumeType ContextInfo.NoContext denv cenv.css v.Range NoTrace cenv.g.system_IDisposable_typ v.Type let cleanupE = BuildDisposableCleanup cenv env m v - mkTryFinally cenv.g (tm,cleanupE,m,tmty,SequencePointInBodyOfTry,NoSequencePointAtFinally),tmty) + mkTryFinally cenv.g (bodyExpr,cleanupE,m,bodyExprTy,SequencePointInBodyOfTry,NoSequencePointAtFinally),bodyExprTy) else - (tm,tmty) + (bodyExpr,bodyExprTy) ((mkRhsBind << mkPatBind << mkCleanup << mkf_sofar), AddLocalValMap cenv.tcSink scopem prelimRecValues env, diff --git a/tests/fsharp/typecheck/sigs/neg97.bsl b/tests/fsharp/typecheck/sigs/neg97.bsl index 4353b29ffc2..3bbeb123ffd 100644 --- a/tests/fsharp/typecheck/sigs/neg97.bsl +++ b/tests/fsharp/typecheck/sigs/neg97.bsl @@ -1,2 +1,10 @@ -neg96.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' \ No newline at end of file +neg97.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' + +neg97.fs(16,9,16,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' + +neg97.fs(20,9,20,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' + +neg97.fs(25,9,25,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' + +neg97.fs(30,9,30,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' diff --git a/tests/fsharp/typecheck/sigs/neg97.fs b/tests/fsharp/typecheck/sigs/neg97.fs index 67a7b104b29..01f68256c9a 100644 --- a/tests/fsharp/typecheck/sigs/neg97.fs +++ b/tests/fsharp/typecheck/sigs/neg97.fs @@ -12,3 +12,20 @@ let x = { X = 1.; Y = 1. } x.Y <- 5. +let pinIntNotAllowed() = + use p = fixed 3 + () + +let pinAnyNotAllowed(x: 'T) = + use p = fixed x + () + +let pinStackAddressNotAllowed(x: 'T) = + let mutable v = 0 + use p = fixed &v + () + +let pinStructAddressNotAllowed(x: 'T) = + let mutable v = { X = 1.0; Y = 1.0 } + use p = fixed &v.Y + () diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl new file mode 100644 index 00000000000..d1422d18107 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl @@ -0,0 +1,189 @@ + +// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.17376 +// Copyright (c) Microsoft Corporation. All rights reserved. + + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:3:0:0 +} +.assembly TestFunction23 +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + + // --- The following custom attribute is added automatically, do not uncomment ------- + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) + + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.TestFunction23 +{ + // Offset: 0x00000000 Length: 0x0000036A +} +.mresource public FSharpOptimizationData.TestFunction23 +{ + // Offset: 0x00000370 Length: 0x000000E3 +} +.module TestFunction23.exe +// MVID: {4F20E3B8-A643-451C-A745-0383B8E3204F} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x0000008C477A0000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed TestFunction23 + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .class auto ansi serializable nested public C + extends [mscorlib]System.Object + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 03 00 00 00 00 00 ) + .field assembly string x + .field assembly string x@8 + .method public specialname rtspecialname + instance void .ctor() cil managed + { + // Code size 32 (0x20) + .maxstack 8 + .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' + .line 6,6 : 5,38 + IL_0000: ldarg.0 + IL_0001: callvirt instance void [mscorlib]System.Object::.ctor() + IL_0006: ldarg.0 + IL_0007: pop + IL_0008: nop + IL_0009: ldarg.0 + IL_000a: call string [mscorlib]System.Console::ReadLine() + IL_000f: stfld string TestFunction23/C::x + .line 8,8 : 5,38 + IL_0014: ldarg.0 + IL_0015: call string [mscorlib]System.Console::ReadLine() + IL_001a: stfld string TestFunction23/C::x@8 + .line 5,5 : 6,7 + IL_001f: ret + } // end of method C::.ctor + + .method public hidebysig instance string + M() cil managed + { + // Code size 19 (0x13) + .maxstack 8 + .line 9,9 : 23,30 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldfld string TestFunction23/C::x@8 + IL_0007: ldarg.0 + IL_0008: callvirt instance string TestFunction23/C::g() + IL_000d: call string [mscorlib]System.String::Concat(string, + string) + IL_0012: ret + } // end of method C::M + + .method assembly hidebysig instance string + g() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 8 (0x8) + .maxstack 8 + .line 7,7 : 15,16 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldfld string TestFunction23/C::x + IL_0007: ret + } // end of method C::g + + } // end of class C + + .class auto ansi serializable nested assembly beforefieldinit g@13 + extends class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2 + { + .method assembly specialname rtspecialname + instance void .ctor() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::.ctor() + IL_0006: ret + } // end of method g@13::.ctor + + .method public strict virtual instance class [FSharp.Core]Microsoft.FSharp.Core.Unit + Invoke(class [FSharp.Core]Microsoft.FSharp.Core.Unit unitVar0) cil managed + { + // Code size 35 (0x23) + .maxstack 8 + .line 13,13 : 9,24 + IL_0000: nop + IL_0001: ldstr "Hello" + IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) + IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) + IL_0010: pop + .line 14,14 : 9,24 + IL_0011: ldstr "Hello" + IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) + IL_001b: tail. + IL_001d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) + IL_0022: ret + } // end of method g@13::Invoke + + } // end of class g@13 + + .method public static class [mscorlib]System.Tuple`2 + f(!!a x) cil managed + { + // Code size 27 (0x1b) + .maxstack 5 + .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2 g) + .line 12,12 : 9,12 + IL_0000: nop + IL_0001: newobj instance void TestFunction23/g@13::.ctor() + IL_0006: stloc.0 + .line 15,15 : 5,13 + IL_0007: ldloc.0 + IL_0008: ldnull + IL_0009: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::Invoke(!0) + IL_000e: ldloc.0 + IL_000f: ldnull + IL_0010: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::Invoke(!0) + IL_0015: newobj instance void class [mscorlib]System.Tuple`2::.ctor(!0, + !1) + IL_001a: ret + } // end of method TestFunction23::f + +} // end of class TestFunction23 + +.class private abstract auto ansi sealed ''.$TestFunction23 + extends [mscorlib]System.Object +{ + .method public static void main@() cil managed + { + .entrypoint + // Code size 2 (0x2) + .maxstack 8 + IL_0000: nop + IL_0001: ret + } // end of method $TestFunction23::main@ + +} // end of class ''.$TestFunction23 + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs new file mode 100644 index 00000000000..1f82f6b7048 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs @@ -0,0 +1,31 @@ +// Assume that the following class exists. + +type Point = { mutable x : int; mutable y : int } + +let pinObject() = + let point = { x = 1; y = 2 } + use p1 = fixed &point.x // note, fixed is a keyword and would be highlighted + () + +let pinRef() = + let point = ref 1 + use p1 = fixed &point.contents // note, fixed is a keyword and would be highlighted + () + +let pinArray1() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + use p1 = fixed arr + () + +let pinArray2() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + // You can initialize a pointer by using the address of a variable. + use p = fixed &arr.[0] + () + +let pinString() = + let str = "Hello World" + // The following assignment initializes p by using a string. + use pChar = fixed str + () + // some code that uses pChar, which has type char* diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index 8ffdad5d7fa..c55c1dc11ef 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -43,3 +43,4 @@ SOURCE=Testfunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs SOURCE=Testfunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 + SOURCE=Testfunction24.fs SCFLAGS="-a -g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.dll NetFx40" # TestFunction24.fs - NetFx40 From 07a7ded47595185222a9f287a5ba16471bfac743 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 17:17:11 +0100 Subject: [PATCH 294/334] fix fixed --- src/fsharp/PostInferenceChecks.fs | 14 ++++++++------ src/fsharp/TypeChecker.fs | 7 +++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index d9ea90e1715..f5acda847ba 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -484,10 +484,12 @@ and CheckExprInContext (cenv:cenv) (env:env) expr (context:ByrefCallContext) = match dir with | NormalSeq -> CheckExprInContext cenv env e2 context // carry context into _;RHS (normal sequencing only) | ThenDoSeq -> CheckExpr cenv {env with limited=false} e2 + | Expr.Let (bind,body,_,_) -> CheckBinding cenv env false bind ; BindVal cenv bind.Var - CheckExpr cenv env body + CheckExprInContext cenv env body context + | Expr.Const (_,m,ty) -> CheckTypePermitByrefs cenv env m ty @@ -643,7 +645,7 @@ and CheckExprInContext (cenv:cenv) (env:env) expr (context:ByrefCallContext) = | Expr.Match(_,_,dtree,targets,m,ty) -> CheckTypeNoByrefs cenv env m ty; CheckDecisionTree cenv env dtree; - CheckDecisionTreeTargets cenv env targets; + CheckDecisionTreeTargets cenv env targets context; | Expr.LetRec (binds,e,_,_) -> BindVals cenv (valsOfBinds binds) CheckBindings cenv env binds; @@ -874,13 +876,13 @@ and CheckFlatExprs cenv env exprs = and CheckExprDirectArgs cenv env exprs = exprs |> List.iter (fun x -> CheckExprInContext cenv env x DirectArg) -and CheckDecisionTreeTargets cenv env targets = - targets |> Array.iter (CheckDecisionTreeTarget cenv env) +and CheckDecisionTreeTargets cenv env targets context = + targets |> Array.iter (CheckDecisionTreeTarget cenv env context ) -and CheckDecisionTreeTarget cenv env (TTarget(vs,e,_)) = +and CheckDecisionTreeTarget cenv env context (TTarget(vs,e,_)) = BindVals cenv vs vs |> FlatList.iter (CheckValSpec cenv env) - CheckExpr cenv env e + CheckExprInContext cenv env e context and CheckDecisionTree cenv env x = match x with diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 0602b72c5ea..d0eea1147a0 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9822,7 +9822,7 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, m let addrOffset = BuildOffsetToStringData cenv env mBinding let stringPlusOffset = Expr.Op (TOp.ILAsm ([ AI_add ], [ charPtrTy ]),[],[ve; addrOffset],mBinding) // check for non-null - mkNullTest cenv.g mBinding ve ve stringPlusOffset) + mkNullTest cenv.g mBinding ve stringPlusOffset ve) | ty when isArray1DTy cenv.g ty -> let elemTy = destArrayTy cenv.g overallExprTy @@ -9833,11 +9833,10 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, m // This is &arr.[0] let elemZeroAddress = mkArrayElemAddress cenv.g (ILReadonly.NormalAddress,false,ILArrayShape.SingleDimensional,elemTy,ve,mkInt32 cenv.g mBinding 0,mBinding) // check for non-null and non-empty - let zero = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_U], [ elemPtrTy ]),[],[mkInt32 cenv.g mBinding 0],mBinding) + let zero = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_U], [ cenv.g.nativeint_ty ]),[],[mkInt32 cenv.g mBinding 0],mBinding) // This is arr.Length let arrayLengthExpr = mkCallArrayLength cenv.g mBinding elemTy ve - mkNullTest cenv.g mBinding ve zero (mkNullTest cenv.g mBinding arrayLengthExpr zero elemZeroAddress)) - + mkNullTest cenv.g mBinding ve (mkNullTest cenv.g mBinding arrayLengthExpr elemZeroAddress zero) zero ) | _ -> error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) From 3db7a6f9dc8e39d140c03969fa691aa39fdad766 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 21:20:33 +0100 Subject: [PATCH 295/334] fix tests --- .../TestFunction24.il.netfx4.bsl | 187 +----------------- .../E_ReservedIdentKeywords.fs | 3 +- 2 files changed, 2 insertions(+), 188 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl index d1422d18107..494be65e9e1 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl @@ -1,189 +1,4 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.17376 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. - - -// Metadata version: v4.0.30319 -.assembly extern mscorlib -{ - .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. - .ver 4:0:0:0 -} -.assembly extern FSharp.Core -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:3:0:0 -} -.assembly TestFunction23 -{ - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, - int32, - int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) - - // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) - - .hash algorithm 0x00008004 - .ver 0:0:0:0 -} -.mresource public FSharpSignatureData.TestFunction23 -{ - // Offset: 0x00000000 Length: 0x0000036A -} -.mresource public FSharpOptimizationData.TestFunction23 -{ - // Offset: 0x00000370 Length: 0x000000E3 -} -.module TestFunction23.exe -// MVID: {4F20E3B8-A643-451C-A745-0383B8E3204F} -.imagebase 0x00400000 -.file alignment 0x00000200 -.stackreserve 0x00100000 -.subsystem 0x0003 // WINDOWS_CUI -.corflags 0x00000001 // ILONLY -// Image base: 0x0000008C477A0000 - - -// =============== CLASS MEMBERS DECLARATION =================== - -.class public abstract auto ansi sealed TestFunction23 - extends [mscorlib]System.Object -{ - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) - .class auto ansi serializable nested public C - extends [mscorlib]System.Object - { - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 03 00 00 00 00 00 ) - .field assembly string x - .field assembly string x@8 - .method public specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 32 (0x20) - .maxstack 8 - .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 6,6 : 5,38 - IL_0000: ldarg.0 - IL_0001: callvirt instance void [mscorlib]System.Object::.ctor() - IL_0006: ldarg.0 - IL_0007: pop - IL_0008: nop - IL_0009: ldarg.0 - IL_000a: call string [mscorlib]System.Console::ReadLine() - IL_000f: stfld string TestFunction23/C::x - .line 8,8 : 5,38 - IL_0014: ldarg.0 - IL_0015: call string [mscorlib]System.Console::ReadLine() - IL_001a: stfld string TestFunction23/C::x@8 - .line 5,5 : 6,7 - IL_001f: ret - } // end of method C::.ctor - - .method public hidebysig instance string - M() cil managed - { - // Code size 19 (0x13) - .maxstack 8 - .line 9,9 : 23,30 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldfld string TestFunction23/C::x@8 - IL_0007: ldarg.0 - IL_0008: callvirt instance string TestFunction23/C::g() - IL_000d: call string [mscorlib]System.String::Concat(string, - string) - IL_0012: ret - } // end of method C::M - - .method assembly hidebysig instance string - g() cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 8 (0x8) - .maxstack 8 - .line 7,7 : 15,16 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldfld string TestFunction23/C::x - IL_0007: ret - } // end of method C::g - - } // end of class C - - .class auto ansi serializable nested assembly beforefieldinit g@13 - extends class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2 - { - .method assembly specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::.ctor() - IL_0006: ret - } // end of method g@13::.ctor - - .method public strict virtual instance class [FSharp.Core]Microsoft.FSharp.Core.Unit - Invoke(class [FSharp.Core]Microsoft.FSharp.Core.Unit unitVar0) cil managed - { - // Code size 35 (0x23) - .maxstack 8 - .line 13,13 : 9,24 - IL_0000: nop - IL_0001: ldstr "Hello" - IL_0006: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) - IL_000b: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) - IL_0010: pop - .line 14,14 : 9,24 - IL_0011: ldstr "Hello" - IL_0016: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5::.ctor(string) - IL_001b: tail. - IL_001d: call !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4) - IL_0022: ret - } // end of method g@13::Invoke - - } // end of class g@13 - - .method public static class [mscorlib]System.Tuple`2 - f(!!a x) cil managed - { - // Code size 27 (0x1b) - .maxstack 5 - .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2 g) - .line 12,12 : 9,12 - IL_0000: nop - IL_0001: newobj instance void TestFunction23/g@13::.ctor() - IL_0006: stloc.0 - .line 15,15 : 5,13 - IL_0007: ldloc.0 - IL_0008: ldnull - IL_0009: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::Invoke(!0) - IL_000e: ldloc.0 - IL_000f: ldnull - IL_0010: callvirt instance !1 class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2::Invoke(!0) - IL_0015: newobj instance void class [mscorlib]System.Tuple`2::.ctor(!0, - !1) - IL_001a: ret - } // end of method TestFunction23::f - -} // end of class TestFunction23 - -.class private abstract auto ansi sealed ''.$TestFunction23 - extends [mscorlib]System.Object -{ - .method public static void main@() cil managed - { - .entrypoint - // Code size 2 (0x2) - .maxstack 8 - IL_0000: nop - IL_0001: ret - } // end of method $TestFunction23::main@ - -} // end of class ''.$TestFunction23 - - -// ============================================================= - -// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs index 2c550ad3d3c..cd69818e422 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs @@ -10,7 +10,7 @@ let constraint = 10 let constructor = 10 let continue = 10 let eager = 10 -let fixed = 10 + let fori = 10 let functor = 10 let include = 10 @@ -39,7 +39,6 @@ let volatile = 10 //The identifier 'constructor' is reserved for future use by F# //The identifier 'continue' is reserved for future use by F# //The identifier 'eager' is reserved for future use by F# -//The identifier 'fixed' is reserved for future use by F# //The identifier 'fori' is reserved for future use by F# //The identifier 'functor' is reserved for future use by F# //The identifier 'include' is reserved for future use by F# From b3d130a5b46348a6681e34976d9e9fb228042789 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 21:28:13 +0100 Subject: [PATCH 296/334] split appveyor into 3 parts --- appveyor.yml | 1 + build.cmd | 30 +++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 87ae05705b1..72838eb055f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,6 +4,7 @@ environment: matrix: - BUILD_PROFILE: ci_part1 - BUILD_PROFILE: ci_part2 + - BUILD_PROFILE: ci_part3 init: - git config --global core.autocrlf true diff --git a/build.cmd b/build.cmd index a3b79e7ef26..daa8da3e88a 100644 --- a/build.cmd +++ b/build.cmd @@ -13,7 +13,7 @@ echo Build and run a subset of test suites echo. echo Usage: echo. -echo build.cmd ^ +echo build.cmd ^ echo. echo No arguments default to 'build' echo. @@ -153,8 +153,10 @@ if /i '%ARG%' == 'ci_part1' ( set TEST_NET40_COREUNIT=1 set TEST_PORTABLE_COREUNIT=1 set TEST_CORECLR=0 - set TEST_TAGS= + set TEST_FSHARPQA_SUITE=0 + set TEST_FSHARP_SUITE=0 set TEST_VS=1 + set TEST_TAGS= ) if /i '%ARG%' == 'ci_part2' ( @@ -162,9 +164,31 @@ if /i '%ARG%' == 'ci_part2' ( set SKIP_EXPENSIVE_TESTS=1 set BUILD_CORECLR=1 set BUILD_PORTABLE=1 + + set TEST_COMPILERUNIT=0 + set TEST_NET40_COREUNIT=0 + set TEST_PORTABLE_COREUNIT=0 set TEST_CORECLR=1 - set TEST_FSHARPQA_SUITE=1 + set TEST_FSHARPQA_SUITE=0 set TEST_FSHARP_SUITE=1 + set TEST_VS=0 + set TEST_TAGS= +) + +if /i '%ARG%' == 'ci_part3' ( + set BUILD_PROTO=1 + set SKIP_EXPENSIVE_TESTS=1 + set BUILD_CORECLR=1 + set BUILD_PORTABLE=1 + + set TEST_COMPILERUNIT=0 + set TEST_NET40_COREUNIT=0 + set TEST_PORTABLE_COREUNIT=0 + set TEST_CORECLR=0 + set TEST_FSHARPQA_SUITE=1 + set TEST_FSHARP_SUITE=0 + set TEST_VS=0 + set TEST_TAGS= ) if /i '%ARG%' == 'coreclr' ( From a682a1823b41af745ed85635cc4fd32bcfbfef2d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 20 Jun 2016 23:51:53 +0100 Subject: [PATCH 297/334] fix VS --- src/fsharp/vs/ServiceLexing.fs | 2 +- src/fsharp/vs/ServiceParseTreeWalk.fs | 1 + src/fsharp/vs/ServiceUntypedParse.fs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fsharp/vs/ServiceLexing.fs b/src/fsharp/vs/ServiceLexing.fs index 8e7df0690a0..85f5f531085 100755 --- a/src/fsharp/vs/ServiceLexing.fs +++ b/src/fsharp/vs/ServiceLexing.fs @@ -250,7 +250,7 @@ module internal TokenClassifications = | FINALLY | LAZY | MATCH | MUTABLE | NEW | OF | OPEN | OR | VOID | EXTERN | INTERFACE | REC | TO | TRUE | TRY | TYPE | VAL | INLINE | WHEN | WHILE | WITH | IF | THEN | ELSE | DO | DONE | LET(_) | IN (*| NAMESPACE*) | CONST - | HIGH_PRECEDENCE_PAREN_APP + | HIGH_PRECEDENCE_PAREN_APP | FIXED | HIGH_PRECEDENCE_BRACK_APP | TYPE_COMING_SOON | TYPE_IS_HERE | MODULE_COMING_SOON | MODULE_IS_HERE -> (FSharpTokenColorKind.Keyword,FSharpTokenCharKind.Keyword,FSharpTokenTriggerClass.None) diff --git a/src/fsharp/vs/ServiceParseTreeWalk.fs b/src/fsharp/vs/ServiceParseTreeWalk.fs index 792af9f4bf6..2f93adbb52e 100755 --- a/src/fsharp/vs/ServiceParseTreeWalk.fs +++ b/src/fsharp/vs/ServiceParseTreeWalk.fs @@ -317,6 +317,7 @@ module internal AstTraversal = |> pick expr | SynExpr.Do(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.Assert(synExpr, _range) -> traverseSynExpr synExpr + | SynExpr.Fixed(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.App(_exprAtomicFlag, isInfix, synExpr, synExpr2, _range) -> if isInfix then [dive synExpr2 synExpr2.Range traverseSynExpr diff --git a/src/fsharp/vs/ServiceUntypedParse.fs b/src/fsharp/vs/ServiceUntypedParse.fs index 41b0b212799..b8e58a15abe 100755 --- a/src/fsharp/vs/ServiceUntypedParse.fs +++ b/src/fsharp/vs/ServiceUntypedParse.fs @@ -171,6 +171,7 @@ type FSharpParseFileResults(errors : FSharpErrorInfo[], input : Ast.ParsedInput | SynExpr.DiscardAfterMissingQualificationAfterDot (e,_) | SynExpr.Do (e,_) | SynExpr.Assert (e,_) + | SynExpr.Fixed (e,_) | SynExpr.DotGet (e,_,_,_) | SynExpr.LongIdentSet (_,e,_) | SynExpr.New (_,_,e,_) From c1512fc3c986dbcedd87a106824c49f827bfec0a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 12:24:28 +0100 Subject: [PATCH 298/334] change CI to part1/part2 --- appveyor.yml | 1 - build.cmd | 27 ++++++--------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 72838eb055f..87ae05705b1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,6 @@ environment: matrix: - BUILD_PROFILE: ci_part1 - BUILD_PROFILE: ci_part2 - - BUILD_PROFILE: ci_part3 init: - git config --global core.autocrlf true diff --git a/build.cmd b/build.cmd index daa8da3e88a..92765e2554f 100644 --- a/build.cmd +++ b/build.cmd @@ -13,7 +13,7 @@ echo Build and run a subset of test suites echo. echo Usage: echo. -echo build.cmd ^ +echo build.cmd ^ echo. echo No arguments default to 'build' echo. @@ -150,10 +150,10 @@ if /i '%ARG%' == 'ci_part1' ( set BUILD_VS=1 set TEST_COMPILERUNIT=1 - set TEST_NET40_COREUNIT=1 - set TEST_PORTABLE_COREUNIT=1 + set TEST_NET40_COREUNIT=0 + set TEST_PORTABLE_COREUNIT=0 set TEST_CORECLR=0 - set TEST_FSHARPQA_SUITE=0 + set TEST_FSHARPQA_SUITE=1 set TEST_FSHARP_SUITE=0 set TEST_VS=1 set TEST_TAGS= @@ -166,8 +166,8 @@ if /i '%ARG%' == 'ci_part2' ( set BUILD_PORTABLE=1 set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=0 - set TEST_PORTABLE_COREUNIT=0 + set TEST_NET40_COREUNIT=1 + set TEST_PORTABLE_COREUNIT=1 set TEST_CORECLR=1 set TEST_FSHARPQA_SUITE=0 set TEST_FSHARP_SUITE=1 @@ -175,21 +175,6 @@ if /i '%ARG%' == 'ci_part2' ( set TEST_TAGS= ) -if /i '%ARG%' == 'ci_part3' ( - set BUILD_PROTO=1 - set SKIP_EXPENSIVE_TESTS=1 - set BUILD_CORECLR=1 - set BUILD_PORTABLE=1 - - set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=0 - set TEST_PORTABLE_COREUNIT=0 - set TEST_CORECLR=0 - set TEST_FSHARPQA_SUITE=1 - set TEST_FSHARP_SUITE=0 - set TEST_VS=0 - set TEST_TAGS= -) if /i '%ARG%' == 'coreclr' ( set BUILD_CORECLR=1 From 8f0733cd3bea83ee0e3efcf4642a53cca24c13f1 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 15:42:22 +0100 Subject: [PATCH 299/334] proper codegen and add tests --- VisualFSharp.sln | 3 - src/fsharp/Optimizer.fs | 15 ++-- src/fsharp/PostInferenceChecks.fs | 26 +++---- src/fsharp/TastOps.fs | 4 +- src/fsharp/TastOps.fsi | 4 +- src/fsharp/TcGlobals.fs | 4 +- src/fsharp/TypeChecker.fs | 68 ++++++++++++------- src/fsharp/import.fs | 4 +- tests/fsharp/core/fsiAndModifiers/test.fsx | 51 ++++++++++++++ tests/fsharp/core/pinvoke/test.fsx | 16 ++--- .../CodeGen/EmittedIL/TestFunctions/env.lst | 20 +++--- 11 files changed, 143 insertions(+), 72 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index 26f1b2787c2..f83f67999d4 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -127,9 +127,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProjectSection EndProject Global - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index c046e7be579..01f2181a0ea 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -431,7 +431,7 @@ let BindExternalLocalVal cenv (v:Val) vval env = CheckInlineValueIsComplete v vval; #endif - if verboseOptimizationInfo then dprintn ("*** Binding "^v.LogicalName); + if verboseOptimizationInfo then dprintn ("*** Binding "+v.LogicalName); let vval = if v.IsMutable then {vval with ValExprInfo=UnknownValue } else vval let env = #if CHECKED @@ -534,7 +534,7 @@ let TryGetInfoForEntity sv n = | Some info -> Some (info.Force()) | None -> if verboseOptimizationInfo then - dprintn ("\n\n*** Optimization info for submodule "^n^" not found in parent module which contains submodules: "^String.concat "," (NameMap.domainL sv.ModuleOrNamespaceInfos)); + dprintn ("\n\n*** Optimization info for submodule "+n+" not found in parent module which contains submodules: "+String.concat "," (NameMap.domainL sv.ModuleOrNamespaceInfos)); None let rec TryGetInfoForPath sv (p:_[]) i = @@ -558,7 +558,7 @@ let GetInfoForNonLocalVal cenv env (vref:ValRef) = match structInfo.ValInfos.TryFind(vref) with | Some ninfo -> snd ninfo | None -> - //dprintn ("\n\n*** Optimization info for value "^n^" from module "^(full_name_of_nlpath smv)^" not found, module contains values: "^String.concat "," (NameMap.domainL structInfo.ValInfos)); + //dprintn ("\n\n*** Optimization info for value "+n+" from module "+(full_name_of_nlpath smv)+" not found, module contains values: "+String.concat "," (NameMap.domainL structInfo.ValInfos)); //System.Diagnostics.Debug.Assert(false,sprintf "Break for module %s, value %s" (full_name_of_nlpath smv) n) if cenv.g.compilingFslib then match structInfo.ValInfos.TryFindForFslib(vref) with @@ -1455,7 +1455,7 @@ let ExpandStructuralBindingRaw cenv expr = else let argTys = destTupleTy cenv.g v.Type let argBind i (arg:Expr) argTy = - let name = v.LogicalName ^ "_" ^ string i + let name = v.LogicalName + "_" + string i let v,ve = mkCompGenLocal arg.Range name argTy ve,mkCompGenBind v arg @@ -2834,7 +2834,8 @@ and ComputeSplitToMethodCondition flag threshold cenv env (e,einfo) = // None of them should be local polymorphic constrained values not (IsGenericValWithGenericContraints cenv.g v) && // None of them should be mutable - not v.IsMutable)))) + not v.IsMutable)))) && + not (isByrefLikeTy cenv.g (tyOfExpr cenv.g e)) and ConsiderSplitToMethod flag threshold cenv env (e,einfo) = if ComputeSplitToMethodCondition flag threshold cenv env (e,einfo) then @@ -2843,7 +2844,7 @@ and ConsiderSplitToMethod flag threshold cenv env (e,einfo) = let ty = tyOfExpr cenv.g e let nm = match env.latestBoundId with - | Some id -> id.idText^suffixForVariablesThatMayNotBeEliminated + | Some id -> id.idText+suffixForVariablesThatMayNotBeEliminated | None -> suffixForVariablesThatMayNotBeEliminated let fv,fe = mkCompGenLocal m nm (cenv.g.unit_ty --> ty) mkInvisibleLet m fv (mkLambda m uv (e,ty)) @@ -3063,7 +3064,7 @@ and OptimizeBinding cenv isRec env (TBind(v,e,spBind)) = then {einfo with Info=UnknownValue} else einfo if v.MustInline && IsPartialExprVal einfo.Info then - errorR(InternalError("the mustinline value '"^v.LogicalName^"' was not inferred to have a known value",v.Range)); + errorR(InternalError("the mustinline value '"+v.LogicalName+"' was not inferred to have a known value",v.Range)); #if DEBUG if verboseOptimizations then dprintf "val %s gets opt info %s\n" (showL(valL v)) (showL(exprValueInfoL cenv.g einfo.Info)); #endif diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index f5acda847ba..a8df762c996 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -643,19 +643,19 @@ and CheckExprInContext (cenv:cenv) (env:env) expr (context:ByrefCallContext) = CheckExpr cenv env e1 | Expr.Match(_,_,dtree,targets,m,ty) -> - CheckTypeNoByrefs cenv env m ty; - CheckDecisionTree cenv env dtree; - CheckDecisionTreeTargets cenv env targets context; + CheckTypePermitByrefs cenv env m ty // computed byrefs allowed at each branch + CheckDecisionTree cenv env dtree + CheckDecisionTreeTargets cenv env targets context | Expr.LetRec (binds,e,_,_) -> BindVals cenv (valsOfBinds binds) - CheckBindings cenv env binds; + CheckBindings cenv env binds CheckExpr cenv env e | Expr.StaticOptimization (constraints,e2,e3,m) -> - CheckExpr cenv env e2; - CheckExpr cenv env e3; + CheckExpr cenv env e2 + CheckExpr cenv env e3 constraints |> List.iter (function | TTyconEqualsTycon(ty1,ty2) -> - CheckTypeNoByrefs cenv env m ty1; + CheckTypeNoByrefs cenv env m ty1 CheckTypeNoByrefs cenv env m ty2 | TTyconIsStruct(ty1) -> CheckTypeNoByrefs cenv env m ty1) @@ -668,8 +668,8 @@ and CheckMethods cenv env baseValOpt l = and CheckMethod cenv env baseValOpt (TObjExprMethod(_,attribs,tps,vs,e,m)) = let env = BindTypars cenv.g env tps let vs = List.concat vs - CheckAttribs cenv env attribs; - CheckNoReraise cenv None e; + CheckAttribs cenv env attribs + CheckNoReraise cenv None e CheckEscapes cenv true m (match baseValOpt with Some x -> x:: vs | None -> vs) e |> ignore CheckExpr cenv env e @@ -682,13 +682,13 @@ and CheckInterfaceImpl cenv env baseValOpt (_ty,overrides) = and CheckExprOp cenv env (op,tyargs,args,m) context = let limitedCheck() = - if env.limited then errorR(Error(FSComp.SR.chkObjCtorsCantUseExceptionHandling(), m)); - List.iter (CheckTypePermitByrefs cenv env m) tyargs; + if env.limited then errorR(Error(FSComp.SR.chkObjCtorsCantUseExceptionHandling(), m)) + List.iter (CheckTypePermitByrefs cenv env m) tyargs (* Special cases *) match op,tyargs,args,context with // Handle these as special cases since mutables are allowed inside their bodies | TOp.While _,_,[Expr.Lambda(_,_,_,[_],e1,_,_);Expr.Lambda(_,_,_,[_],e2,_,_)],_ -> - CheckTypeInstNoByrefs cenv env m tyargs; + CheckTypeInstNoByrefs cenv env m tyargs CheckExprs cenv env [e1;e2] | TOp.TryFinally _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)],_ -> @@ -772,6 +772,8 @@ and CheckExprOp cenv env (op,tyargs,args,m) context = errorR(Error(FSComp.SR.chkNoAddressOfArrayElementAtThisPoint(), m)); CheckExprInContext cenv env lhsArray DirectArg (* permit byref for lhs lvalue *) CheckExprs cenv env indices + | [ AI_conv _ ],_ -> + CheckExprDirectArgs cenv env args (* permit byref for args to conv *) | _instrs -> CheckExprs cenv env args end diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 9425ea99de5..9a211d4ae95 100755 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -536,7 +536,7 @@ let rec sizeMeasure g ms = // Some basic type builders //--------------------------------------------------------------------------- -let mkNativePtrType g ty = TType_app (g.nativeptr_tcr, [ty]) +let mkNativePtrTy g ty = TType_app (g.nativeptr_tcr, [ty]) let mkByrefTy g ty = TType_app (g.byref_tcr, [ty]) let mkArrayTy g rank ty m = @@ -1458,6 +1458,7 @@ let isUnitTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> t let isObjTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> tyconRefEq g g.system_Object_tcref tcref | _ -> false) let isVoidTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> tyconRefEq g g.system_Void_tcref tcref | _ -> false) let isILAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> tcref.IsILTycon | _ -> false) +let isNativePtrTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> tyconRefEq g g.nativeptr_tcr tcref | _ -> false) let isByrefTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> tyconRefEq g g.byref_tcr tcref | _ -> false) let isByrefLikeTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref,_) -> isByrefLikeTyconRef g tcref | _ -> false) #if EXTENSIONTYPING @@ -2653,6 +2654,7 @@ let TyconRefHasAttribute g m attribSpec tcref = //------------------------------------------------------------------------- let destByrefTy g ty = if isByrefTy g ty then List.head (argsOfAppTy g ty) else failwith "destByrefTy: not a byref type" +let destNativePtrTy g ty = if isNativePtrTy g ty then List.head (argsOfAppTy g ty) else failwith "destNativePtrTy: not a native ptr type" let isRefCellTy g ty = match tryDestAppTy g ty with diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 58b602d92cb..536d04719f7 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -909,7 +909,7 @@ val ExprStats : Expr -> string // Make some common types //------------------------------------------------------------------------- -val mkNativePtrType : TcGlobals -> TType -> TType +val mkNativePtrTy : TcGlobals -> TType -> TType val mkArrayType : TcGlobals -> TType -> TType val isOptionTy : TcGlobals -> TType -> bool val destOptionTy : TcGlobals -> TType -> TType @@ -1258,7 +1258,9 @@ val mkCompilerGeneratedAttr : TcGlobals -> int -> ILAtt //------------------------------------------------------------------------- val isByrefTy : TcGlobals -> TType -> bool +val isNativePtrTy : TcGlobals -> TType -> bool val destByrefTy : TcGlobals -> TType -> TType +val destNativePtrTy : TcGlobals -> TType -> TType val isByrefLikeTyconRef : TcGlobals -> TyconRef -> bool val isByrefLikeTy : TcGlobals -> TType -> bool diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index a27c50ca268..1fa4b0a7ee2 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -668,7 +668,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa (* local helpers to build value infos *) let mkNullableTy ty = TType_app(nullable_tcr, [ty]) let mkByrefTy ty = TType_app(byref_tcr, [ty]) - let mkNativePtrType ty = TType_app(nativeptr_tcr, [ty]) + let mkNativePtrTy ty = TType_app(nativeptr_tcr, [ty]) let mkFunTy d r = TType_fun (d,r) let (-->) d r = mkFunTy d r let mkIteratedFunTy dl r = List.foldBack (-->) dl r @@ -847,7 +847,7 @@ let mkTcGlobals (compilingFslib,sysCcu,ilg,fslibCcu,directoryToResolveRelativePa let and_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "&" ,None ,None ,[], mk_rel_sig bool_ty) let addrof_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "~&" ,None ,None ,[vara], ([[varaTy]], mkByrefTy varaTy)) - let addrof2_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "~&&" ,None ,None ,[vara], ([[varaTy]], mkNativePtrType varaTy)) + let addrof2_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "~&&" ,None ,None ,[vara], ([[varaTy]], mkNativePtrTy varaTy)) let and2_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "&&" ,None ,None ,[], mk_rel_sig bool_ty) let or_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, "or" ,None ,Some "Or" ,[], mk_rel_sig bool_ty) let or2_info = makeIntrinsicValRef(fslib_MFIntrinsicOperators_nleref, CompileOpName "||" ,None ,None ,[], mk_rel_sig bool_ty) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index d0eea1147a0..a7575932f20 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9786,13 +9786,16 @@ and TcStaticOptimizationConstraint cenv env tpenv c = let tp',tpenv = TcTypar cenv env NewTyparsOK tpenv tp TTyconIsStruct(mkTyparTy tp'),tpenv +/// Emit a conv.i instruction +and mkConvToNativeInt g e m = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_I], [ g.nativeint_ty ]),[],[e],m) /// Fix up the r.h.s. of a 'use x = fixed expr' -and TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, mBinding) = +and TcAndBuildFixedExpr cenv env (overallPatTy, fixedExpr, overallExprTy, mBinding) = + warning(PossibleUnverifiableCode(mBinding)) match overallExprTy with | ty when isByrefTy cenv.g ty -> let okByRef = - match stripExpr rhsExprChecked with + match stripExpr fixedExpr with | Expr.Op (op,tyargs,args,_) -> match op,tyargs,args with | TOp.ValFieldGetAddr rfref,_,[_] -> not rfref.Tycon.IsStructOrEnumTycon @@ -9803,40 +9806,59 @@ and TcAndBuildFixedExpr cenv env (overallPatTy, rhsExprChecked, overallExprTy, m | _ -> false if not okByRef then error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) - UnifyTypes cenv env mBinding overallExprTy overallPatTy - rhsExprChecked - + + let elemTy = destByrefTy cenv.g overallExprTy + UnifyTypes cenv env mBinding (mkNativePtrTy cenv.g elemTy) overallPatTy + mkCompGenLetIn mBinding "pinnedByref" ty fixedExpr (fun (v,ve) -> + v.SetIsFixed() + mkConvToNativeInt cenv.g ve mBinding) + | ty when isStringTy cenv.g ty -> - let charPtrTy = (mkNativePtrType cenv.g cenv.g.char_ty) + let charPtrTy = mkNativePtrTy cenv.g cenv.g.char_ty UnifyTypes cenv env mBinding charPtrTy overallPatTy - let stringObjAsPtr = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_I], [ charPtrTy ]),[],[rhsExprChecked],mBinding) - // For strings 'use x = fixed str', we actually generate two pinned variables - // let pinned x = - // let pinned tmp = (char*) str - // tmp + get_OffsettoStringData() - // This is the easiest codegen for F# - - // Store the string into a pinned local - mkCompGenLetIn mBinding "pinnedString" charPtrTy stringObjAsPtr (fun (v,ve) -> + // + // let ptr : nativeptr = + // let pinned s = str + // (nativeptr)s + get_OffsettoStringData() + + mkCompGenLetIn mBinding "pinnedString" cenv.g.string_ty fixedExpr (fun (v,ve) -> v.SetIsFixed() let addrOffset = BuildOffsetToStringData cenv env mBinding - let stringPlusOffset = Expr.Op (TOp.ILAsm ([ AI_add ], [ charPtrTy ]),[],[ve; addrOffset],mBinding) + let stringAsNativeInt = mkConvToNativeInt cenv.g ve mBinding + let plusOffset = Expr.Op (TOp.ILAsm ([ AI_add ], [ cenv.g.nativeint_ty ]),[],[stringAsNativeInt; addrOffset],mBinding) // check for non-null - mkNullTest cenv.g mBinding ve stringPlusOffset ve) + mkNullTest cenv.g mBinding ve plusOffset ve) | ty when isArray1DTy cenv.g ty -> let elemTy = destArrayTy cenv.g overallExprTy - let elemPtrTy = mkByrefTy cenv.g elemTy + let elemPtrTy = mkNativePtrTy cenv.g elemTy UnifyTypes cenv env mBinding elemPtrTy overallPatTy - // Store the array into a local - mkCompGenLetIn mBinding "tmpArray" overallExprTy rhsExprChecked (fun (_,ve) -> + + // let ptr : nativeptr = + // let tmpArray : elem[] = arr + // if nonNull tmpArray then + // if tmpArray.Length <> 0 then + // let pinned tmpArrayByref : byref = &arr.[0] + // (nativeint) tmpArrayByref + // else + // (nativeint) 0 + // else + // (nativeint) 0 + // + mkCompGenLetIn mBinding "tmpArray" overallExprTy fixedExpr (fun (_,ve) -> // This is &arr.[0] let elemZeroAddress = mkArrayElemAddress cenv.g (ILReadonly.NormalAddress,false,ILArrayShape.SingleDimensional,elemTy,ve,mkInt32 cenv.g mBinding 0,mBinding) // check for non-null and non-empty - let zero = Expr.Op (TOp.ILAsm ([ AI_conv ILBasicType.DT_U], [ cenv.g.nativeint_ty ]),[],[mkInt32 cenv.g mBinding 0],mBinding) + let zero = mkConvToNativeInt cenv.g (mkInt32 cenv.g mBinding 0) mBinding // This is arr.Length let arrayLengthExpr = mkCallArrayLength cenv.g mBinding elemTy ve - mkNullTest cenv.g mBinding ve (mkNullTest cenv.g mBinding arrayLengthExpr elemZeroAddress zero) zero ) + mkNullTest cenv.g mBinding ve + (mkNullTest cenv.g mBinding arrayLengthExpr + (mkCompGenLetIn mBinding "pinnedByref" (mkByrefTy cenv.g elemTy) elemZeroAddress (fun (v,ve) -> + v.SetIsFixed() + (mkConvToNativeInt cenv.g ve mBinding))) + zero) + zero) | _ -> error(Error(FSComp.SR.tcFixedNotAllowed(),mBinding)) @@ -10314,8 +10336,6 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope | TPat_as (pat1,PBind(v,TypeScheme(generalizedTypars',_)),_) when List.lengthsEqAndForall2 typarRefEq generalizedTypars generalizedTypars' -> - if isFixed then - v.SetIsFixed() v, pat1 | _ when mustinline(inlineFlag) -> error(Error(FSComp.SR.tcInvalidInlineSpecification(),m)) diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 974c7e93d61..7f29cacc8ee 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -162,7 +162,7 @@ let rec ImportILType (env:ImportMap) m tinst typ = ImportTyconRefApp env tcref inst | ILType.Byref ty -> mkByrefTy env.g (ImportILType env m tinst ty) - | ILType.Ptr ty -> mkNativePtrType env.g (ImportILType env m tinst ty) + | ILType.Ptr ty -> mkNativePtrTy env.g (ImportILType env m tinst ty) | ILType.FunctionPointer _ -> env.g.nativeint_ty (* failwith "cannot import this kind of type (ptr, fptr)" *) | ILType.Modified(_,_,ty) -> // All custom modifiers are ignored @@ -244,7 +244,7 @@ let rec ImportProvidedType (env:ImportMap) (m:range) (* (tinst:TypeInst) *) (st: mkByrefTy g elemTy elif st.PUntaint((fun st -> st.IsPointer),m) then let elemTy = (ImportProvidedType env m (* tinst *) (st.PApply((fun st -> st.GetElementType()),m))) - mkNativePtrType g elemTy + mkNativePtrTy g elemTy else // REVIEW: Extension type could try to be its own generic arg (or there could be a type loop) diff --git a/tests/fsharp/core/fsiAndModifiers/test.fsx b/tests/fsharp/core/fsiAndModifiers/test.fsx index 39acf7397aa..16b3d33aee0 100644 --- a/tests/fsharp/core/fsiAndModifiers/test.fsx +++ b/tests/fsharp/core/fsiAndModifiers/test.fsx @@ -86,6 +86,57 @@ module TestPack4 = printfn "got %A" got if got <> expected then fail (sprintf "TestPack4: got %A, expected %A" got expected) +module PinTests = + open FSharp.NativeInterop + // Assume that the following class exists. + + type Point = { mutable x : int; mutable y : int } + + let pinObject() = + let point = { x = 1; y = 2 } + use p1 = fixed &point.x // note, fixed is a keyword and would be highlighted + NativePtr.get p1 0 + NativePtr.get p1 1 + + let pinRef() = + let point = ref 17 + use p1 = fixed &point.contents // note, fixed is a keyword and would be highlighted + NativePtr.read p1 + NativePtr.read p1 + + let pinArray1() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + use p1 = fixed arr + NativePtr.get p1 0 + NativePtr.get p1 1 + + let pinArray2() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + // You can initialize a pointer by using the address of a variable. + use p = fixed &arr.[0] + NativePtr.get p 0 + NativePtr.get p 1 + + let pinNullArray() = + let arr : int[] = null + use p1 = fixed arr + 4 + + let pinEmptyArray() = + let arr : int[] = [| |] + use p1 = fixed arr + 76 + + let pinString() = + let str = "Hello World" + // The following assignment initializes p by using a string. + use pChar = fixed str + NativePtr.get pChar 0, NativePtr.get pChar 1 + + if pinObject() <> 3 then fail "FAILED: pinObject" + if pinRef() <> 34 then fail "FAILED: pinObject" + if pinArray1() <> 1.5 then fail "FAILED: pinArray1" + if pinArray2() <> 1.5 then fail "FAILED: pinArray2" + if pinNullArray() <> 4 then fail "FAILED: pinNullArray" + if pinEmptyArray() <> 76 then fail "FAILED: pinEmptyArray" + if pinString() <> ('H', 'e') then fail "FAILED: pinString" + if errors.IsEmpty then System.IO.File.WriteAllText("test.ok", "") diff --git a/tests/fsharp/core/pinvoke/test.fsx b/tests/fsharp/core/pinvoke/test.fsx index 3d63185df3b..3d8a4831c58 100644 --- a/tests/fsharp/core/pinvoke/test.fsx +++ b/tests/fsharp/core/pinvoke/test.fsx @@ -1,5 +1,5 @@ // #Conformance #Interop #PInvoke #Structs -#light + #nowarn "9" open System @@ -37,12 +37,11 @@ let pinned (obj: obj) f = // (typeof<'a>) == (typeof) or // etc. -type PinBox<'a> = { v : obj } - with +type PinBox<'a> = + { v : obj } static member Create(x) = { v = box(x) } member x.Value = (unbox x.v : 'a) member x.Pin(f) = pinned(x.v) f - end let card_init () = let width = PinBox<_>.Create(300) in @@ -135,7 +134,7 @@ let example1() = -module GetSystemTimeTest = begin +module GetSystemTimeTest = open System open System.Runtime.InteropServices @@ -166,9 +165,8 @@ module GetSystemTimeTest = begin (int32 sysTime.wMinute ) (int32 sysTime.wSecond) -end -module MemoryStatusTest = begin +module MemoryStatusTest = open System open System.Runtime.InteropServices @@ -204,10 +202,9 @@ module MemoryStatusTest = begin printf "%A\n" mex main() -end -module MemoryStatusTest2 = begin +module MemoryStatusTest2 = open System open System.Runtime.InteropServices @@ -243,5 +240,4 @@ module MemoryStatusTest2 = begin printf "%A\n" mex main() -end diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index c55c1dc11ef..fb6a949b63a 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -34,13 +34,13 @@ SOURCE=TestFunction15.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction15.exe" # TestFunction15.fs SOURCE=TestFunction18.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction18.exe" # TestFunction18.fs - SOURCE=Testfunction22.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22.exe" # TestFunction22.fs - SOURCE=Testfunction22b.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22b.exe" # TestFunction22b.fs - SOURCE=Testfunction22c.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22c.exe" # TestFunction22c.fs - SOURCE=Testfunction22d.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22d.exe" # TestFunction22d.fs - SOURCE=Testfunction22e.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22e.exe" # TestFunction22e.fs - SOURCE=Testfunction22f.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22f.exe" # TestFunction22f.fs - SOURCE=Testfunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs - - SOURCE=Testfunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 - SOURCE=Testfunction24.fs SCFLAGS="-a -g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.dll NetFx40" # TestFunction24.fs - NetFx40 + SOURCE=TestFunction22.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22.exe" # TestFunction22.fs + SOURCE=TestFunction22b.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22b.exe" # TestFunction22b.fs + SOURCE=TestFunction22c.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22c.exe" # TestFunction22c.fs + SOURCE=TestFunction22d.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22d.exe" # TestFunction22d.fs + SOURCE=TestFunction22e.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22e.exe" # TestFunction22e.fs + SOURCE=TestFunction22f.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22f.exe" # TestFunction22f.fs + SOURCE=TestFunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs + + SOURCE=TestFunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 + SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 From f1c8a1069abc44634a7d71682f0ba03aafef1108 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 15:52:11 +0100 Subject: [PATCH 300/334] update tests --- .../TestFunction24.il.netfx4.bsl | 961 +++++++++++++++++- .../EmittedIL/TestFunctions/TestFunction25.fs | 32 + .../TestFunction25.il.netfx4.bsl | 772 ++++++++++++++ .../EmittedIL/TestFunctions/Testfunction24.fs | 15 +- .../CodeGen/EmittedIL/TestFunctions/env.lst | 1 + 5 files changed, 1773 insertions(+), 8 deletions(-) create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl index 494be65e9e1..171d1faa640 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl @@ -1,4 +1,963 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 // Copyright (c) Microsoft Corporation. All rights reserved. + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:4:1:0 +} +.assembly TestFunction24 +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + + // --- The following custom attribute is added automatically, do not uncomment ------- + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 00 01 00 00 00 00 ) + + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.TestFunction24 +{ + // Offset: 0x00000000 Length: 0x0000075B + // WARNING: managed resource file FSharpSignatureData.TestFunction24 created +} +.mresource public FSharpOptimizationData.TestFunction24 +{ + // Offset: 0x00000760 Length: 0x00000228 + // WARNING: managed resource file FSharpOptimizationData.TestFunction24 created +} +.module TestFunction24.exe +// MVID: {5769535C-A643-4587-A745-03835C536957} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x00890000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed TestFunction24 + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .class auto ansi serializable sealed nested public Point + extends [mscorlib]System.Object + implements class [mscorlib]System.IEquatable`1, + [mscorlib]System.Collections.IStructuralEquatable, + class [mscorlib]System.IComparable`1, + [mscorlib]System.IComparable, + [mscorlib]System.Collections.IStructuralComparable + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 02 00 00 00 00 00 ) + .field public int32 x@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .field public int32 y@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .method public hidebysig specialname + instance int32 get_x() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 TestFunction24/Point::x@ + IL_0006: ret + } // end of method Point::get_x + + .method public hidebysig specialname + instance int32 get_y() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 TestFunction24/Point::y@ + IL_0006: ret + } // end of method Point::get_y + + .method public hidebysig specialname + instance void set_x(int32 'value') cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: stfld int32 TestFunction24/Point::x@ + IL_0007: ret + } // end of method Point::set_x + + .method public hidebysig specialname + instance void set_y(int32 'value') cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: stfld int32 TestFunction24/Point::y@ + IL_0007: ret + } // end of method Point::set_y + + .method public specialname rtspecialname + instance void .ctor(int32 x, + int32 y) cil managed + { + // Code size 21 (0x15) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [mscorlib]System.Object::.ctor() + IL_0006: ldarg.0 + IL_0007: ldarg.1 + IL_0008: stfld int32 TestFunction24/Point::x@ + IL_000d: ldarg.0 + IL_000e: ldarg.2 + IL_000f: stfld int32 TestFunction24/Point::y@ + IL_0014: ret + } // end of method Point::.ctor + + .method public hidebysig virtual final + instance int32 CompareTo(class TestFunction24/Point obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 143 (0x8f) + .maxstack 4 + .locals init (int32 V_0, + class [mscorlib]System.Collections.IComparer V_1, + int32 V_2, + int32 V_3, + class [mscorlib]System.Collections.IComparer V_4, + int32 V_5, + int32 V_6) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0009 + + IL_0007: br.s IL_000e + + IL_0009: br IL_0081 + + IL_000e: ldarg.1 + IL_000f: ldnull + IL_0010: cgt.un + IL_0012: brfalse.s IL_0016 + + IL_0014: br.s IL_001b + + IL_0016: br IL_007f + + IL_001b: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0020: stloc.1 + IL_0021: ldarg.0 + IL_0022: ldfld int32 TestFunction24/Point::x@ + IL_0027: stloc.2 + IL_0028: ldarg.1 + IL_0029: ldfld int32 TestFunction24/Point::x@ + IL_002e: stloc.3 + IL_002f: ldloc.2 + IL_0030: ldloc.3 + IL_0031: bge.s IL_0035 + + IL_0033: br.s IL_0037 + + IL_0035: br.s IL_003b + + IL_0037: ldc.i4.m1 + IL_0038: nop + IL_0039: br.s IL_0040 + + IL_003b: ldloc.2 + IL_003c: ldloc.3 + IL_003d: cgt + IL_003f: nop + IL_0040: stloc.0 + IL_0041: ldloc.0 + IL_0042: ldc.i4.0 + IL_0043: bge.s IL_0047 + + IL_0045: br.s IL_0049 + + IL_0047: br.s IL_004b + + IL_0049: ldloc.0 + IL_004a: ret + + IL_004b: ldloc.0 + IL_004c: ldc.i4.0 + IL_004d: ble.s IL_0051 + + IL_004f: br.s IL_0053 + + IL_0051: br.s IL_0055 + + IL_0053: ldloc.0 + IL_0054: ret + + IL_0055: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_005a: stloc.s V_4 + IL_005c: ldarg.0 + IL_005d: ldfld int32 TestFunction24/Point::y@ + IL_0062: stloc.s V_5 + IL_0064: ldarg.1 + IL_0065: ldfld int32 TestFunction24/Point::y@ + IL_006a: stloc.s V_6 + IL_006c: ldloc.s V_5 + IL_006e: ldloc.s V_6 + IL_0070: bge.s IL_0074 + + IL_0072: br.s IL_0076 + + IL_0074: br.s IL_0078 + + IL_0076: ldc.i4.m1 + IL_0077: ret + + IL_0078: ldloc.s V_5 + IL_007a: ldloc.s V_6 + IL_007c: cgt + IL_007e: ret + + IL_007f: ldc.i4.1 + IL_0080: ret + + IL_0081: ldarg.1 + IL_0082: ldnull + IL_0083: cgt.un + IL_0085: brfalse.s IL_0089 + + IL_0087: br.s IL_008b + + IL_0089: br.s IL_008d + + IL_008b: ldc.i4.m1 + IL_008c: ret + + IL_008d: ldc.i4.0 + IL_008e: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 14 (0xe) + .maxstack 8 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldarg.1 + IL_0003: unbox.any TestFunction24/Point + IL_0008: callvirt instance int32 TestFunction24/Point::CompareTo(class TestFunction24/Point) + IL_000d: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj, + class [mscorlib]System.Collections.IComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 160 (0xa0) + .maxstack 4 + .locals init ([0] class TestFunction24/Point V_0, + [1] class TestFunction24/Point V_1, + [2] int32 V_2, + [3] class [mscorlib]System.Collections.IComparer V_3, + [4] int32 V_4, + [5] int32 V_5, + [6] class [mscorlib]System.Collections.IComparer V_6, + [7] int32 V_7, + [8] int32 V_8) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: unbox.any TestFunction24/Point + IL_0007: stloc.0 + IL_0008: ldloc.0 + IL_0009: stloc.1 + IL_000a: ldarg.0 + IL_000b: ldnull + IL_000c: cgt.un + IL_000e: brfalse.s IL_0012 + + IL_0010: br.s IL_0017 + + IL_0012: br IL_008d + + IL_0017: ldarg.1 + IL_0018: unbox.any TestFunction24/Point + IL_001d: ldnull + IL_001e: cgt.un + IL_0020: brfalse.s IL_0024 + + IL_0022: br.s IL_0029 + + IL_0024: br IL_008b + + IL_0029: ldarg.2 + IL_002a: stloc.3 + IL_002b: ldarg.0 + IL_002c: ldfld int32 TestFunction24/Point::x@ + IL_0031: stloc.s V_4 + IL_0033: ldloc.1 + IL_0034: ldfld int32 TestFunction24/Point::x@ + IL_0039: stloc.s V_5 + IL_003b: ldloc.s V_4 + IL_003d: ldloc.s V_5 + IL_003f: bge.s IL_0043 + + IL_0041: br.s IL_0045 + + IL_0043: br.s IL_0049 + + IL_0045: ldc.i4.m1 + IL_0046: nop + IL_0047: br.s IL_0050 + + IL_0049: ldloc.s V_4 + IL_004b: ldloc.s V_5 + IL_004d: cgt + IL_004f: nop + IL_0050: stloc.2 + IL_0051: ldloc.2 + IL_0052: ldc.i4.0 + IL_0053: bge.s IL_0057 + + IL_0055: br.s IL_0059 + + IL_0057: br.s IL_005b + + IL_0059: ldloc.2 + IL_005a: ret + + IL_005b: ldloc.2 + IL_005c: ldc.i4.0 + IL_005d: ble.s IL_0061 + + IL_005f: br.s IL_0063 + + IL_0061: br.s IL_0065 + + IL_0063: ldloc.2 + IL_0064: ret + + IL_0065: ldarg.2 + IL_0066: stloc.s V_6 + IL_0068: ldarg.0 + IL_0069: ldfld int32 TestFunction24/Point::y@ + IL_006e: stloc.s V_7 + IL_0070: ldloc.1 + IL_0071: ldfld int32 TestFunction24/Point::y@ + IL_0076: stloc.s V_8 + IL_0078: ldloc.s V_7 + IL_007a: ldloc.s V_8 + IL_007c: bge.s IL_0080 + + IL_007e: br.s IL_0082 + + IL_0080: br.s IL_0084 + + IL_0082: ldc.i4.m1 + IL_0083: ret + + IL_0084: ldloc.s V_7 + IL_0086: ldloc.s V_8 + IL_0088: cgt + IL_008a: ret + + IL_008b: ldc.i4.1 + IL_008c: ret + + IL_008d: ldarg.1 + IL_008e: unbox.any TestFunction24/Point + IL_0093: ldnull + IL_0094: cgt.un + IL_0096: brfalse.s IL_009a + + IL_0098: br.s IL_009c + + IL_009a: br.s IL_009e + + IL_009c: ldc.i4.m1 + IL_009d: ret + + IL_009e: ldc.i4.0 + IL_009f: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 63 (0x3f) + .maxstack 7 + .locals init (int32 V_0, + class [mscorlib]System.Collections.IEqualityComparer V_1, + class [mscorlib]System.Collections.IEqualityComparer V_2) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0009 + + IL_0007: br.s IL_000b + + IL_0009: br.s IL_003d + + IL_000b: ldc.i4.0 + IL_000c: stloc.0 + IL_000d: ldc.i4 0x9e3779b9 + IL_0012: ldarg.1 + IL_0013: stloc.1 + IL_0014: ldarg.0 + IL_0015: ldfld int32 TestFunction24/Point::y@ + IL_001a: ldloc.0 + IL_001b: ldc.i4.6 + IL_001c: shl + IL_001d: ldloc.0 + IL_001e: ldc.i4.2 + IL_001f: shr + IL_0020: add + IL_0021: add + IL_0022: add + IL_0023: stloc.0 + IL_0024: ldc.i4 0x9e3779b9 + IL_0029: ldarg.1 + IL_002a: stloc.2 + IL_002b: ldarg.0 + IL_002c: ldfld int32 TestFunction24/Point::x@ + IL_0031: ldloc.0 + IL_0032: ldc.i4.6 + IL_0033: shl + IL_0034: ldloc.0 + IL_0035: ldc.i4.2 + IL_0036: shr + IL_0037: add + IL_0038: add + IL_0039: add + IL_003a: stloc.0 + IL_003b: ldloc.0 + IL_003c: ret + + IL_003d: ldc.i4.0 + IL_003e: ret + } // end of method Point::GetHashCode + + .method public hidebysig virtual final + instance int32 GetHashCode() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 13 (0xd) + .maxstack 8 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() + IL_0007: callvirt instance int32 TestFunction24/Point::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) + IL_000c: ret + } // end of method Point::GetHashCode + + .method public hidebysig virtual final + instance bool Equals(object obj, + class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 78 (0x4e) + .maxstack 4 + .locals init (class TestFunction24/Point V_0, + class TestFunction24/Point V_1, + class [mscorlib]System.Collections.IEqualityComparer V_2, + class [mscorlib]System.Collections.IEqualityComparer V_3) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0009 + + IL_0007: br.s IL_000b + + IL_0009: br.s IL_0046 + + IL_000b: ldarg.1 + IL_000c: isinst TestFunction24/Point + IL_0011: stloc.0 + IL_0012: ldloc.0 + IL_0013: brfalse.s IL_0017 + + IL_0015: br.s IL_0019 + + IL_0017: br.s IL_0044 + + IL_0019: ldloc.0 + IL_001a: stloc.1 + IL_001b: ldarg.2 + IL_001c: stloc.2 + IL_001d: ldarg.0 + IL_001e: ldfld int32 TestFunction24/Point::x@ + IL_0023: ldloc.1 + IL_0024: ldfld int32 TestFunction24/Point::x@ + IL_0029: ceq + IL_002b: brfalse.s IL_002f + + IL_002d: br.s IL_0031 + + IL_002f: br.s IL_0042 + + IL_0031: ldarg.2 + IL_0032: stloc.3 + IL_0033: ldarg.0 + IL_0034: ldfld int32 TestFunction24/Point::y@ + IL_0039: ldloc.1 + IL_003a: ldfld int32 TestFunction24/Point::y@ + IL_003f: ceq + IL_0041: ret + + IL_0042: ldc.i4.0 + IL_0043: ret + + IL_0044: ldc.i4.0 + IL_0045: ret + + IL_0046: ldarg.1 + IL_0047: ldnull + IL_0048: cgt.un + IL_004a: ldc.i4.0 + IL_004b: ceq + IL_004d: ret + } // end of method Point::Equals + + .method public hidebysig virtual final + instance bool Equals(class TestFunction24/Point obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 66 (0x42) + .maxstack 4 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0009 + + IL_0007: br.s IL_000b + + IL_0009: br.s IL_003a + + IL_000b: ldarg.1 + IL_000c: ldnull + IL_000d: cgt.un + IL_000f: brfalse.s IL_0013 + + IL_0011: br.s IL_0015 + + IL_0013: br.s IL_0038 + + IL_0015: ldarg.0 + IL_0016: ldfld int32 TestFunction24/Point::x@ + IL_001b: ldarg.1 + IL_001c: ldfld int32 TestFunction24/Point::x@ + IL_0021: bne.un.s IL_0025 + + IL_0023: br.s IL_0027 + + IL_0025: br.s IL_0036 + + IL_0027: ldarg.0 + IL_0028: ldfld int32 TestFunction24/Point::y@ + IL_002d: ldarg.1 + IL_002e: ldfld int32 TestFunction24/Point::y@ + IL_0033: ceq + IL_0035: ret + + IL_0036: ldc.i4.0 + IL_0037: ret + + IL_0038: ldc.i4.0 + IL_0039: ret + + IL_003a: ldarg.1 + IL_003b: ldnull + IL_003c: cgt.un + IL_003e: ldc.i4.0 + IL_003f: ceq + IL_0041: ret + } // end of method Point::Equals + + .method public hidebysig virtual final + instance bool Equals(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 25 (0x19) + .maxstack 4 + .locals init (class TestFunction24/Point V_0) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: isinst TestFunction24/Point + IL_0007: stloc.0 + IL_0008: ldloc.0 + IL_0009: brfalse.s IL_000d + + IL_000b: br.s IL_000f + + IL_000d: br.s IL_0017 + + IL_000f: ldarg.0 + IL_0010: ldloc.0 + IL_0011: callvirt instance bool TestFunction24/Point::Equals(class TestFunction24/Point) + IL_0016: ret + + IL_0017: ldc.i4.0 + IL_0018: ret + } // end of method Point::Equals + + .property instance int32 x() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32) = ( 01 00 04 00 00 00 00 00 00 00 00 00 ) + .set instance void TestFunction24/Point::set_x(int32) + .get instance int32 TestFunction24/Point::get_x() + } // end of property Point::x + .property instance int32 y() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32) = ( 01 00 04 00 00 00 01 00 00 00 00 00 ) + .set instance void TestFunction24/Point::set_y(int32) + .get instance int32 TestFunction24/Point::get_y() + } // end of property Point::y + } // end of class Point + + .method public static int32 pinObject() cil managed + { + // Code size 67 (0x43) + .maxstack 6 + .locals init ([0] class TestFunction24/Point point, + [1] native int p1, + [2] int32& pinned V_2, + [3] native int V_3, + [4] int32 V_4, + [5] native int V_5, + [6] int32 V_6) + IL_0000: nop + IL_0001: ldc.i4.1 + IL_0002: ldc.i4.2 + IL_0003: newobj instance void TestFunction24/Point::.ctor(int32, + int32) + IL_0008: stloc.0 + IL_0009: ldloc.0 + IL_000a: ldflda int32 TestFunction24/Point::x@ + IL_000f: stloc.2 + IL_0010: ldloc.2 + IL_0011: conv.i + IL_0012: stloc.1 + IL_0013: ldloc.1 + IL_0014: stloc.3 + IL_0015: ldc.i4.0 + IL_0016: stloc.s V_4 + IL_0018: ldloc.3 + IL_0019: ldloc.s V_4 + IL_001b: conv.i + IL_001c: sizeof [mscorlib]System.Int32 + IL_0022: mul + IL_0023: add + IL_0024: ldobj [mscorlib]System.Int32 + IL_0029: ldloc.1 + IL_002a: stloc.s V_5 + IL_002c: ldc.i4.1 + IL_002d: stloc.s V_6 + IL_002f: ldloc.s V_5 + IL_0031: ldloc.s V_6 + IL_0033: conv.i + IL_0034: sizeof [mscorlib]System.Int32 + IL_003a: mul + IL_003b: add + IL_003c: ldobj [mscorlib]System.Int32 + IL_0041: add + IL_0042: ret + } // end of method TestFunction24::pinObject + + .method public static int32 pinRef() cil managed + { + // Code size 33 (0x21) + .maxstack 4 + .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 point, + [1] native int p1, + [2] int32& pinned V_2) + IL_0000: nop + IL_0001: ldc.i4.s 17 + IL_0003: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 [FSharp.Core]Microsoft.FSharp.Core.Operators::Ref(!!0) + IL_0008: stloc.0 + IL_0009: ldloc.0 + IL_000a: ldflda !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::contents@ + IL_000f: stloc.2 + IL_0010: ldloc.2 + IL_0011: conv.i + IL_0012: stloc.1 + IL_0013: ldloc.1 + IL_0014: ldobj [mscorlib]System.Int32 + IL_0019: ldloc.1 + IL_001a: ldobj [mscorlib]System.Int32 + IL_001f: add + IL_0020: ret + } // end of method TestFunction24::pinRef + + .method public static float64 pinArray1() cil managed + { + // Code size 197 (0xc5) + .maxstack 6 + .locals init ([0] float64[] arr, + [1] native int p1, + [2] float64[] V_2, + [3] float64& pinned V_3, + [4] native int V_4, + [5] int32 V_5, + [6] native int V_6, + [7] int32 V_7) + IL_0000: nop + IL_0001: ldc.i4.6 + IL_0002: newarr [mscorlib]System.Double + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.r8 0.0 + IL_0012: stelem [mscorlib]System.Double + IL_0017: dup + IL_0018: ldc.i4.1 + IL_0019: ldc.r8 1.5 + IL_0022: stelem [mscorlib]System.Double + IL_0027: dup + IL_0028: ldc.i4.2 + IL_0029: ldc.r8 2.2999999999999998 + IL_0032: stelem [mscorlib]System.Double + IL_0037: dup + IL_0038: ldc.i4.3 + IL_0039: ldc.r8 3.3999999999999999 + IL_0042: stelem [mscorlib]System.Double + IL_0047: dup + IL_0048: ldc.i4.4 + IL_0049: ldc.r8 4. + IL_0052: stelem [mscorlib]System.Double + IL_0057: dup + IL_0058: ldc.i4.5 + IL_0059: ldc.r8 5.9000000000000004 + IL_0062: stelem [mscorlib]System.Double + IL_0067: stloc.0 + IL_0068: ldloc.0 + IL_0069: stloc.2 + IL_006a: ldloc.2 + IL_006b: brfalse.s IL_006f + + IL_006d: br.s IL_0071 + + IL_006f: br.s IL_008f + + IL_0071: ldloc.2 + IL_0072: call int32 [FSharp.Core]Microsoft.FSharp.Collections.ArrayModule::Length(!!0[]) + IL_0077: brfalse.s IL_007b + + IL_0079: br.s IL_007d + + IL_007b: br.s IL_008a + + IL_007d: ldloc.2 + IL_007e: ldc.i4.0 + IL_007f: ldelema [mscorlib]System.Double + IL_0084: stloc.3 + IL_0085: ldloc.3 + IL_0086: conv.i + IL_0087: nop + IL_0088: br.s IL_0092 + + IL_008a: ldc.i4.0 + IL_008b: conv.i + IL_008c: nop + IL_008d: br.s IL_0092 + + IL_008f: ldc.i4.0 + IL_0090: conv.i + IL_0091: nop + IL_0092: stloc.1 + IL_0093: ldloc.1 + IL_0094: stloc.s V_4 + IL_0096: ldc.i4.0 + IL_0097: stloc.s V_5 + IL_0099: ldloc.s V_4 + IL_009b: ldloc.s V_5 + IL_009d: conv.i + IL_009e: sizeof [mscorlib]System.Double + IL_00a4: mul + IL_00a5: add + IL_00a6: ldobj [mscorlib]System.Double + IL_00ab: ldloc.1 + IL_00ac: stloc.s V_6 + IL_00ae: ldc.i4.1 + IL_00af: stloc.s V_7 + IL_00b1: ldloc.s V_6 + IL_00b3: ldloc.s V_7 + IL_00b5: conv.i + IL_00b6: sizeof [mscorlib]System.Double + IL_00bc: mul + IL_00bd: add + IL_00be: ldobj [mscorlib]System.Double + IL_00c3: add + IL_00c4: ret + } // end of method TestFunction24::pinArray1 + + .method public static float64 pinArray2() cil managed + { + // Code size 163 (0xa3) + .maxstack 6 + .locals init ([0] float64[] arr, + [1] native int p, + [2] float64& pinned V_2, + [3] native int V_3, + [4] int32 V_4, + [5] native int V_5, + [6] int32 V_6) + IL_0000: nop + IL_0001: ldc.i4.6 + IL_0002: newarr [mscorlib]System.Double + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.r8 0.0 + IL_0012: stelem [mscorlib]System.Double + IL_0017: dup + IL_0018: ldc.i4.1 + IL_0019: ldc.r8 1.5 + IL_0022: stelem [mscorlib]System.Double + IL_0027: dup + IL_0028: ldc.i4.2 + IL_0029: ldc.r8 2.2999999999999998 + IL_0032: stelem [mscorlib]System.Double + IL_0037: dup + IL_0038: ldc.i4.3 + IL_0039: ldc.r8 3.3999999999999999 + IL_0042: stelem [mscorlib]System.Double + IL_0047: dup + IL_0048: ldc.i4.4 + IL_0049: ldc.r8 4. + IL_0052: stelem [mscorlib]System.Double + IL_0057: dup + IL_0058: ldc.i4.5 + IL_0059: ldc.r8 5.9000000000000004 + IL_0062: stelem [mscorlib]System.Double + IL_0067: stloc.0 + IL_0068: ldloc.0 + IL_0069: ldc.i4.0 + IL_006a: ldelema [mscorlib]System.Double + IL_006f: stloc.2 + IL_0070: ldloc.2 + IL_0071: conv.i + IL_0072: stloc.1 + IL_0073: ldloc.1 + IL_0074: stloc.3 + IL_0075: ldc.i4.0 + IL_0076: stloc.s V_4 + IL_0078: ldloc.3 + IL_0079: ldloc.s V_4 + IL_007b: conv.i + IL_007c: sizeof [mscorlib]System.Double + IL_0082: mul + IL_0083: add + IL_0084: ldobj [mscorlib]System.Double + IL_0089: ldloc.1 + IL_008a: stloc.s V_5 + IL_008c: ldc.i4.1 + IL_008d: stloc.s V_6 + IL_008f: ldloc.s V_5 + IL_0091: ldloc.s V_6 + IL_0093: conv.i + IL_0094: sizeof [mscorlib]System.Double + IL_009a: mul + IL_009b: add + IL_009c: ldobj [mscorlib]System.Double + IL_00a1: add + IL_00a2: ret + } // end of method TestFunction24::pinArray2 + + .method public static class [mscorlib]System.Tuple`2 + pinString() cil managed + { + // Code size 82 (0x52) + .maxstack 6 + .locals init ([0] string str, + [1] native int pChar, + [2] string pinned V_2, + [3] native int V_3, + [4] int32 V_4, + [5] native int V_5, + [6] int32 V_6) + IL_0000: nop + IL_0001: ldstr "Hello World" + IL_0006: stloc.0 + IL_0007: ldloc.0 + IL_0008: stloc.2 + IL_0009: ldloc.2 + IL_000a: brfalse.s IL_000e + + IL_000c: br.s IL_0010 + + IL_000e: br.s IL_001b + + IL_0010: ldloc.2 + IL_0011: conv.i + IL_0012: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() + IL_0017: add + IL_0018: nop + IL_0019: br.s IL_001d + + IL_001b: ldloc.2 + IL_001c: nop + IL_001d: stloc.1 + IL_001e: ldloc.1 + IL_001f: stloc.3 + IL_0020: ldc.i4.0 + IL_0021: stloc.s V_4 + IL_0023: ldloc.3 + IL_0024: ldloc.s V_4 + IL_0026: conv.i + IL_0027: sizeof [mscorlib]System.Char + IL_002d: mul + IL_002e: add + IL_002f: ldobj [mscorlib]System.Char + IL_0034: ldloc.1 + IL_0035: stloc.s V_5 + IL_0037: ldc.i4.1 + IL_0038: stloc.s V_6 + IL_003a: ldloc.s V_5 + IL_003c: ldloc.s V_6 + IL_003e: conv.i + IL_003f: sizeof [mscorlib]System.Char + IL_0045: mul + IL_0046: add + IL_0047: ldobj [mscorlib]System.Char + IL_004c: newobj instance void class [mscorlib]System.Tuple`2::.ctor(!0, + !1) + IL_0051: ret + } // end of method TestFunction24::pinString + +} // end of class TestFunction24 + +.class private abstract auto ansi sealed ''.$TestFunction24 + extends [mscorlib]System.Object +{ + .method public static void main@() cil managed + { + .entrypoint + // Code size 2 (0x2) + .maxstack 8 + IL_0000: nop + IL_0001: ret + } // end of method $TestFunction24::main@ + +} // end of class ''.$TestFunction24 + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** +// WARNING: Created Win32 resource file TestFunction24.il.netfx4.res diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs new file mode 100644 index 00000000000..eb297d2f636 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs @@ -0,0 +1,32 @@ +open FSharp.NativeInterop +// Assume that the following class exists. + +type Point = { mutable x : int; mutable y : int } + +let pinObject() = + let point = { x = 1; y = 2 } + use p1 = fixed &point.x // note, fixed is a keyword and would be highlighted + NativePtr.get p1 0 + NativePtr.get p1 1 + +let pinRef() = + let point = ref 17 + use p1 = fixed &point.contents // note, fixed is a keyword and would be highlighted + NativePtr.read p1 + NativePtr.read p1 + +let pinArray1() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + use p1 = fixed arr + NativePtr.get p1 0 + NativePtr.get p1 1 + +let pinArray2() = + let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] + // You can initialize a pointer by using the address of a variable. + use p = fixed &arr.[0] + NativePtr.get p 0 + NativePtr.get p 1 + +let pinString() = + let str = "Hello World" + // The following assignment initializes p by using a string. + use pChar = fixed str + NativePtr.get pChar 0, NativePtr.get pChar 1 + diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl new file mode 100644 index 00000000000..181c7175055 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl @@ -0,0 +1,772 @@ + +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Copyright (c) Microsoft Corporation. All rights reserved. + + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:4:1:0 +} +.assembly TestFunction25 +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + + // --- The following custom attribute is added automatically, do not uncomment ------- + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) + + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.TestFunction25 +{ + // Offset: 0x00000000 Length: 0x0000075B + // WARNING: managed resource file FSharpSignatureData.TestFunction25 created +} +.mresource public FSharpOptimizationData.TestFunction25 +{ + // Offset: 0x00000760 Length: 0x000003D2 + // WARNING: managed resource file FSharpOptimizationData.TestFunction25 created +} +.module TestFunction25.exe +// MVID: {5769538F-A643-4662-A745-03838F536957} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x01400000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed TestFunction25 + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) + .class auto ansi serializable sealed nested public Point + extends [mscorlib]System.Object + implements class [mscorlib]System.IEquatable`1, + [mscorlib]System.Collections.IStructuralEquatable, + class [mscorlib]System.IComparable`1, + [mscorlib]System.IComparable, + [mscorlib]System.Collections.IStructuralComparable + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 02 00 00 00 00 00 ) + .field public int32 x@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .field public int32 y@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .method public hidebysig specialname + instance int32 get_x() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 TestFunction25/Point::x@ + IL_0006: ret + } // end of method Point::get_x + + .method public hidebysig specialname + instance int32 get_y() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldfld int32 TestFunction25/Point::y@ + IL_0006: ret + } // end of method Point::get_y + + .method public hidebysig specialname + instance void set_x(int32 'value') cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: stfld int32 TestFunction25/Point::x@ + IL_0007: ret + } // end of method Point::set_x + + .method public hidebysig specialname + instance void set_y(int32 'value') cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: stfld int32 TestFunction25/Point::y@ + IL_0007: ret + } // end of method Point::set_y + + .method public specialname rtspecialname + instance void .ctor(int32 x, + int32 y) cil managed + { + // Code size 21 (0x15) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [mscorlib]System.Object::.ctor() + IL_0006: ldarg.0 + IL_0007: ldarg.1 + IL_0008: stfld int32 TestFunction25/Point::x@ + IL_000d: ldarg.0 + IL_000e: ldarg.2 + IL_000f: stfld int32 TestFunction25/Point::y@ + IL_0014: ret + } // end of method Point::.ctor + + .method public hidebysig virtual final + instance int32 CompareTo(class TestFunction25/Point obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 102 (0x66) + .maxstack 4 + .locals init (int32 V_0, + class [mscorlib]System.Collections.IComparer V_1, + int32 V_2, + int32 V_3) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_005c + + IL_0007: ldarg.1 + IL_0008: ldnull + IL_0009: cgt.un + IL_000b: brfalse.s IL_005a + + IL_000d: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0012: stloc.1 + IL_0013: ldarg.0 + IL_0014: ldfld int32 TestFunction25/Point::x@ + IL_0019: stloc.2 + IL_001a: ldarg.1 + IL_001b: ldfld int32 TestFunction25/Point::x@ + IL_0020: stloc.3 + IL_0021: ldloc.2 + IL_0022: ldloc.3 + IL_0023: bge.s IL_0029 + + IL_0025: ldc.i4.m1 + IL_0026: nop + IL_0027: br.s IL_002e + + IL_0029: ldloc.2 + IL_002a: ldloc.3 + IL_002b: cgt + IL_002d: nop + IL_002e: stloc.0 + IL_002f: ldloc.0 + IL_0030: ldc.i4.0 + IL_0031: bge.s IL_0035 + + IL_0033: ldloc.0 + IL_0034: ret + + IL_0035: ldloc.0 + IL_0036: ldc.i4.0 + IL_0037: ble.s IL_003b + + IL_0039: ldloc.0 + IL_003a: ret + + IL_003b: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() + IL_0040: stloc.1 + IL_0041: ldarg.0 + IL_0042: ldfld int32 TestFunction25/Point::y@ + IL_0047: stloc.2 + IL_0048: ldarg.1 + IL_0049: ldfld int32 TestFunction25/Point::y@ + IL_004e: stloc.3 + IL_004f: ldloc.2 + IL_0050: ldloc.3 + IL_0051: bge.s IL_0055 + + IL_0053: ldc.i4.m1 + IL_0054: ret + + IL_0055: ldloc.2 + IL_0056: ldloc.3 + IL_0057: cgt + IL_0059: ret + + IL_005a: ldc.i4.1 + IL_005b: ret + + IL_005c: ldarg.1 + IL_005d: ldnull + IL_005e: cgt.un + IL_0060: brfalse.s IL_0064 + + IL_0062: ldc.i4.m1 + IL_0063: ret + + IL_0064: ldc.i4.0 + IL_0065: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 14 (0xe) + .maxstack 8 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldarg.1 + IL_0003: unbox.any TestFunction25/Point + IL_0008: callvirt instance int32 TestFunction25/Point::CompareTo(class TestFunction25/Point) + IL_000d: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 CompareTo(object obj, + class [mscorlib]System.Collections.IComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 107 (0x6b) + .maxstack 4 + .locals init ([0] class TestFunction25/Point V_0, + [1] int32 V_1, + [2] int32 V_2, + [3] int32 V_3) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: unbox.any TestFunction25/Point + IL_0007: stloc.0 + IL_0008: ldarg.0 + IL_0009: ldnull + IL_000a: cgt.un + IL_000c: brfalse.s IL_005c + + IL_000e: ldarg.1 + IL_000f: unbox.any TestFunction25/Point + IL_0014: ldnull + IL_0015: cgt.un + IL_0017: brfalse.s IL_005a + + IL_0019: ldarg.0 + IL_001a: ldfld int32 TestFunction25/Point::x@ + IL_001f: stloc.2 + IL_0020: ldloc.0 + IL_0021: ldfld int32 TestFunction25/Point::x@ + IL_0026: stloc.3 + IL_0027: ldloc.2 + IL_0028: ldloc.3 + IL_0029: bge.s IL_002f + + IL_002b: ldc.i4.m1 + IL_002c: nop + IL_002d: br.s IL_0034 + + IL_002f: ldloc.2 + IL_0030: ldloc.3 + IL_0031: cgt + IL_0033: nop + IL_0034: stloc.1 + IL_0035: ldloc.1 + IL_0036: ldc.i4.0 + IL_0037: bge.s IL_003b + + IL_0039: ldloc.1 + IL_003a: ret + + IL_003b: ldloc.1 + IL_003c: ldc.i4.0 + IL_003d: ble.s IL_0041 + + IL_003f: ldloc.1 + IL_0040: ret + + IL_0041: ldarg.0 + IL_0042: ldfld int32 TestFunction25/Point::y@ + IL_0047: stloc.2 + IL_0048: ldloc.0 + IL_0049: ldfld int32 TestFunction25/Point::y@ + IL_004e: stloc.3 + IL_004f: ldloc.2 + IL_0050: ldloc.3 + IL_0051: bge.s IL_0055 + + IL_0053: ldc.i4.m1 + IL_0054: ret + + IL_0055: ldloc.2 + IL_0056: ldloc.3 + IL_0057: cgt + IL_0059: ret + + IL_005a: ldc.i4.1 + IL_005b: ret + + IL_005c: ldarg.1 + IL_005d: unbox.any TestFunction25/Point + IL_0062: ldnull + IL_0063: cgt.un + IL_0065: brfalse.s IL_0069 + + IL_0067: ldc.i4.m1 + IL_0068: ret + + IL_0069: ldc.i4.0 + IL_006a: ret + } // end of method Point::CompareTo + + .method public hidebysig virtual final + instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 55 (0x37) + .maxstack 7 + .locals init (int32 V_0) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0035 + + IL_0007: ldc.i4.0 + IL_0008: stloc.0 + IL_0009: ldc.i4 0x9e3779b9 + IL_000e: ldarg.0 + IL_000f: ldfld int32 TestFunction25/Point::y@ + IL_0014: ldloc.0 + IL_0015: ldc.i4.6 + IL_0016: shl + IL_0017: ldloc.0 + IL_0018: ldc.i4.2 + IL_0019: shr + IL_001a: add + IL_001b: add + IL_001c: add + IL_001d: stloc.0 + IL_001e: ldc.i4 0x9e3779b9 + IL_0023: ldarg.0 + IL_0024: ldfld int32 TestFunction25/Point::x@ + IL_0029: ldloc.0 + IL_002a: ldc.i4.6 + IL_002b: shl + IL_002c: ldloc.0 + IL_002d: ldc.i4.2 + IL_002e: shr + IL_002f: add + IL_0030: add + IL_0031: add + IL_0032: stloc.0 + IL_0033: ldloc.0 + IL_0034: ret + + IL_0035: ldc.i4.0 + IL_0036: ret + } // end of method Point::GetHashCode + + .method public hidebysig virtual final + instance int32 GetHashCode() cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 13 (0xd) + .maxstack 8 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() + IL_0007: callvirt instance int32 TestFunction25/Point::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) + IL_000c: ret + } // end of method Point::GetHashCode + + .method public hidebysig virtual final + instance bool Equals(object obj, + class [mscorlib]System.Collections.IEqualityComparer comp) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 58 (0x3a) + .maxstack 4 + .locals init (class TestFunction25/Point V_0) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_0032 + + IL_0007: ldarg.1 + IL_0008: isinst TestFunction25/Point + IL_000d: stloc.0 + IL_000e: ldloc.0 + IL_000f: brfalse.s IL_0030 + + IL_0011: ldarg.0 + IL_0012: ldfld int32 TestFunction25/Point::x@ + IL_0017: ldloc.0 + IL_0018: ldfld int32 TestFunction25/Point::x@ + IL_001d: bne.un.s IL_002e + + IL_001f: ldarg.0 + IL_0020: ldfld int32 TestFunction25/Point::y@ + IL_0025: ldloc.0 + IL_0026: ldfld int32 TestFunction25/Point::y@ + IL_002b: ceq + IL_002d: ret + + IL_002e: ldc.i4.0 + IL_002f: ret + + IL_0030: ldc.i4.0 + IL_0031: ret + + IL_0032: ldarg.1 + IL_0033: ldnull + IL_0034: cgt.un + IL_0036: ldc.i4.0 + IL_0037: ceq + IL_0039: ret + } // end of method Point::Equals + + .method public hidebysig virtual final + instance bool Equals(class TestFunction25/Point obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 54 (0x36) + .maxstack 8 + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: ldnull + IL_0003: cgt.un + IL_0005: brfalse.s IL_002e + + IL_0007: ldarg.1 + IL_0008: ldnull + IL_0009: cgt.un + IL_000b: brfalse.s IL_002c + + IL_000d: ldarg.0 + IL_000e: ldfld int32 TestFunction25/Point::x@ + IL_0013: ldarg.1 + IL_0014: ldfld int32 TestFunction25/Point::x@ + IL_0019: bne.un.s IL_002a + + IL_001b: ldarg.0 + IL_001c: ldfld int32 TestFunction25/Point::y@ + IL_0021: ldarg.1 + IL_0022: ldfld int32 TestFunction25/Point::y@ + IL_0027: ceq + IL_0029: ret + + IL_002a: ldc.i4.0 + IL_002b: ret + + IL_002c: ldc.i4.0 + IL_002d: ret + + IL_002e: ldarg.1 + IL_002f: ldnull + IL_0030: cgt.un + IL_0032: ldc.i4.0 + IL_0033: ceq + IL_0035: ret + } // end of method Point::Equals + + .method public hidebysig virtual final + instance bool Equals(object obj) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 21 (0x15) + .maxstack 4 + .locals init (class TestFunction25/Point V_0) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: isinst TestFunction25/Point + IL_0007: stloc.0 + IL_0008: ldloc.0 + IL_0009: brfalse.s IL_0013 + + IL_000b: ldarg.0 + IL_000c: ldloc.0 + IL_000d: callvirt instance bool TestFunction25/Point::Equals(class TestFunction25/Point) + IL_0012: ret + + IL_0013: ldc.i4.0 + IL_0014: ret + } // end of method Point::Equals + + .property instance int32 x() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32) = ( 01 00 04 00 00 00 00 00 00 00 00 00 ) + .set instance void TestFunction25/Point::set_x(int32) + .get instance int32 TestFunction25/Point::get_x() + } // end of property Point::x + .property instance int32 y() + { + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, + int32) = ( 01 00 04 00 00 00 01 00 00 00 00 00 ) + .set instance void TestFunction25/Point::set_y(int32) + .get instance int32 TestFunction25/Point::get_y() + } // end of property Point::y + } // end of class Point + + .method public static int32 pinObject() cil managed + { + // Code size 53 (0x35) + .maxstack 6 + .locals init ([0] class TestFunction25/Point point, + [1] native int p1, + [2] int32& pinned V_2) + IL_0000: nop + IL_0001: ldc.i4.1 + IL_0002: ldc.i4.2 + IL_0003: newobj instance void TestFunction25/Point::.ctor(int32, + int32) + IL_0008: stloc.0 + IL_0009: ldloc.0 + IL_000a: ldflda int32 TestFunction25/Point::x@ + IL_000f: stloc.2 + IL_0010: ldloc.2 + IL_0011: conv.i + IL_0012: stloc.1 + IL_0013: ldloc.1 + IL_0014: ldc.i4.0 + IL_0015: conv.i + IL_0016: sizeof [mscorlib]System.Int32 + IL_001c: mul + IL_001d: add + IL_001e: ldobj [mscorlib]System.Int32 + IL_0023: ldloc.1 + IL_0024: ldc.i4.1 + IL_0025: conv.i + IL_0026: sizeof [mscorlib]System.Int32 + IL_002c: mul + IL_002d: add + IL_002e: ldobj [mscorlib]System.Int32 + IL_0033: add + IL_0034: ret + } // end of method TestFunction25::pinObject + + .method public static int32 pinRef() cil managed + { + // Code size 33 (0x21) + .maxstack 4 + .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 point, + [1] native int p1, + [2] int32& pinned V_2) + IL_0000: nop + IL_0001: ldc.i4.s 17 + IL_0003: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::.ctor(!0) + IL_0008: stloc.0 + IL_0009: ldloc.0 + IL_000a: ldflda !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::contents@ + IL_000f: stloc.2 + IL_0010: ldloc.2 + IL_0011: conv.i + IL_0012: stloc.1 + IL_0013: ldloc.1 + IL_0014: ldobj [mscorlib]System.Int32 + IL_0019: ldloc.1 + IL_001a: ldobj [mscorlib]System.Int32 + IL_001f: add + IL_0020: ret + } // end of method TestFunction25::pinRef + + .method public static float64 pinArray1() cil managed + { + // Code size 168 (0xa8) + .maxstack 6 + .locals init ([0] float64[] arr, + [1] native int p1, + [2] float64& pinned V_2) + IL_0000: nop + IL_0001: ldc.i4.6 + IL_0002: newarr [mscorlib]System.Double + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.r8 0.0 + IL_0012: stelem [mscorlib]System.Double + IL_0017: dup + IL_0018: ldc.i4.1 + IL_0019: ldc.r8 1.5 + IL_0022: stelem [mscorlib]System.Double + IL_0027: dup + IL_0028: ldc.i4.2 + IL_0029: ldc.r8 2.2999999999999998 + IL_0032: stelem [mscorlib]System.Double + IL_0037: dup + IL_0038: ldc.i4.3 + IL_0039: ldc.r8 3.3999999999999999 + IL_0042: stelem [mscorlib]System.Double + IL_0047: dup + IL_0048: ldc.i4.4 + IL_0049: ldc.r8 4. + IL_0052: stelem [mscorlib]System.Double + IL_0057: dup + IL_0058: ldc.i4.5 + IL_0059: ldc.r8 5.9000000000000004 + IL_0062: stelem [mscorlib]System.Double + IL_0067: stloc.0 + IL_0068: ldloc.0 + IL_0069: brfalse.s IL_0082 + + IL_006b: ldloc.0 + IL_006c: ldlen + IL_006d: conv.i4 + IL_006e: brfalse.s IL_007d + + IL_0070: ldloc.0 + IL_0071: ldc.i4.0 + IL_0072: ldelema [mscorlib]System.Double + IL_0077: stloc.2 + IL_0078: ldloc.2 + IL_0079: conv.i + IL_007a: nop + IL_007b: br.s IL_0085 + + IL_007d: ldc.i4.0 + IL_007e: conv.i + IL_007f: nop + IL_0080: br.s IL_0085 + + IL_0082: ldc.i4.0 + IL_0083: conv.i + IL_0084: nop + IL_0085: stloc.1 + IL_0086: ldloc.1 + IL_0087: ldc.i4.0 + IL_0088: conv.i + IL_0089: sizeof [mscorlib]System.Double + IL_008f: mul + IL_0090: add + IL_0091: ldobj [mscorlib]System.Double + IL_0096: ldloc.1 + IL_0097: ldc.i4.1 + IL_0098: conv.i + IL_0099: sizeof [mscorlib]System.Double + IL_009f: mul + IL_00a0: add + IL_00a1: ldobj [mscorlib]System.Double + IL_00a6: add + IL_00a7: ret + } // end of method TestFunction25::pinArray1 + + .method public static float64 pinArray2() cil managed + { + // Code size 149 (0x95) + .maxstack 6 + .locals init ([0] float64[] arr, + [1] native int p, + [2] float64& pinned V_2) + IL_0000: nop + IL_0001: ldc.i4.6 + IL_0002: newarr [mscorlib]System.Double + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.r8 0.0 + IL_0012: stelem [mscorlib]System.Double + IL_0017: dup + IL_0018: ldc.i4.1 + IL_0019: ldc.r8 1.5 + IL_0022: stelem [mscorlib]System.Double + IL_0027: dup + IL_0028: ldc.i4.2 + IL_0029: ldc.r8 2.2999999999999998 + IL_0032: stelem [mscorlib]System.Double + IL_0037: dup + IL_0038: ldc.i4.3 + IL_0039: ldc.r8 3.3999999999999999 + IL_0042: stelem [mscorlib]System.Double + IL_0047: dup + IL_0048: ldc.i4.4 + IL_0049: ldc.r8 4. + IL_0052: stelem [mscorlib]System.Double + IL_0057: dup + IL_0058: ldc.i4.5 + IL_0059: ldc.r8 5.9000000000000004 + IL_0062: stelem [mscorlib]System.Double + IL_0067: stloc.0 + IL_0068: ldloc.0 + IL_0069: ldc.i4.0 + IL_006a: ldelema [mscorlib]System.Double + IL_006f: stloc.2 + IL_0070: ldloc.2 + IL_0071: conv.i + IL_0072: stloc.1 + IL_0073: ldloc.1 + IL_0074: ldc.i4.0 + IL_0075: conv.i + IL_0076: sizeof [mscorlib]System.Double + IL_007c: mul + IL_007d: add + IL_007e: ldobj [mscorlib]System.Double + IL_0083: ldloc.1 + IL_0084: ldc.i4.1 + IL_0085: conv.i + IL_0086: sizeof [mscorlib]System.Double + IL_008c: mul + IL_008d: add + IL_008e: ldobj [mscorlib]System.Double + IL_0093: add + IL_0094: ret + } // end of method TestFunction25::pinArray2 + + .method public static class [mscorlib]System.Tuple`2 + pinString() cil managed + { + // Code size 58 (0x3a) + .maxstack 6 + .locals init ([0] native int pChar, + [1] string pinned V_1) + IL_0000: nop + IL_0001: ldstr "Hello World" + IL_0006: stloc.1 + IL_0007: ldstr "Hello World" + IL_000c: conv.i + IL_000d: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() + IL_0012: add + IL_0013: stloc.0 + IL_0014: ldloc.0 + IL_0015: ldc.i4.0 + IL_0016: conv.i + IL_0017: sizeof [mscorlib]System.Char + IL_001d: mul + IL_001e: add + IL_001f: ldobj [mscorlib]System.Char + IL_0024: ldloc.0 + IL_0025: ldc.i4.1 + IL_0026: conv.i + IL_0027: sizeof [mscorlib]System.Char + IL_002d: mul + IL_002e: add + IL_002f: ldobj [mscorlib]System.Char + IL_0034: newobj instance void class [mscorlib]System.Tuple`2::.ctor(!0, + !1) + IL_0039: ret + } // end of method TestFunction25::pinString + +} // end of class TestFunction25 + +.class private abstract auto ansi sealed ''.$TestFunction25 + extends [mscorlib]System.Object +{ + .method public static void main@() cil managed + { + .entrypoint + // Code size 2 (0x2) + .maxstack 8 + IL_0000: nop + IL_0001: ret + } // end of method $TestFunction25::main@ + +} // end of class ''.$TestFunction25 + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** +// WARNING: Created Win32 resource file TestFunction25.il.netfx4.res diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs index 1f82f6b7048..eb297d2f636 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/Testfunction24.fs @@ -1,3 +1,4 @@ +open FSharp.NativeInterop // Assume that the following class exists. type Point = { mutable x : int; mutable y : int } @@ -5,27 +6,27 @@ type Point = { mutable x : int; mutable y : int } let pinObject() = let point = { x = 1; y = 2 } use p1 = fixed &point.x // note, fixed is a keyword and would be highlighted - () + NativePtr.get p1 0 + NativePtr.get p1 1 let pinRef() = - let point = ref 1 + let point = ref 17 use p1 = fixed &point.contents // note, fixed is a keyword and would be highlighted - () + NativePtr.read p1 + NativePtr.read p1 let pinArray1() = let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] use p1 = fixed arr - () + NativePtr.get p1 0 + NativePtr.get p1 1 let pinArray2() = let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] // You can initialize a pointer by using the address of a variable. use p = fixed &arr.[0] - () + NativePtr.get p 0 + NativePtr.get p 1 let pinString() = let str = "Hello World" // The following assignment initializes p by using a string. use pChar = fixed str - () - // some code that uses pChar, which has type char* + NativePtr.get pChar 0, NativePtr.get pChar 1 + diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index fb6a949b63a..dcefb74b988 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -44,3 +44,4 @@ SOURCE=TestFunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 + SOURCE=TestFunction25.fs SCFLAGS="-g --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction25.exe NetFx40" # TestFunction25.fs - NetFx40 From daffe337863cd718bb7b59a0a8921640a1a3f1e2 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 22:09:17 +0100 Subject: [PATCH 301/334] update baseline --- .../TestFunction24.il.netfx4.bsl | 58 +++++++++++++++++-- .../TestFunction25.il.netfx4.bsl | 27 +++++++-- 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl index 171d1faa640..244989e3132 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction24.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -30,21 +30,19 @@ .mresource public FSharpSignatureData.TestFunction24 { // Offset: 0x00000000 Length: 0x0000075B - // WARNING: managed resource file FSharpSignatureData.TestFunction24 created } .mresource public FSharpOptimizationData.TestFunction24 { // Offset: 0x00000760 Length: 0x00000228 - // WARNING: managed resource file FSharpOptimizationData.TestFunction24 created } .module TestFunction24.exe -// MVID: {5769535C-A643-4587-A745-03835C536957} +// MVID: {5769ACB2-A643-4587-A745-0383B2AC6957} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x00890000 +// Image base: 0x007A0000 // =============== CLASS MEMBERS DECLARATION =================== @@ -253,6 +251,8 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) .maxstack 8 + .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' + .line 4,4 : 6,11 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction24.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -277,6 +277,7 @@ [6] class [mscorlib]System.Collections.IComparer V_6, [7] int32 V_7, [8] int32 V_8) + .line 4,4 : 6,11 '' IL_0000: nop IL_0001: ldarg.1 IL_0002: unbox.any TestFunction24/Point @@ -292,6 +293,7 @@ IL_0012: br IL_008d + .line 16707566,16707566 : 0,0 '' IL_0017: ldarg.1 IL_0018: unbox.any TestFunction24/Point IL_001d: ldnull @@ -302,6 +304,7 @@ IL_0024: br IL_008b + .line 16707566,16707566 : 0,0 '' IL_0029: ldarg.2 IL_002a: stloc.3 IL_002b: ldarg.0 @@ -318,14 +321,19 @@ IL_0043: br.s IL_0049 + .line 16707566,16707566 : 0,0 '' IL_0045: ldc.i4.m1 + .line 16707566,16707566 : 0,0 '' IL_0046: nop IL_0047: br.s IL_0050 + .line 16707566,16707566 : 0,0 '' IL_0049: ldloc.s V_4 IL_004b: ldloc.s V_5 IL_004d: cgt + .line 16707566,16707566 : 0,0 '' IL_004f: nop + .line 16707566,16707566 : 0,0 '' IL_0050: stloc.2 IL_0051: ldloc.2 IL_0052: ldc.i4.0 @@ -335,9 +343,11 @@ IL_0057: br.s IL_005b + .line 16707566,16707566 : 0,0 '' IL_0059: ldloc.2 IL_005a: ret + .line 16707566,16707566 : 0,0 '' IL_005b: ldloc.2 IL_005c: ldc.i4.0 IL_005d: ble.s IL_0061 @@ -346,9 +356,11 @@ IL_0061: br.s IL_0065 + .line 16707566,16707566 : 0,0 '' IL_0063: ldloc.2 IL_0064: ret + .line 16707566,16707566 : 0,0 '' IL_0065: ldarg.2 IL_0066: stloc.s V_6 IL_0068: ldarg.0 @@ -365,17 +377,21 @@ IL_0080: br.s IL_0084 + .line 16707566,16707566 : 0,0 '' IL_0082: ldc.i4.m1 IL_0083: ret + .line 16707566,16707566 : 0,0 '' IL_0084: ldloc.s V_7 IL_0086: ldloc.s V_8 IL_0088: cgt IL_008a: ret + .line 16707566,16707566 : 0,0 '' IL_008b: ldc.i4.1 IL_008c: ret + .line 16707566,16707566 : 0,0 '' IL_008d: ldarg.1 IL_008e: unbox.any TestFunction24/Point IL_0093: ldnull @@ -386,9 +402,11 @@ IL_009a: br.s IL_009e + .line 16707566,16707566 : 0,0 '' IL_009c: ldc.i4.m1 IL_009d: ret + .line 16707566,16707566 : 0,0 '' IL_009e: ldc.i4.0 IL_009f: ret } // end of method Point::CompareTo @@ -457,6 +475,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 13 (0xd) .maxstack 8 + .line 4,4 : 6,11 '' IL_0000: nop IL_0001: ldarg.0 IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() @@ -643,18 +662,21 @@ [4] int32 V_4, [5] native int V_5, [6] int32 V_6) + .line 7,7 : 5,33 '' IL_0000: nop IL_0001: ldc.i4.1 IL_0002: ldc.i4.2 IL_0003: newobj instance void TestFunction24/Point::.ctor(int32, int32) IL_0008: stloc.0 + .line 8,8 : 5,28 '' IL_0009: ldloc.0 IL_000a: ldflda int32 TestFunction24/Point::x@ IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: conv.i IL_0012: stloc.1 + .line 9,9 : 5,44 '' IL_0013: ldloc.1 IL_0014: stloc.3 IL_0015: ldc.i4.0 @@ -688,16 +710,19 @@ .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 point, [1] native int p1, [2] int32& pinned V_2) + .line 12,12 : 5,23 '' IL_0000: nop IL_0001: ldc.i4.s 17 IL_0003: call class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 [FSharp.Core]Microsoft.FSharp.Core.Operators::Ref(!!0) IL_0008: stloc.0 + .line 13,13 : 5,35 '' IL_0009: ldloc.0 IL_000a: ldflda !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::contents@ IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: conv.i IL_0012: stloc.1 + .line 14,14 : 5,42 '' IL_0013: ldloc.1 IL_0014: ldobj [mscorlib]System.Int32 IL_0019: ldloc.1 @@ -718,6 +743,7 @@ [5] int32 V_5, [6] native int V_6, [7] int32 V_7) + .line 17,17 : 5,49 '' IL_0000: nop IL_0001: ldc.i4.6 IL_0002: newarr [mscorlib]System.Double @@ -746,6 +772,7 @@ IL_0059: ldc.r8 5.9000000000000004 IL_0062: stelem [mscorlib]System.Double IL_0067: stloc.0 + .line 18,18 : 5,23 '' IL_0068: ldloc.0 IL_0069: stloc.2 IL_006a: ldloc.2 @@ -755,6 +782,7 @@ IL_006f: br.s IL_008f + .line 16707566,16707566 : 0,0 '' IL_0071: ldloc.2 IL_0072: call int32 [FSharp.Core]Microsoft.FSharp.Collections.ArrayModule::Length(!!0[]) IL_0077: brfalse.s IL_007b @@ -763,24 +791,32 @@ IL_007b: br.s IL_008a + .line 16707566,16707566 : 0,0 '' IL_007d: ldloc.2 IL_007e: ldc.i4.0 IL_007f: ldelema [mscorlib]System.Double IL_0084: stloc.3 IL_0085: ldloc.3 IL_0086: conv.i + .line 16707566,16707566 : 0,0 '' IL_0087: nop IL_0088: br.s IL_0092 + .line 16707566,16707566 : 0,0 '' IL_008a: ldc.i4.0 IL_008b: conv.i + .line 16707566,16707566 : 0,0 '' IL_008c: nop IL_008d: br.s IL_0092 + .line 16707566,16707566 : 0,0 '' IL_008f: ldc.i4.0 IL_0090: conv.i + .line 16707566,16707566 : 0,0 '' IL_0091: nop + .line 16707566,16707566 : 0,0 '' IL_0092: stloc.1 + .line 19,19 : 5,44 '' IL_0093: ldloc.1 IL_0094: stloc.s V_4 IL_0096: ldc.i4.0 @@ -818,6 +854,7 @@ [4] int32 V_4, [5] native int V_5, [6] int32 V_6) + .line 22,22 : 5,49 '' IL_0000: nop IL_0001: ldc.i4.6 IL_0002: newarr [mscorlib]System.Double @@ -846,6 +883,7 @@ IL_0059: ldc.r8 5.9000000000000004 IL_0062: stelem [mscorlib]System.Double IL_0067: stloc.0 + .line 24,24 : 5,27 '' IL_0068: ldloc.0 IL_0069: ldc.i4.0 IL_006a: ldelema [mscorlib]System.Double @@ -853,6 +891,7 @@ IL_0070: ldloc.2 IL_0071: conv.i IL_0072: stloc.1 + .line 25,25 : 5,42 '' IL_0073: ldloc.1 IL_0074: stloc.3 IL_0075: ldc.i4.0 @@ -891,9 +930,11 @@ [4] int32 V_4, [5] native int V_5, [6] int32 V_6) + .line 28,28 : 5,28 '' IL_0000: nop IL_0001: ldstr "Hello World" IL_0006: stloc.0 + .line 30,30 : 5,26 '' IL_0007: ldloc.0 IL_0008: stloc.2 IL_0009: ldloc.2 @@ -903,16 +944,22 @@ IL_000e: br.s IL_001b + .line 16707566,16707566 : 0,0 '' IL_0010: ldloc.2 IL_0011: conv.i IL_0012: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() IL_0017: add + .line 16707566,16707566 : 0,0 '' IL_0018: nop IL_0019: br.s IL_001d + .line 16707566,16707566 : 0,0 '' IL_001b: ldloc.2 + .line 16707566,16707566 : 0,0 '' IL_001c: nop + .line 16707566,16707566 : 0,0 '' IL_001d: stloc.1 + .line 31,31 : 5,50 '' IL_001e: ldloc.1 IL_001f: stloc.3 IL_0020: ldc.i4.0 @@ -960,4 +1007,3 @@ // ============================================================= // *********** DISASSEMBLY COMPLETE *********************** -// WARNING: Created Win32 resource file TestFunction24.il.netfx4.res diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl index 181c7175055..8eef21c60c1 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl @@ -1,5 +1,5 @@ -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 // Copyright (c) Microsoft Corporation. All rights reserved. @@ -30,21 +30,19 @@ .mresource public FSharpSignatureData.TestFunction25 { // Offset: 0x00000000 Length: 0x0000075B - // WARNING: managed resource file FSharpSignatureData.TestFunction25 created } .mresource public FSharpOptimizationData.TestFunction25 { // Offset: 0x00000760 Length: 0x000003D2 - // WARNING: managed resource file FSharpOptimizationData.TestFunction25 created } .module TestFunction25.exe -// MVID: {5769538F-A643-4662-A745-03838F536957} +// MVID: {5769ACB5-A643-4662-A745-0383B5AC6957} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY -// Image base: 0x01400000 +// Image base: 0x02860000 // =============== CLASS MEMBERS DECLARATION =================== @@ -222,6 +220,8 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) .maxstack 8 + .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' + .line 4,4 : 6,11 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction25.fs' IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 @@ -241,6 +241,7 @@ [1] int32 V_1, [2] int32 V_2, [3] int32 V_3) + .line 4,4 : 6,11 '' IL_0000: nop IL_0001: ldarg.1 IL_0002: unbox.any TestFunction25/Point @@ -377,6 +378,7 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 13 (0xd) .maxstack 8 + .line 4,4 : 6,11 '' IL_0000: nop IL_0001: ldarg.0 IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() @@ -521,18 +523,21 @@ .locals init ([0] class TestFunction25/Point point, [1] native int p1, [2] int32& pinned V_2) + .line 7,7 : 5,33 '' IL_0000: nop IL_0001: ldc.i4.1 IL_0002: ldc.i4.2 IL_0003: newobj instance void TestFunction25/Point::.ctor(int32, int32) IL_0008: stloc.0 + .line 8,8 : 5,28 '' IL_0009: ldloc.0 IL_000a: ldflda int32 TestFunction25/Point::x@ IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: conv.i IL_0012: stloc.1 + .line 9,9 : 5,44 '' IL_0013: ldloc.1 IL_0014: ldc.i4.0 IL_0015: conv.i @@ -558,16 +563,19 @@ .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 point, [1] native int p1, [2] int32& pinned V_2) + .line 12,12 : 5,23 '' IL_0000: nop IL_0001: ldc.i4.s 17 IL_0003: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::.ctor(!0) IL_0008: stloc.0 + .line 13,13 : 5,35 '' IL_0009: ldloc.0 IL_000a: ldflda !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::contents@ IL_000f: stloc.2 IL_0010: ldloc.2 IL_0011: conv.i IL_0012: stloc.1 + .line 14,14 : 5,42 '' IL_0013: ldloc.1 IL_0014: ldobj [mscorlib]System.Int32 IL_0019: ldloc.1 @@ -583,6 +591,7 @@ .locals init ([0] float64[] arr, [1] native int p1, [2] float64& pinned V_2) + .line 17,17 : 5,49 '' IL_0000: nop IL_0001: ldc.i4.6 IL_0002: newarr [mscorlib]System.Double @@ -611,6 +620,7 @@ IL_0059: ldc.r8 5.9000000000000004 IL_0062: stelem [mscorlib]System.Double IL_0067: stloc.0 + .line 18,18 : 5,23 '' IL_0068: ldloc.0 IL_0069: brfalse.s IL_0082 @@ -637,6 +647,7 @@ IL_0083: conv.i IL_0084: nop IL_0085: stloc.1 + .line 19,19 : 5,44 '' IL_0086: ldloc.1 IL_0087: ldc.i4.0 IL_0088: conv.i @@ -662,6 +673,7 @@ .locals init ([0] float64[] arr, [1] native int p, [2] float64& pinned V_2) + .line 22,22 : 5,49 '' IL_0000: nop IL_0001: ldc.i4.6 IL_0002: newarr [mscorlib]System.Double @@ -690,6 +702,7 @@ IL_0059: ldc.r8 5.9000000000000004 IL_0062: stelem [mscorlib]System.Double IL_0067: stloc.0 + .line 24,24 : 5,27 '' IL_0068: ldloc.0 IL_0069: ldc.i4.0 IL_006a: ldelema [mscorlib]System.Double @@ -697,6 +710,7 @@ IL_0070: ldloc.2 IL_0071: conv.i IL_0072: stloc.1 + .line 25,25 : 5,42 '' IL_0073: ldloc.1 IL_0074: ldc.i4.0 IL_0075: conv.i @@ -722,6 +736,7 @@ .maxstack 6 .locals init ([0] native int pChar, [1] string pinned V_1) + .line 30,30 : 5,26 '' IL_0000: nop IL_0001: ldstr "Hello World" IL_0006: stloc.1 @@ -730,6 +745,7 @@ IL_000d: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() IL_0012: add IL_0013: stloc.0 + .line 31,31 : 5,50 '' IL_0014: ldloc.0 IL_0015: ldc.i4.0 IL_0016: conv.i @@ -769,4 +785,3 @@ // ============================================================= // *********** DISASSEMBLY COMPLETE *********************** -// WARNING: Created Win32 resource file TestFunction25.il.netfx4.res From 5c1fa0bfca7ec9d24ec9619137664ad9817ab6bd Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 22:15:03 +0100 Subject: [PATCH 302/334] revert changes to VisualFsharp.sln --- VisualFSharp.sln | 86 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index f83f67999d4..b83bb2c0738 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler", "src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject @@ -120,12 +120,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\It EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpVsix", "vsintegration\VisualFSharpVsix\VisualFSharpVsix.csproj", "{E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D3244A8B-4C62-4247-8DE9-29A32EBA67FB}" - ProjectSection(SolutionItems) = preProject - Performance2.psess = Performance2.psess - Performance3.psess = Performance3.psess - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -136,6 +130,54 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Debug|x86.Build.0 = Debug|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|Any CPU.Build.0 = Proto|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.ActiveCfg = Proto|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Proto|x86.Build.0 = Proto|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|Any CPU.Build.0 = Release|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.ActiveCfg = Release|Any CPU + {4D7BE558-E6BF-44DA-8CE2-46AA6E0DC2E7}.Release|x86.Build.0 = Release|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|Any CPU.Build.0 = Debug|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.ActiveCfg = Debug|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Debug|x86.Build.0 = Debug|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|Any CPU.Build.0 = Proto|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.ActiveCfg = Proto|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Proto|x86.Build.0 = Proto|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.ActiveCfg = Release|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|Any CPU.Build.0 = Release|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.ActiveCfg = Release|Any CPU + {493D19F9-35A4-4D0B-9B25-CA948823B709}.Release|x86.Build.0 = Release|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.ActiveCfg = Debug|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Debug|x86.Build.0 = Debug|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|Any CPU.Build.0 = Proto|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.ActiveCfg = Proto|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Proto|x86.Build.0 = Proto|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|Any CPU.Build.0 = Release|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.ActiveCfg = Release|Any CPU + {530DF8CA-7996-407A-B533-D0C2873257AF}.Release|x86.Build.0 = Release|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.ActiveCfg = Debug|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Debug|x86.Build.0 = Debug|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|Any CPU.Build.0 = Proto|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.ActiveCfg = Proto|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Proto|x86.Build.0 = Proto|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|Any CPU.Build.0 = Release|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.ActiveCfg = Release|Any CPU + {98ABDE09-9E08-49C7-B006-FB3CB5365B54}.Release|x86.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -460,6 +502,18 @@ Global {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.ActiveCfg = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.Build.0 = Release|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|x86.Build.0 = Debug|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.ActiveCfg = Proto|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|Any CPU.Build.0 = Proto|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.ActiveCfg = Proto|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Proto|x86.Build.0 = Proto|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.Build.0 = Release|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.ActiveCfg = Release|Any CPU + {CB7D20C4-6506-406D-9144-5342C3595F03}.Release|x86.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.Build.0 = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -699,6 +753,14 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|Any CPU.Build.0 = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.ActiveCfg = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.Build.0 = Release|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSDebug|x86.Build.0 = VSDebug|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU + {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.VSRelease|x86.Build.0 = VSRelease|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -711,6 +773,14 @@ Global {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|Any CPU.Build.0 = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.ActiveCfg = Release|Any CPU {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.Release|x86.Build.0 = Release|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSDebug|x86.Build.0 = VSDebug|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU + {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090}.VSRelease|x86.Build.0 = VSRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -769,4 +839,4 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} {E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} EndGlobalSection -EndGlobal +EndGlobal \ No newline at end of file From d11d5a9f4fb8a75109607c94baac85a40adcf44a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 22:32:05 +0100 Subject: [PATCH 303/334] Remove Recursive constructor declared on CompilerMessageAttribute --- src/fsharp/FSharp.Core/prim-types.fs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 8ff1a91732b..43531b98838 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -345,7 +345,6 @@ namespace Microsoft.FSharp.Core member x.MessageNumber = messageNumber member x.IsError with get() = isError and set v = isError <- v member x.IsHidden with get() = isHidden and set v = isHidden <- v - new (message, messageNumber) = CompilerMessageAttribute(message, messageNumber) [] [] From 7bb6e681c5d4f82ec7eadadb634084fa0623af1a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 21 Jun 2016 23:41:13 +0100 Subject: [PATCH 304/334] simplify tests --- .../EmittedIL/TestFunctions/TestFunction25.fs | 32 - .../TestFunction25.il.netfx4.bsl | 787 ------------------ .../CodeGen/EmittedIL/TestFunctions/env.lst | 1 - 3 files changed, 820 deletions(-) delete mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs delete mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs deleted file mode 100644 index eb297d2f636..00000000000 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.fs +++ /dev/null @@ -1,32 +0,0 @@ -open FSharp.NativeInterop -// Assume that the following class exists. - -type Point = { mutable x : int; mutable y : int } - -let pinObject() = - let point = { x = 1; y = 2 } - use p1 = fixed &point.x // note, fixed is a keyword and would be highlighted - NativePtr.get p1 0 + NativePtr.get p1 1 - -let pinRef() = - let point = ref 17 - use p1 = fixed &point.contents // note, fixed is a keyword and would be highlighted - NativePtr.read p1 + NativePtr.read p1 - -let pinArray1() = - let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] - use p1 = fixed arr - NativePtr.get p1 0 + NativePtr.get p1 1 - -let pinArray2() = - let arr = [| 0.0; 1.5; 2.3; 3.4; 4.0; 5.9 |] - // You can initialize a pointer by using the address of a variable. - use p = fixed &arr.[0] - NativePtr.get p 0 + NativePtr.get p 1 - -let pinString() = - let str = "Hello World" - // The following assignment initializes p by using a string. - use pChar = fixed str - NativePtr.get pChar 0, NativePtr.get pChar 1 - diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl deleted file mode 100644 index 8eef21c60c1..00000000000 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/TestFunction25.il.netfx4.bsl +++ /dev/null @@ -1,787 +0,0 @@ - -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0 -// Copyright (c) Microsoft Corporation. All rights reserved. - - - -// Metadata version: v4.0.30319 -.assembly extern mscorlib -{ - .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. - .ver 4:0:0:0 -} -.assembly extern FSharp.Core -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 4:4:1:0 -} -.assembly TestFunction25 -{ - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, - int32, - int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) - - // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) - - .hash algorithm 0x00008004 - .ver 0:0:0:0 -} -.mresource public FSharpSignatureData.TestFunction25 -{ - // Offset: 0x00000000 Length: 0x0000075B -} -.mresource public FSharpOptimizationData.TestFunction25 -{ - // Offset: 0x00000760 Length: 0x000003D2 -} -.module TestFunction25.exe -// MVID: {5769ACB5-A643-4662-A745-0383B5AC6957} -.imagebase 0x00400000 -.file alignment 0x00000200 -.stackreserve 0x00100000 -.subsystem 0x0003 // WINDOWS_CUI -.corflags 0x00000001 // ILONLY -// Image base: 0x02860000 - - -// =============== CLASS MEMBERS DECLARATION =================== - -.class public abstract auto ansi sealed TestFunction25 - extends [mscorlib]System.Object -{ - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) - .class auto ansi serializable sealed nested public Point - extends [mscorlib]System.Object - implements class [mscorlib]System.IEquatable`1, - [mscorlib]System.Collections.IStructuralEquatable, - class [mscorlib]System.IComparable`1, - [mscorlib]System.IComparable, - [mscorlib]System.Collections.IStructuralComparable - { - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 02 00 00 00 00 00 ) - .field public int32 x@ - .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) - .field public int32 y@ - .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) - .method public hidebysig specialname - instance int32 get_x() cil managed - { - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldfld int32 TestFunction25/Point::x@ - IL_0006: ret - } // end of method Point::get_x - - .method public hidebysig specialname - instance int32 get_y() cil managed - { - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldfld int32 TestFunction25/Point::y@ - IL_0006: ret - } // end of method Point::get_y - - .method public hidebysig specialname - instance void set_x(int32 'value') cil managed - { - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: stfld int32 TestFunction25/Point::x@ - IL_0007: ret - } // end of method Point::set_x - - .method public hidebysig specialname - instance void set_y(int32 'value') cil managed - { - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: stfld int32 TestFunction25/Point::y@ - IL_0007: ret - } // end of method Point::set_y - - .method public specialname rtspecialname - instance void .ctor(int32 x, - int32 y) cil managed - { - // Code size 21 (0x15) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void [mscorlib]System.Object::.ctor() - IL_0006: ldarg.0 - IL_0007: ldarg.1 - IL_0008: stfld int32 TestFunction25/Point::x@ - IL_000d: ldarg.0 - IL_000e: ldarg.2 - IL_000f: stfld int32 TestFunction25/Point::y@ - IL_0014: ret - } // end of method Point::.ctor - - .method public hidebysig virtual final - instance int32 CompareTo(class TestFunction25/Point obj) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 102 (0x66) - .maxstack 4 - .locals init (int32 V_0, - class [mscorlib]System.Collections.IComparer V_1, - int32 V_2, - int32 V_3) - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldnull - IL_0003: cgt.un - IL_0005: brfalse.s IL_005c - - IL_0007: ldarg.1 - IL_0008: ldnull - IL_0009: cgt.un - IL_000b: brfalse.s IL_005a - - IL_000d: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() - IL_0012: stloc.1 - IL_0013: ldarg.0 - IL_0014: ldfld int32 TestFunction25/Point::x@ - IL_0019: stloc.2 - IL_001a: ldarg.1 - IL_001b: ldfld int32 TestFunction25/Point::x@ - IL_0020: stloc.3 - IL_0021: ldloc.2 - IL_0022: ldloc.3 - IL_0023: bge.s IL_0029 - - IL_0025: ldc.i4.m1 - IL_0026: nop - IL_0027: br.s IL_002e - - IL_0029: ldloc.2 - IL_002a: ldloc.3 - IL_002b: cgt - IL_002d: nop - IL_002e: stloc.0 - IL_002f: ldloc.0 - IL_0030: ldc.i4.0 - IL_0031: bge.s IL_0035 - - IL_0033: ldloc.0 - IL_0034: ret - - IL_0035: ldloc.0 - IL_0036: ldc.i4.0 - IL_0037: ble.s IL_003b - - IL_0039: ldloc.0 - IL_003a: ret - - IL_003b: call class [mscorlib]System.Collections.IComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericComparer() - IL_0040: stloc.1 - IL_0041: ldarg.0 - IL_0042: ldfld int32 TestFunction25/Point::y@ - IL_0047: stloc.2 - IL_0048: ldarg.1 - IL_0049: ldfld int32 TestFunction25/Point::y@ - IL_004e: stloc.3 - IL_004f: ldloc.2 - IL_0050: ldloc.3 - IL_0051: bge.s IL_0055 - - IL_0053: ldc.i4.m1 - IL_0054: ret - - IL_0055: ldloc.2 - IL_0056: ldloc.3 - IL_0057: cgt - IL_0059: ret - - IL_005a: ldc.i4.1 - IL_005b: ret - - IL_005c: ldarg.1 - IL_005d: ldnull - IL_005e: cgt.un - IL_0060: brfalse.s IL_0064 - - IL_0062: ldc.i4.m1 - IL_0063: ret - - IL_0064: ldc.i4.0 - IL_0065: ret - } // end of method Point::CompareTo - - .method public hidebysig virtual final - instance int32 CompareTo(object obj) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 14 (0xe) - .maxstack 8 - .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' - .line 4,4 : 6,11 'C:\\GitHub\\dsyme\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\TestFunctions\\TestFunction25.fs' - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldarg.1 - IL_0003: unbox.any TestFunction25/Point - IL_0008: callvirt instance int32 TestFunction25/Point::CompareTo(class TestFunction25/Point) - IL_000d: ret - } // end of method Point::CompareTo - - .method public hidebysig virtual final - instance int32 CompareTo(object obj, - class [mscorlib]System.Collections.IComparer comp) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 107 (0x6b) - .maxstack 4 - .locals init ([0] class TestFunction25/Point V_0, - [1] int32 V_1, - [2] int32 V_2, - [3] int32 V_3) - .line 4,4 : 6,11 '' - IL_0000: nop - IL_0001: ldarg.1 - IL_0002: unbox.any TestFunction25/Point - IL_0007: stloc.0 - IL_0008: ldarg.0 - IL_0009: ldnull - IL_000a: cgt.un - IL_000c: brfalse.s IL_005c - - IL_000e: ldarg.1 - IL_000f: unbox.any TestFunction25/Point - IL_0014: ldnull - IL_0015: cgt.un - IL_0017: brfalse.s IL_005a - - IL_0019: ldarg.0 - IL_001a: ldfld int32 TestFunction25/Point::x@ - IL_001f: stloc.2 - IL_0020: ldloc.0 - IL_0021: ldfld int32 TestFunction25/Point::x@ - IL_0026: stloc.3 - IL_0027: ldloc.2 - IL_0028: ldloc.3 - IL_0029: bge.s IL_002f - - IL_002b: ldc.i4.m1 - IL_002c: nop - IL_002d: br.s IL_0034 - - IL_002f: ldloc.2 - IL_0030: ldloc.3 - IL_0031: cgt - IL_0033: nop - IL_0034: stloc.1 - IL_0035: ldloc.1 - IL_0036: ldc.i4.0 - IL_0037: bge.s IL_003b - - IL_0039: ldloc.1 - IL_003a: ret - - IL_003b: ldloc.1 - IL_003c: ldc.i4.0 - IL_003d: ble.s IL_0041 - - IL_003f: ldloc.1 - IL_0040: ret - - IL_0041: ldarg.0 - IL_0042: ldfld int32 TestFunction25/Point::y@ - IL_0047: stloc.2 - IL_0048: ldloc.0 - IL_0049: ldfld int32 TestFunction25/Point::y@ - IL_004e: stloc.3 - IL_004f: ldloc.2 - IL_0050: ldloc.3 - IL_0051: bge.s IL_0055 - - IL_0053: ldc.i4.m1 - IL_0054: ret - - IL_0055: ldloc.2 - IL_0056: ldloc.3 - IL_0057: cgt - IL_0059: ret - - IL_005a: ldc.i4.1 - IL_005b: ret - - IL_005c: ldarg.1 - IL_005d: unbox.any TestFunction25/Point - IL_0062: ldnull - IL_0063: cgt.un - IL_0065: brfalse.s IL_0069 - - IL_0067: ldc.i4.m1 - IL_0068: ret - - IL_0069: ldc.i4.0 - IL_006a: ret - } // end of method Point::CompareTo - - .method public hidebysig virtual final - instance int32 GetHashCode(class [mscorlib]System.Collections.IEqualityComparer comp) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 55 (0x37) - .maxstack 7 - .locals init (int32 V_0) - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldnull - IL_0003: cgt.un - IL_0005: brfalse.s IL_0035 - - IL_0007: ldc.i4.0 - IL_0008: stloc.0 - IL_0009: ldc.i4 0x9e3779b9 - IL_000e: ldarg.0 - IL_000f: ldfld int32 TestFunction25/Point::y@ - IL_0014: ldloc.0 - IL_0015: ldc.i4.6 - IL_0016: shl - IL_0017: ldloc.0 - IL_0018: ldc.i4.2 - IL_0019: shr - IL_001a: add - IL_001b: add - IL_001c: add - IL_001d: stloc.0 - IL_001e: ldc.i4 0x9e3779b9 - IL_0023: ldarg.0 - IL_0024: ldfld int32 TestFunction25/Point::x@ - IL_0029: ldloc.0 - IL_002a: ldc.i4.6 - IL_002b: shl - IL_002c: ldloc.0 - IL_002d: ldc.i4.2 - IL_002e: shr - IL_002f: add - IL_0030: add - IL_0031: add - IL_0032: stloc.0 - IL_0033: ldloc.0 - IL_0034: ret - - IL_0035: ldc.i4.0 - IL_0036: ret - } // end of method Point::GetHashCode - - .method public hidebysig virtual final - instance int32 GetHashCode() cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 13 (0xd) - .maxstack 8 - .line 4,4 : 6,11 '' - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: call class [mscorlib]System.Collections.IEqualityComparer [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer() - IL_0007: callvirt instance int32 TestFunction25/Point::GetHashCode(class [mscorlib]System.Collections.IEqualityComparer) - IL_000c: ret - } // end of method Point::GetHashCode - - .method public hidebysig virtual final - instance bool Equals(object obj, - class [mscorlib]System.Collections.IEqualityComparer comp) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 58 (0x3a) - .maxstack 4 - .locals init (class TestFunction25/Point V_0) - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldnull - IL_0003: cgt.un - IL_0005: brfalse.s IL_0032 - - IL_0007: ldarg.1 - IL_0008: isinst TestFunction25/Point - IL_000d: stloc.0 - IL_000e: ldloc.0 - IL_000f: brfalse.s IL_0030 - - IL_0011: ldarg.0 - IL_0012: ldfld int32 TestFunction25/Point::x@ - IL_0017: ldloc.0 - IL_0018: ldfld int32 TestFunction25/Point::x@ - IL_001d: bne.un.s IL_002e - - IL_001f: ldarg.0 - IL_0020: ldfld int32 TestFunction25/Point::y@ - IL_0025: ldloc.0 - IL_0026: ldfld int32 TestFunction25/Point::y@ - IL_002b: ceq - IL_002d: ret - - IL_002e: ldc.i4.0 - IL_002f: ret - - IL_0030: ldc.i4.0 - IL_0031: ret - - IL_0032: ldarg.1 - IL_0033: ldnull - IL_0034: cgt.un - IL_0036: ldc.i4.0 - IL_0037: ceq - IL_0039: ret - } // end of method Point::Equals - - .method public hidebysig virtual final - instance bool Equals(class TestFunction25/Point obj) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 54 (0x36) - .maxstack 8 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldnull - IL_0003: cgt.un - IL_0005: brfalse.s IL_002e - - IL_0007: ldarg.1 - IL_0008: ldnull - IL_0009: cgt.un - IL_000b: brfalse.s IL_002c - - IL_000d: ldarg.0 - IL_000e: ldfld int32 TestFunction25/Point::x@ - IL_0013: ldarg.1 - IL_0014: ldfld int32 TestFunction25/Point::x@ - IL_0019: bne.un.s IL_002a - - IL_001b: ldarg.0 - IL_001c: ldfld int32 TestFunction25/Point::y@ - IL_0021: ldarg.1 - IL_0022: ldfld int32 TestFunction25/Point::y@ - IL_0027: ceq - IL_0029: ret - - IL_002a: ldc.i4.0 - IL_002b: ret - - IL_002c: ldc.i4.0 - IL_002d: ret - - IL_002e: ldarg.1 - IL_002f: ldnull - IL_0030: cgt.un - IL_0032: ldc.i4.0 - IL_0033: ceq - IL_0035: ret - } // end of method Point::Equals - - .method public hidebysig virtual final - instance bool Equals(object obj) cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 21 (0x15) - .maxstack 4 - .locals init (class TestFunction25/Point V_0) - IL_0000: nop - IL_0001: ldarg.1 - IL_0002: isinst TestFunction25/Point - IL_0007: stloc.0 - IL_0008: ldloc.0 - IL_0009: brfalse.s IL_0013 - - IL_000b: ldarg.0 - IL_000c: ldloc.0 - IL_000d: callvirt instance bool TestFunction25/Point::Equals(class TestFunction25/Point) - IL_0012: ret - - IL_0013: ldc.i4.0 - IL_0014: ret - } // end of method Point::Equals - - .property instance int32 x() - { - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, - int32) = ( 01 00 04 00 00 00 00 00 00 00 00 00 ) - .set instance void TestFunction25/Point::set_x(int32) - .get instance int32 TestFunction25/Point::get_x() - } // end of property Point::x - .property instance int32 y() - { - .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags, - int32) = ( 01 00 04 00 00 00 01 00 00 00 00 00 ) - .set instance void TestFunction25/Point::set_y(int32) - .get instance int32 TestFunction25/Point::get_y() - } // end of property Point::y - } // end of class Point - - .method public static int32 pinObject() cil managed - { - // Code size 53 (0x35) - .maxstack 6 - .locals init ([0] class TestFunction25/Point point, - [1] native int p1, - [2] int32& pinned V_2) - .line 7,7 : 5,33 '' - IL_0000: nop - IL_0001: ldc.i4.1 - IL_0002: ldc.i4.2 - IL_0003: newobj instance void TestFunction25/Point::.ctor(int32, - int32) - IL_0008: stloc.0 - .line 8,8 : 5,28 '' - IL_0009: ldloc.0 - IL_000a: ldflda int32 TestFunction25/Point::x@ - IL_000f: stloc.2 - IL_0010: ldloc.2 - IL_0011: conv.i - IL_0012: stloc.1 - .line 9,9 : 5,44 '' - IL_0013: ldloc.1 - IL_0014: ldc.i4.0 - IL_0015: conv.i - IL_0016: sizeof [mscorlib]System.Int32 - IL_001c: mul - IL_001d: add - IL_001e: ldobj [mscorlib]System.Int32 - IL_0023: ldloc.1 - IL_0024: ldc.i4.1 - IL_0025: conv.i - IL_0026: sizeof [mscorlib]System.Int32 - IL_002c: mul - IL_002d: add - IL_002e: ldobj [mscorlib]System.Int32 - IL_0033: add - IL_0034: ret - } // end of method TestFunction25::pinObject - - .method public static int32 pinRef() cil managed - { - // Code size 33 (0x21) - .maxstack 4 - .locals init ([0] class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1 point, - [1] native int p1, - [2] int32& pinned V_2) - .line 12,12 : 5,23 '' - IL_0000: nop - IL_0001: ldc.i4.s 17 - IL_0003: newobj instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::.ctor(!0) - IL_0008: stloc.0 - .line 13,13 : 5,35 '' - IL_0009: ldloc.0 - IL_000a: ldflda !0 class [FSharp.Core]Microsoft.FSharp.Core.FSharpRef`1::contents@ - IL_000f: stloc.2 - IL_0010: ldloc.2 - IL_0011: conv.i - IL_0012: stloc.1 - .line 14,14 : 5,42 '' - IL_0013: ldloc.1 - IL_0014: ldobj [mscorlib]System.Int32 - IL_0019: ldloc.1 - IL_001a: ldobj [mscorlib]System.Int32 - IL_001f: add - IL_0020: ret - } // end of method TestFunction25::pinRef - - .method public static float64 pinArray1() cil managed - { - // Code size 168 (0xa8) - .maxstack 6 - .locals init ([0] float64[] arr, - [1] native int p1, - [2] float64& pinned V_2) - .line 17,17 : 5,49 '' - IL_0000: nop - IL_0001: ldc.i4.6 - IL_0002: newarr [mscorlib]System.Double - IL_0007: dup - IL_0008: ldc.i4.0 - IL_0009: ldc.r8 0.0 - IL_0012: stelem [mscorlib]System.Double - IL_0017: dup - IL_0018: ldc.i4.1 - IL_0019: ldc.r8 1.5 - IL_0022: stelem [mscorlib]System.Double - IL_0027: dup - IL_0028: ldc.i4.2 - IL_0029: ldc.r8 2.2999999999999998 - IL_0032: stelem [mscorlib]System.Double - IL_0037: dup - IL_0038: ldc.i4.3 - IL_0039: ldc.r8 3.3999999999999999 - IL_0042: stelem [mscorlib]System.Double - IL_0047: dup - IL_0048: ldc.i4.4 - IL_0049: ldc.r8 4. - IL_0052: stelem [mscorlib]System.Double - IL_0057: dup - IL_0058: ldc.i4.5 - IL_0059: ldc.r8 5.9000000000000004 - IL_0062: stelem [mscorlib]System.Double - IL_0067: stloc.0 - .line 18,18 : 5,23 '' - IL_0068: ldloc.0 - IL_0069: brfalse.s IL_0082 - - IL_006b: ldloc.0 - IL_006c: ldlen - IL_006d: conv.i4 - IL_006e: brfalse.s IL_007d - - IL_0070: ldloc.0 - IL_0071: ldc.i4.0 - IL_0072: ldelema [mscorlib]System.Double - IL_0077: stloc.2 - IL_0078: ldloc.2 - IL_0079: conv.i - IL_007a: nop - IL_007b: br.s IL_0085 - - IL_007d: ldc.i4.0 - IL_007e: conv.i - IL_007f: nop - IL_0080: br.s IL_0085 - - IL_0082: ldc.i4.0 - IL_0083: conv.i - IL_0084: nop - IL_0085: stloc.1 - .line 19,19 : 5,44 '' - IL_0086: ldloc.1 - IL_0087: ldc.i4.0 - IL_0088: conv.i - IL_0089: sizeof [mscorlib]System.Double - IL_008f: mul - IL_0090: add - IL_0091: ldobj [mscorlib]System.Double - IL_0096: ldloc.1 - IL_0097: ldc.i4.1 - IL_0098: conv.i - IL_0099: sizeof [mscorlib]System.Double - IL_009f: mul - IL_00a0: add - IL_00a1: ldobj [mscorlib]System.Double - IL_00a6: add - IL_00a7: ret - } // end of method TestFunction25::pinArray1 - - .method public static float64 pinArray2() cil managed - { - // Code size 149 (0x95) - .maxstack 6 - .locals init ([0] float64[] arr, - [1] native int p, - [2] float64& pinned V_2) - .line 22,22 : 5,49 '' - IL_0000: nop - IL_0001: ldc.i4.6 - IL_0002: newarr [mscorlib]System.Double - IL_0007: dup - IL_0008: ldc.i4.0 - IL_0009: ldc.r8 0.0 - IL_0012: stelem [mscorlib]System.Double - IL_0017: dup - IL_0018: ldc.i4.1 - IL_0019: ldc.r8 1.5 - IL_0022: stelem [mscorlib]System.Double - IL_0027: dup - IL_0028: ldc.i4.2 - IL_0029: ldc.r8 2.2999999999999998 - IL_0032: stelem [mscorlib]System.Double - IL_0037: dup - IL_0038: ldc.i4.3 - IL_0039: ldc.r8 3.3999999999999999 - IL_0042: stelem [mscorlib]System.Double - IL_0047: dup - IL_0048: ldc.i4.4 - IL_0049: ldc.r8 4. - IL_0052: stelem [mscorlib]System.Double - IL_0057: dup - IL_0058: ldc.i4.5 - IL_0059: ldc.r8 5.9000000000000004 - IL_0062: stelem [mscorlib]System.Double - IL_0067: stloc.0 - .line 24,24 : 5,27 '' - IL_0068: ldloc.0 - IL_0069: ldc.i4.0 - IL_006a: ldelema [mscorlib]System.Double - IL_006f: stloc.2 - IL_0070: ldloc.2 - IL_0071: conv.i - IL_0072: stloc.1 - .line 25,25 : 5,42 '' - IL_0073: ldloc.1 - IL_0074: ldc.i4.0 - IL_0075: conv.i - IL_0076: sizeof [mscorlib]System.Double - IL_007c: mul - IL_007d: add - IL_007e: ldobj [mscorlib]System.Double - IL_0083: ldloc.1 - IL_0084: ldc.i4.1 - IL_0085: conv.i - IL_0086: sizeof [mscorlib]System.Double - IL_008c: mul - IL_008d: add - IL_008e: ldobj [mscorlib]System.Double - IL_0093: add - IL_0094: ret - } // end of method TestFunction25::pinArray2 - - .method public static class [mscorlib]System.Tuple`2 - pinString() cil managed - { - // Code size 58 (0x3a) - .maxstack 6 - .locals init ([0] native int pChar, - [1] string pinned V_1) - .line 30,30 : 5,26 '' - IL_0000: nop - IL_0001: ldstr "Hello World" - IL_0006: stloc.1 - IL_0007: ldstr "Hello World" - IL_000c: conv.i - IL_000d: call int32 [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::get_OffsetToStringData() - IL_0012: add - IL_0013: stloc.0 - .line 31,31 : 5,50 '' - IL_0014: ldloc.0 - IL_0015: ldc.i4.0 - IL_0016: conv.i - IL_0017: sizeof [mscorlib]System.Char - IL_001d: mul - IL_001e: add - IL_001f: ldobj [mscorlib]System.Char - IL_0024: ldloc.0 - IL_0025: ldc.i4.1 - IL_0026: conv.i - IL_0027: sizeof [mscorlib]System.Char - IL_002d: mul - IL_002e: add - IL_002f: ldobj [mscorlib]System.Char - IL_0034: newobj instance void class [mscorlib]System.Tuple`2::.ctor(!0, - !1) - IL_0039: ret - } // end of method TestFunction25::pinString - -} // end of class TestFunction25 - -.class private abstract auto ansi sealed ''.$TestFunction25 - extends [mscorlib]System.Object -{ - .method public static void main@() cil managed - { - .entrypoint - // Code size 2 (0x2) - .maxstack 8 - IL_0000: nop - IL_0001: ret - } // end of method $TestFunction25::main@ - -} // end of class ''.$TestFunction25 - - -// ============================================================= - -// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index dcefb74b988..fb6a949b63a 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -44,4 +44,3 @@ SOURCE=TestFunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 - SOURCE=TestFunction25.fs SCFLAGS="-g --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction25.exe NetFx40" # TestFunction25.fs - NetFx40 From 8cdaecaf63fade31b9a37d0b7bfab195b699c2b4 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 22 Jun 2016 00:29:49 +0100 Subject: [PATCH 305/334] test function capitalization --- .../CodeGen/EmittedIL/TestFunctions/env.lst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index fb6a949b63a..f69b5646511 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -34,13 +34,13 @@ SOURCE=TestFunction15.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction15.exe" # TestFunction15.fs SOURCE=TestFunction18.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction18.exe" # TestFunction18.fs - SOURCE=TestFunction22.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22.exe" # TestFunction22.fs - SOURCE=TestFunction22b.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22b.exe" # TestFunction22b.fs - SOURCE=TestFunction22c.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22c.exe" # TestFunction22c.fs - SOURCE=TestFunction22d.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22d.exe" # TestFunction22d.fs - SOURCE=TestFunction22e.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22e.exe" # TestFunction22e.fs - SOURCE=TestFunction22f.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22f.exe" # TestFunction22f.fs - SOURCE=TestFunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs - - SOURCE=TestFunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 + SOURCE=Testfunction22.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22.exe" # TestFunction22.fs + SOURCE=Testfunction22b.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22b.exe" # TestFunction22b.fs + SOURCE=Testfunction22c.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22c.exe" # TestFunction22c.fs + SOURCE=Testfunction22d.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22d.exe" # TestFunction22d.fs + SOURCE=Testfunction22e.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22e.exe" # TestFunction22e.fs + SOURCE=Testfunction22f.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22f.exe" # TestFunction22f.fs + SOURCE=Testfunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs + + SOURCE=Testfunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 From b322bb283803c807ae320f7e7dcab4cf51fc0aee Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 22 Jun 2016 08:22:06 +0100 Subject: [PATCH 306/334] fix test --- tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst index f69b5646511..9196e88642c 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/TestFunctions/env.lst @@ -43,4 +43,4 @@ SOURCE=Testfunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs SOURCE=Testfunction22h.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22h.exe NetFx40" # TestFunction22h.fs - NetFx40 - SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 + SOURCE=TestFunction24.fs SCFLAGS="-g --optimize-" PEVER=/Exp_Fail COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction24.exe NetFx40" # TestFunction24.fs - NetFx40 From 38657fa22fc5f232dfffa71c992129ef6d95bfd9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 22 Jun 2016 13:10:03 +0100 Subject: [PATCH 307/334] add a warning to mutable use bindings --- src/fsharp/FSComp.txt | 1 + src/fsharp/TypeChecker.fs | 43 ++++++++++++++------------- tests/fsharp/typecheck/sigs/neg96.bsl | 4 ++- tests/fsharp/typecheck/sigs/neg96.fs | 4 +++ 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 5bbff5d3ffa..448d8368967 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1307,3 +1307,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS 3201,tcModuleAbbrevFirstInMutRec,"In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations" 3202,tcUnsupportedMutRecDecl,"This declaration is not supported in recursive declaration groups" 3203,parsInvalidUseOfRec,"Invalid use of 'rec' keyword" +3204,tcUseMayNotBeMutable,"This feature is deprecated. A 'use' binding may not be marked 'mutable'." diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c8cfc054800..7567f61b221 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1196,7 +1196,6 @@ type TcPatPhase2Input = type CheckedBindingInfo = | CheckedBindingInfo of ValInline * - bool * (* immutable? *) Tast.Attribs * XmlDoc * (TcPatPhase2Input -> PatternMatchCompilation.Pattern) * @@ -1209,8 +1208,8 @@ type CheckedBindingInfo = SequencePointInfoForBinding * bool * (* compiler generated? *) Const option (* literal value? *) - member x.Expr = let (CheckedBindingInfo(_,_,_,_,_,_,_,expr,_,_,_,_,_,_)) = x in expr - member x.SeqPoint = let (CheckedBindingInfo(_,_,_,_,_,_,_,_,_,_,_,spBind,_,_)) = x in spBind + member x.Expr = let (CheckedBindingInfo(_,_,_,_,_,_,expr,_,_,_,_,_,_)) = x in expr + member x.SeqPoint = let (CheckedBindingInfo(_,_,_,_,_,_,_,_,_,_,spBind,_,_)) = x in spBind //------------------------------------------------------------------------- // Helpers related to type schemes @@ -2174,7 +2173,7 @@ module GeneralizationHelpers = let ComputeAndGeneralizeGenericTypars (cenv, denv:DisplayEnv, m, - immut, + canGeneralize, freeInEnv:FreeTypars, canInferTypars, genConstrainedTyparFlag, @@ -2187,7 +2186,7 @@ module GeneralizationHelpers = let allDeclaredTypars = NormalizeDeclaredTyparsForEquiRecursiveInference cenv.g allDeclaredTypars let typarsToAttemptToGeneralize = - if immut && (match exprOpt with None -> true | Some e -> IsGeneralizableValue cenv.g e) + if canGeneralize && (match exprOpt with None -> true | Some e -> IsGeneralizableValue cenv.g e) then (ListSet.unionFavourLeft typarEq allDeclaredTypars maxInferredTypars) else allDeclaredTypars @@ -6262,9 +6261,9 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo,bind) = | _ -> implty --> NewInferenceType () - let (CheckedBindingInfo(inlineFlag,immut,bindingAttribs,_,_,ExplicitTyparInfo(_,declaredTypars,_),nameToPrelimValSchemeMap,rhsExpr,_,_,m,_,_,_),tpenv) = + let (CheckedBindingInfo(inlineFlag,bindingAttribs,_,_,ExplicitTyparInfo(_,declaredTypars,_),nameToPrelimValSchemeMap,rhsExpr,_,_,m,_,_,_),tpenv) = let flex, tpenv = TcNonrecBindingTyparDecls cenv env tpenv bind - TcNormalizedBinding ObjectExpressionOverrideBinding cenv env tpenv bindingTy None NoSafeInitInfo ([],flex) bind + TcNormalizedBinding ObjectExpressionOverrideBinding cenv env tpenv false bindingTy None NoSafeInitInfo ([],flex) bind // 4c. generalize the binding - only relevant when implementing a generic virtual method @@ -6283,7 +6282,7 @@ and TcObjectExprBinding cenv (env: TcEnv) implty tpenv (absSlotInfo,bind) = let freeInEnv = GeneralizationHelpers.ComputeUngeneralizableTypars env - let generalizedTypars = GeneralizationHelpers.ComputeAndGeneralizeGenericTypars(cenv,denv,m,immut,freeInEnv,false,CanGeneralizeConstrainedTypars,inlineFlag,Some(rhsExpr),declaredTypars,[],bindingTy,false) + let generalizedTypars = GeneralizationHelpers.ComputeAndGeneralizeGenericTypars(cenv,denv,m,true,freeInEnv,false,CanGeneralizeConstrainedTypars,inlineFlag,Some(rhsExpr),declaredTypars,[],bindingTy,false) let declaredTypars = ChooseCanonicalDeclaredTyparsAfterInference cenv.g env.DisplayEnv declaredTypars m let generalizedTypars = PlaceTyparsInDeclarationOrder declaredTypars generalizedTypars @@ -9773,7 +9772,7 @@ and TcStaticOptimizationConstraint cenv env tpenv c = TTyconIsStruct(mkTyparTy tp'),tpenv /// Binding checking code, for all bindings including let bindings, let-rec bindings, member bindings and object-expression bindings and -and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt safeInitInfo (enclosingDeclaredTypars,(ExplicitTyparInfo(_,declaredTypars,_) as flex)) bind = +and TcNormalizedBinding declKind (cenv:cenv) env tpenv isUse overallTy safeThisValOpt safeInitInfo (enclosingDeclaredTypars,(ExplicitTyparInfo(_,declaredTypars,_) as flex)) bind = let envinner = AddDeclaredTypars NoCheckForDuplicateTypars (enclosingDeclaredTypars@declaredTypars) env match bind with @@ -9798,6 +9797,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt let argAttribs = spatsL |> List.map (SynInfo.InferSynArgInfoFromSimplePats >> List.map (SynInfo.AttribsOfArgData >> TcAttrs AttributeTargets.Parameter)) + let retAttribs = match rtyOpt with | Some (SynBindingReturnInfo(_,_,retAttrs)) -> TcAttrs AttributeTargets.ReturnValue retAttrs @@ -9817,6 +9817,9 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if (not isMutable || isThreadStatic) then errorR(Error(FSComp.SR.tcVolatileFieldsMustBeMutable(),mBinding)) + if isUse && isMutable then + warning(Error(FSComp.SR.tcUseMayNotBeMutable(),mBinding)) + if HasFSharpAttributeOpt cenv.g cenv.g.attrib_DllImportAttribute valAttribs then if not declKind.CanBeDllImport || (match memberFlagsOpt with Some memberFlags -> memberFlags.IsInstance | _ -> false) then errorR(Error(FSComp.SR.tcDllImportNotAllowed(),mBinding)) @@ -9916,7 +9919,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt if hasLiteralAttr && nonNil declaredTypars then errorR(Error(FSComp.SR.tcLiteralCannotHaveGenericParameters(),mBinding)) - CheckedBindingInfo(inlineFlag,true,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr',argAndRetAttribs,overallTy,mBinding,spBind,compgen,konst),tpenv + CheckedBindingInfo(inlineFlag,valAttribs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr',argAndRetAttribs,overallTy,mBinding,spBind,compgen,konst),tpenv and TcLiteral cenv overallTy env tpenv (attrs,synLiteralValExpr) = let hasLiteralAttr = HasFSharpAttribute cenv.g cenv.g.attrib_LiteralAttribute attrs @@ -9958,10 +9961,10 @@ and TcNonrecBindingTyparDecls cenv env tpenv bind = let (NormalizedBinding(_,_,_,_,_,_,synTyparDecls,_,_,_,_,_)) = bind TcBindingTyparDecls true cenv env tpenv synTyparDecls -and TcNonRecursiveBinding declKind cenv env tpenv ty b = +and TcNonRecursiveBinding declKind cenv env tpenv isUse ty b = let b = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv env b let flex, tpenv = TcNonrecBindingTyparDecls cenv env tpenv b - TcNormalizedBinding declKind cenv env tpenv ty None NoSafeInitInfo ([],flex) b + TcNormalizedBinding declKind cenv env tpenv isUse ty None NoSafeInitInfo ([],flex) b //------------------------------------------------------------------------- // TcAttribute* @@ -10164,14 +10167,14 @@ and TcAttributes cenv env attrTgt synAttribs = and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scopem) = // Typecheck all the bindings... - let binds',tpenv = List.mapFold (fun tpenv b -> TcNonRecursiveBinding declKind cenv env tpenv (NewInferenceType ()) b) tpenv binds + let binds',tpenv = List.mapFold (fun tpenv b -> TcNonRecursiveBinding declKind cenv env tpenv isUse (NewInferenceType ()) b) tpenv binds let (ContainerInfo(altActualParent,_)) = containerInfo // Canonicalize constraints prior to generalization let denv = env.DisplayEnv GeneralizationHelpers.CanonicalizePartialInferenceProblem (cenv,denv,bindsm) (binds' |> List.collect (fun tbinfo -> - let (CheckedBindingInfo(_,_,_,_,_,flex,_,_,_,tauTy,_,_,_,_)) = tbinfo + let (CheckedBindingInfo(_,_,_,_,flex,_,_,_,tauTy,_,_,_,_)) = tbinfo let (ExplicitTyparInfo(_,declaredTypars,_)) = flex let maxInferredTypars = (freeInTypeLeftToRight cenv.g false tauTy) declaredTypars @ maxInferredTypars)) @@ -10180,7 +10183,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope // Generalize the bindings... (((fun x -> x), env, tpenv), binds') ||> List.fold (fun (mkf_sofar,env,tpenv) tbinfo -> - let (CheckedBindingInfo(inlineFlag,immut,attrs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr,_,tauTy,m,spBind,_,konst)) = tbinfo + let (CheckedBindingInfo(inlineFlag,attrs,doc,tcPatPhase2,flex,nameToPrelimValSchemeMap,rhsExpr,_,tauTy,m,spBind,_,konst)) = tbinfo let enclosingDeclaredTypars = [] let (ExplicitTyparInfo(_,declaredTypars,canInferTypars)) = flex let allDeclaredTypars = enclosingDeclaredTypars @ declaredTypars @@ -10194,7 +10197,7 @@ and TcLetBinding cenv isUse env containerInfo declKind tpenv (binds,bindsm,scope [] else let freeInEnv = lazyFreeInEnv.Force() - GeneralizationHelpers.ComputeAndGeneralizeGenericTypars(cenv,denv, m, immut, freeInEnv, canInferTypars, GeneralizationHelpers.CanGeneralizeConstrainedTyparsForDecl(declKind), inlineFlag, Some rhsExpr, allDeclaredTypars, maxInferredTypars,tauTy,false) + GeneralizationHelpers.ComputeAndGeneralizeGenericTypars(cenv,denv, m, true, freeInEnv, canInferTypars, GeneralizationHelpers.CanGeneralizeConstrainedTyparsForDecl(declKind), inlineFlag, Some rhsExpr, allDeclaredTypars, maxInferredTypars,tauTy,false) let prelimValSchemes2 = GeneralizeVals cenv denv enclosingDeclaredTypars generalizedTypars nameToPrelimValSchemeMap @@ -10809,7 +10812,7 @@ and TcLetrecBinding let envRec = MakeInnerEnvForMember cenv envRec vspec let checkedBind,tpenv = - TcNormalizedBinding declKind cenv envRec tpenv tau safeThisValOpt safeInitInfo (enclosingDeclaredTypars,flex) rbind.SyntacticBinding + TcNormalizedBinding declKind cenv envRec tpenv false tau safeThisValOpt safeInitInfo (enclosingDeclaredTypars,flex) rbind.SyntacticBinding (try UnifyTypes cenv envRec vspec.Range (allDeclaredTypars +-> tau) vspec.Type with e -> error (Recursion(envRec.DisplayEnv,vspec.Id,tau,vspec.Type,vspec.Range))) @@ -11026,7 +11029,7 @@ and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgr let rbinfo = pgrbind.RecBindingInfo let vspec = rbinfo.Val - let (CheckedBindingInfo(inlineFlag,immut,_,_,_,_,_,expr,_,_,m,_,_,_)) = pgrbind.CheckedBinding + let (CheckedBindingInfo(inlineFlag,_,_,_,_,_,expr,_,_,m,_,_,_)) = pgrbind.CheckedBinding let (ExplicitTyparInfo(rigidCopyOfDeclaredTypars,declaredTypars,_)) = rbinfo.ExplicitTyparInfo let allDeclaredTypars = rbinfo.EnclosingDeclaredTypars @ declaredTypars @@ -11047,7 +11050,7 @@ and TcLetrecComputeAndGeneralizeGenericTyparsForBinding cenv denv freeInEnv (pgr let maxInferredTypars = freeInTypeLeftToRight cenv.g false tau let canGeneralizeConstrained = GeneralizationHelpers.CanGeneralizeConstrainedTyparsForDecl rbinfo.DeclKind - let generalizedTypars = GeneralizationHelpers.ComputeAndGeneralizeGenericTypars (cenv,denv,m,immut,freeInEnv,canInferTypars,canGeneralizeConstrained,inlineFlag, Some(expr), allDeclaredTypars, maxInferredTypars,tau,isCtor) + let generalizedTypars = GeneralizationHelpers.ComputeAndGeneralizeGenericTypars (cenv,denv,m,true,freeInEnv,canInferTypars,canGeneralizeConstrained,inlineFlag, Some(expr), allDeclaredTypars, maxInferredTypars,tau,isCtor) generalizedTypars /// Compute the type variables which may have member constraints that need to be canonicalized prior to generalization @@ -11065,7 +11068,7 @@ and TcLetrecComputeSupportForBinding cenv (pgrbind : PreGeneralizationRecursiveB and TcLetrecGeneralizeBinding cenv denv generalizedTypars (pgrbind : PreGeneralizationRecursiveBinding) : PostGeneralizationRecursiveBinding = let (RBInfo(_,_,enclosingDeclaredTypars,_,vspec,flex,partialValReprInfo,memberInfoOpt,_,_,_,vis,_,declKind)) = pgrbind.RecBindingInfo - let (CheckedBindingInfo(inlineFlag,_,_,_,_,_,_,expr,argAttribs,_,_,_,compgen,_)) = pgrbind.CheckedBinding + let (CheckedBindingInfo(inlineFlag,_,_,_,_,_,expr,argAttribs,_,_,_,compgen,_)) = pgrbind.CheckedBinding let _,tau = vspec.TypeScheme diff --git a/tests/fsharp/typecheck/sigs/neg96.bsl b/tests/fsharp/typecheck/sigs/neg96.bsl index 29902eb4c44..d89370c98a1 100644 --- a/tests/fsharp/typecheck/sigs/neg96.bsl +++ b/tests/fsharp/typecheck/sigs/neg96.bsl @@ -1,2 +1,4 @@ -neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined \ No newline at end of file +neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined + +neg96.fs(14,17,14,18): typecheck error FS3204: This feature is deprecated. A 'use' binding may not be marked 'mutable'. \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg96.fs b/tests/fsharp/typecheck/sigs/neg96.fs index e46b8fb7fee..d823086822a 100644 --- a/tests/fsharp/typecheck/sigs/neg96.fs +++ b/tests/fsharp/typecheck/sigs/neg96.fs @@ -9,3 +9,7 @@ type StructRecord = } let x = StructRecord () + +let invalidUse() = + use mutable x = (null : System.IDisposable) + () From 9fa854701fc6794a85f490d517cbb8472f54d268 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 22 Jun 2016 11:19:28 +0200 Subject: [PATCH 308/334] Show better error when using ref cell - fixes #1276 --- src/fsharp/CompileOps.fs | 11 +++++++---- src/fsharp/FSComp.txt | 1 + tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot.fs | 9 +++++++++ .../fsharpqa/Source/Warnings/RefCellInsteadOfNot2.fs | 8 ++++++++ tests/fsharpqa/Source/Warnings/env.lst | 2 ++ 5 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot.fs create mode 100644 tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot2.fs diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 5f5a532bbfe..2317eb007da 100755 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -621,7 +621,7 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = (if m.StartLine <> m2.StartLine then os.Append(SeeAlsoE().Format (stringOfRange m)) |> ignore ) | ConstraintSolverTypesNotInEqualityRelation(denv,(TType_measure _ as t1),(TType_measure _ as t2),m,m2) -> - // REVIEW: consider if we need to show _cxs (the type parameter constrants) + // REVIEW: consider if we need to show _cxs (the type parameter constraints) let t1, t2, _cxs = NicePrint.minimalStringsOfTwoTypes denv t1 t2 os.Append(ConstraintSolverTypesNotInEqualityRelation1E().Format t1 t2 ) |> ignore (if m.StartLine <> m2.StartLine then @@ -633,7 +633,7 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = (if m.StartLine <> m2.StartLine then os.Append(SeeAlsoE().Format (stringOfRange m)) |> ignore) | ConstraintSolverTypesNotInSubsumptionRelation(denv,t1,t2,m,m2) -> - // REVIEW: consider if we need to show _cxs (the type parameter constrants) + // REVIEW: consider if we need to show _cxs (the type parameter constraints) let t1, t2, cxs= NicePrint.minimalStringsOfTwoTypes denv t1 t2 os.Append(ConstraintSolverTypesNotInSubsumptionRelationE().Format t2 t1 cxs) |> ignore (if m.StartLine <> m2.StartLine then @@ -654,9 +654,12 @@ let OutputPhasedErrorR (os:System.Text.StringBuilder) (err:PhasedError) = match contextInfo with | ContextInfo.OmittedElseBranch -> os.Append(FSComp.SR.missingElseBranch(t2)) |> ignore | ContextInfo.ElseBranch -> os.Append(FSComp.SR.elseBranchHasWrongType(t1,t2)) |> ignore - | ContextInfo.TupleInRecordFields -> + | ContextInfo.TupleInRecordFields -> + os.Append(ErrorFromAddingTypeEquation1E().Format t2 t1 tpcs) |> ignore + os.Append(System.Environment.NewLine + FSComp.SR.commaInsteadOfSemicolonInRecord()) |> ignore + | _ when t2 = "bool" && t1.EndsWith " ref" -> os.Append(ErrorFromAddingTypeEquation1E().Format t2 t1 tpcs) |> ignore - os.Append(System.Environment.NewLine + FSComp.SR.commaInsteadOfSemicolonInRecord()) |> ignore + os.Append(System.Environment.NewLine + FSComp.SR.derefInsteadOfNot()) |> ignore | _ -> os.Append(ErrorFromAddingTypeEquation1E().Format t2 t1 tpcs) |> ignore | ErrorFromAddingTypeEquation(_,_,_,_,((ConstraintSolverTypesNotInSubsumptionRelation _ | ConstraintSolverError _) as e), _, _) -> OutputExceptionR os e diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 5bbff5d3ffa..fb2c03b7a50 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -18,6 +18,7 @@ undefinedNamePatternDiscriminator,"The pattern discriminator '%s' is not defined missingElseBranch,"The 'if' expression is missing an 'else' branch. The 'then' branch has type '%s'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type." elseBranchHasWrongType,"All branches of an 'if' expression must return the same type. This expression was expected to have type '%s' but here has type '%s'." commaInsteadOfSemicolonInRecord,"A ';' is used to separate field values in records. Consider replacing ',' with ';'." +derefInsteadOfNot,"The '!' operator is used to dereference a ref cell. Consider using 'not expr' here." buildUnexpectedTypeArgs,"The non-generic type '%s' does not expect any type arguments, but here is given %d type argument(s)" returnUsedInsteadOfReturnBang,"Consider using 'return!' instead of 'return'." yieldUsedInsteadOfYieldBang,"Consider using 'yield!' instead of 'yield'." diff --git a/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot.fs b/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot.fs new file mode 100644 index 00000000000..1c6987bfa63 --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot.fs @@ -0,0 +1,9 @@ +// #Warnings +//This expression was expected to have type +//The '!' operator is used to dereference a ref cell. Consider using 'not expr' here. + +let x = true +if !x then + printfn "hello" + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot2.fs b/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot2.fs new file mode 100644 index 00000000000..090934d8f56 --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/RefCellInsteadOfNot2.fs @@ -0,0 +1,8 @@ +// #Warnings +//This expression was expected to have type +//The '!' operator is used to dereference a ref cell. Consider using 'not expr' here. + +let x = true +let y = !x + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/env.lst b/tests/fsharpqa/Source/Warnings/env.lst index 89651c646aa..cb14235cc9c 100644 --- a/tests/fsharpqa/Source/Warnings/env.lst +++ b/tests/fsharpqa/Source/Warnings/env.lst @@ -7,6 +7,8 @@ SOURCE=ElseBranchHasWrongType.fs # ElseBranchHasWrongType.fs SOURCE=MissingExpressionAfterLet.fs # MissingExpressionAfterLet.fs SOURCE=AssignmentOnImmutable.fs # AssignmentOnImmutable.fs + SOURCE=RefCellInsteadOfNot.fs # RefCellInsteadOfNot.fs + SOURCE=RefCellInsteadOfNot2.fs # RefCellInsteadOfNot2.fs SOURCE=UpcastInsteadOfDowncast.fs # UpcastInsteadOfDowncast.fs SOURCE=UpcastFunctionInsteadOfDowncast.fs # UpcastFunctionInsteadOfDowncast.fs SOURCE=DowncastInsteadOfUpcast.fs # DowncastInsteadOfUpcast.fs From 1599c24efb6901fb2df96a174cc6e2e68c82505c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 22 Jun 2016 14:28:55 +0100 Subject: [PATCH 309/334] unreserve various keywords --- src/fsharp/lexhelp.fs | 13 +++---- .../E_ReservedIdentKeywords.fs | 36 +++++++++---------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/fsharp/lexhelp.fs b/src/fsharp/lexhelp.fs index 76e317797bf..bb93921b02b 100644 --- a/src/fsharp/lexhelp.fs +++ b/src/fsharp/lexhelp.fs @@ -281,18 +281,15 @@ module Keywords = ] (*------- reserved keywords which are ml-compatibility ids *) @ List.map (fun s -> (FSHARP,s,RESERVED)) - [ "atomic"; "break"; - "checked"; "component"; "constraint"; "constructor"; "continue"; - "eager"; - "fixed"; "fori"; "functor"; + [ "break"; + "checked"; "component"; "constraint"; "continue"; + "fixed"; "fori"; "include"; - "measure"; "method"; "mixin"; - "object"; + "mixin"; "parallel"; "params"; "process"; "protected"; "pure"; - "recursive"; "sealed"; "trait"; "tailcall"; - "virtual"; "volatile"; ] + "virtual"; ] let private unreserveWords = keywordList |> List.choose (function (mode,keyword,_) -> if mode = FSHARP then Some keyword else None) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs index 2c550ad3d3c..ec38124d2be 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/E_ReservedIdentKeywords.fs @@ -1,60 +1,60 @@ // #Regression #Conformance #LexicalAnalysis // Reserved identifiers and keywords // Also cover regression test for FSHARP1.0:5367 (keyword 'virtual') -let atomic = 10 + let break = 10 let checked = 10 let component = 10 let constraint = 10 -let constructor = 10 + let continue = 10 -let eager = 10 + let fixed = 10 let fori = 10 -let functor = 10 + let include = 10 -let method = 10 -let measure = 10 + + let mixin = 10 -let object = 10 + let parallel = 10 let params = 10 let process = 10 let protected = 10 let pure = 10 -let recursive = 10 + let sealed = 10 let tailcall = 10 let trait = 10 let virtual = 10 -let volatile = 10 -//The identifier 'atomic' is reserved for future use by F# + + //The identifier 'break' is reserved for future use by F# //The identifier 'checked' is reserved for future use by F# //The identifier 'component' is reserved for future use by F# //The identifier 'constraint' is reserved for future use by F# -//The identifier 'constructor' is reserved for future use by F# + //The identifier 'continue' is reserved for future use by F# -//The identifier 'eager' is reserved for future use by F# + //The identifier 'fixed' is reserved for future use by F# //The identifier 'fori' is reserved for future use by F# -//The identifier 'functor' is reserved for future use by F# + //The identifier 'include' is reserved for future use by F# -//The identifier 'method' is reserved for future use by F# -//The identifier 'measure' is reserved for future use by F# + + //The identifier 'mixin' is reserved for future use by F# -//The identifier 'object' is reserved for future use by F# + //The identifier 'parallel' is reserved for future use by F# //The identifier 'params' is reserved for future use by F# //The identifier 'process' is reserved for future use by F# //The identifier 'protected' is reserved for future use by F# //The identifier 'pure' is reserved for future use by F# -//The identifier 'recursive' is reserved for future use by F# + //The identifier 'sealed' is reserved for future use by F# //The identifier 'tailcall' is reserved for future use by F# //The identifier 'trait' is reserved for future use by F# //The identifier 'virtual' is reserved for future use by F# -//The identifier 'volatile' is reserved for future use by F# + From f9540e1229362cda40011067a4082e99534b45ed Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Wed, 22 Jun 2016 15:30:23 -0700 Subject: [PATCH 310/334] Fix Loc Typo --- src/fsharp/FSComp.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 5bbff5d3ffa..02dffd07376 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -221,7 +221,7 @@ forPrecisionMissingAfterDot,"Precision missing after the '.'" forFormatDoesntSupportPrecision,"'%s' format does not support precision" forBadFormatSpecifier,"Bad format specifier (after l or L): Expected ld,li,lo,lu,lx or lX. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types." forLIsUnnecessary,"The 'l' or 'L' in this format specifier is unnecessary. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types." -forHIsUnnecessary,"The 'h' or 'H' in this format specifier is unnecessary. You can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types.." +forHIsUnnecessary,"The 'h' or 'H' in this format specifier is unnecessary. You can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types." forDoesNotSupportPrefixFlag,"'%s' does not support prefix '%s' flag" forBadFormatSpecifierGeneral,"Bad format specifier: '%s'" elSysEnvExitDidntExit,"System.Environment.Exit did not exit" From 1ed74347c57235050a99d51ddca48e0733e1dc58 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 23 Jun 2016 12:36:04 +0100 Subject: [PATCH 311/334] update tests --- .../IdentifiersAndKeywords/W_ReservedWord01.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/W_ReservedWord01.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/W_ReservedWord01.fs index 8b3a8681950..070cfca18ff 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/W_ReservedWord01.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/IdentifiersAndKeywords/W_ReservedWord01.fs @@ -3,8 +3,8 @@ // Verify warning when using a reserved identifier -//The identifier 'atomic' is reserved for future use by F# -let atomic = 1 + + exit 0 From a400ecf3f81c4bae2bfbe4d78a0921c534bd23c2 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 23 Jun 2016 13:09:16 +0100 Subject: [PATCH 312/334] fix test --- tests/fsharp/typecheck/sigs/neg02.bsl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg02.bsl b/tests/fsharp/typecheck/sigs/neg02.bsl index 77a47cc01ce..8648e0076c6 100644 --- a/tests/fsharp/typecheck/sigs/neg02.bsl +++ b/tests/fsharp/typecheck/sigs/neg02.bsl @@ -1,8 +1,4 @@ -neg02.fs(6,8,6,15): parse error FS0046: The identifier 'virtual' is reserved for future use by F# - neg02.fs(6,8,6,15): parse error FS0010: Unexpected identifier in member definition -neg02.fs(11,8,11,14): parse error FS0046: The identifier 'method' is reserved for future use by F# - neg02.fs(17,7,17,13): parse error FS0010: Unexpected keyword 'static' in member definition. Expected 'member', 'override' or other token. From 7cae7f14560bff078ab8d86d8a6a9a62bca6970d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 23 Jun 2016 14:23:10 +0100 Subject: [PATCH 313/334] fix test --- tests/fsharp/typecheck/sigs/neg02.bsl | 2 ++ .../tests/unittests/Tests.LanguageService.ErrorList.fs | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg02.bsl b/tests/fsharp/typecheck/sigs/neg02.bsl index 8648e0076c6..b7119f8e1d4 100644 --- a/tests/fsharp/typecheck/sigs/neg02.bsl +++ b/tests/fsharp/typecheck/sigs/neg02.bsl @@ -1,4 +1,6 @@ +neg02.fs(6,8,6,15): parse error FS0046: The identifier 'virtual' is reserved for future use by F# + neg02.fs(6,8,6,15): parse error FS0010: Unexpected identifier in member definition neg02.fs(17,7,17,13): parse error FS0010: Unexpected keyword 'static' in member definition. Expected 'member', 'override' or other token. diff --git a/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs b/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs index 86be53980a5..e06e5d29f24 100644 --- a/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs +++ b/vsintegration/tests/unittests/Tests.LanguageService.ErrorList.fs @@ -876,8 +876,8 @@ but here has type member public this.``Warning.ConsistentWithLanguageService``() = let fileContent = """ open System - atomic atomic atomic atomic atomic atomic atomic atomic atomic atomic - atomic atomic atomic atomic atomic atomic atomic atomic atomic atomic""" + mixin mixin mixin mixin mixin mixin mixin mixin mixin mixin + mixin mixin mixin mixin mixin mixin mixin mixin mixin mixin""" let (_, project, file) = this.CreateSingleFileProject(fileContent, fileKind = SourceFileKind.FSX) TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let warnList = GetWarnings(project) @@ -887,8 +887,8 @@ but here has type member public this.``Warning.ConsistentWithLanguageService.Comment``() = let fileContent = """ open System - //atomic atomic atomic atomic atomic atomic atomic atomic atomic atomic - //atomic atomic atomic atomic atomic atomic atomic atomic atomic atomic""" + //mixin mixin mixin mixin mixin mixin mixin mixin mixin mixin + //mixin mixin mixin mixin mixin mixin mixin mixin mixin mixin""" let (_, project, file) = this.CreateSingleFileProject(fileContent, fileKind = SourceFileKind.FSX) TakeCoffeeBreak(this.VS) // Wait for the background compiler to catch up. let warnList = GetWarnings(project) From 6ef35469f7ccc969e99ec9606c6d84e438aeffd2 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 23 Jun 2016 15:10:43 +0100 Subject: [PATCH 314/334] feedback from code review --- src/absil/ilwrite.fs | 15 +++++++-------- src/fsharp/tast.fs | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 98a17a556bf..556102c43ea 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -850,10 +850,7 @@ and GetTypeAsTypeDefOrRef cenv env (ty:ILType) = and GetTypeAsBytes cenv env ty = emitBytesViaBuffer (fun bb -> EmitType cenv env bb ty) and GetTypeOfLocalAsBytes cenv env (l: ILLocal) = - emitBytesViaBuffer (fun bb -> - if l.IsPinned then - bb.EmitByte et_PINNED - EmitType cenv env bb l.Type) + emitBytesViaBuffer (fun bb -> EmitLocalInfo cenv env bb l) and GetTypeAsBlobIdx cenv env (ty:ILType) = GetBytesAsBlobIdx cenv (GetTypeAsBytes cenv env ty) @@ -918,6 +915,11 @@ and EmitType cenv env bb ty = EmitType cenv env bb ty | _ -> failwith "EmitType" +and EmitLocalInfo cenv env (bb:ByteBuffer) (l:ILLocal) = + if l.IsPinned then + bb.EmitByte et_PINNED + EmitType cenv env bb l.Type + and EmitCallsig cenv env bb (callconv,args:ILTypes,ret,varargs:ILVarArgs,genarity) = bb.EmitByte (callconvToByte genarity callconv) if genarity > 0 then bb.EmitZ32 genarity @@ -1500,10 +1502,7 @@ let GetCallsigAsStandAloneSigIdx cenv env info = let EmitLocalSig cenv env (bb: ByteBuffer) (locals: ILLocals) = bb.EmitByte e_IMAGE_CEE_CS_CALLCONV_LOCAL_SIG bb.EmitZ32 locals.Length - locals |> ILList.iter (fun l -> - if l.IsPinned then - bb.EmitByte et_PINNED - EmitType cenv env bb l.Type) + locals |> ILList.iter (EmitLocalInfo cenv env bb) let GetLocalSigAsBlobHeapIdx cenv env locals = GetBytesAsBlobIdx cenv (emitBytesViaBuffer (fun bb -> EmitLocalSig cenv env bb locals)) diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 5e338e3294a..e25efe08d18 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -243,7 +243,7 @@ type ValFlags(flags:int64) = // Clear the IsCompiledAsStaticPropertyWithoutField, only used to determine whether to use a true field for a value, and to eliminate the optimization info for observable bindings // Clear the HasBeenReferenced, only used to report "unreferenced variable" warnings and to help collect 'it' values in FSI.EXE // Clear the IsGeneratedEventVal, since there's no use in propagating specialname information for generated add/remove event vals - (flags &&& ~~~0b1011001100000000000L) + (flags &&& ~~~0b0011001100000000000L) /// Represents the kind of a type parameter [] From 8aefe6c71308e7512b79e6142ffde678238800e7 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 25 Jun 2016 14:55:36 +0100 Subject: [PATCH 315/334] integrate and fix conflicts --- tests/fsharp/typecheck/sigs/neg96.bsl | 2 +- tests/fsharp/typecheck/sigs/neg97.bsl | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg96.bsl b/tests/fsharp/typecheck/sigs/neg96.bsl index d89370c98a1..99319706645 100644 --- a/tests/fsharp/typecheck/sigs/neg96.bsl +++ b/tests/fsharp/typecheck/sigs/neg96.bsl @@ -1,4 +1,4 @@ neg95.fs(11,9,11,21): typecheck error FS0039: The value or constructor 'StructRecord' is not defined -neg96.fs(14,17,14,18): typecheck error FS3204: This feature is deprecated. A 'use' binding may not be marked 'mutable'. \ No newline at end of file +neg96.fs(14,17,14,18): typecheck error FS3205: This feature is deprecated. A 'use' binding may not be marked 'mutable'. \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg97.bsl b/tests/fsharp/typecheck/sigs/neg97.bsl index 3bbeb123ffd..860f9fd6f37 100644 --- a/tests/fsharp/typecheck/sigs/neg97.bsl +++ b/tests/fsharp/typecheck/sigs/neg97.bsl @@ -1,10 +1,10 @@ neg97.fs(13,1,13,2): typecheck error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' -neg97.fs(16,9,16,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' +neg97.fs(16,9,16,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' -neg97.fs(20,9,20,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' +neg97.fs(20,9,20,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' -neg97.fs(25,9,25,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' +neg97.fs(25,9,25,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' -neg97.fs(30,9,30,10): typecheck error FS3204: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' +neg97.fs(30,9,30,10): typecheck error FS3207: Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' From a4032497a19be81bfbd6bf656fd98234931cf9ab Mon Sep 17 00:00:00 2001 From: Enrico Sada Date: Mon, 27 Jun 2016 19:11:35 +0200 Subject: [PATCH 316/334] update buildtools deps to https://github.com/dotnet/corefx/commit/96ae037b9359e2ab220bc5c370bf952b4234a039 --- BuildToolsVersion.txt | 2 +- DotnetCLIVersion.txt | 2 +- init-tools.cmd | 33 +++++++++++++++++++-------------- init-tools.sh | 28 ++++++++++++---------------- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt index 183e149f4c5..7a2bca562e7 100644 --- a/BuildToolsVersion.txt +++ b/BuildToolsVersion.txt @@ -1 +1 @@ -1.0.25-prerelease-00404-01 +1.0.25-prerelease-00517-05 diff --git a/DotnetCLIVersion.txt b/DotnetCLIVersion.txt index cbe430cd616..dd7bc318fa7 100644 --- a/DotnetCLIVersion.txt +++ b/DotnetCLIVersion.txt @@ -1 +1 @@ -1.0.0-rc2-002665 \ No newline at end of file +1.0.0-preview2-002733 \ No newline at end of file diff --git a/init-tools.cmd b/init-tools.cmd index d48ff4d1248..13d61e8ea4c 100644 --- a/init-tools.cmd +++ b/init-tools.cmd @@ -7,11 +7,11 @@ if [%TOOLRUNTIME_DIR%]==[] set TOOLRUNTIME_DIR=%~dp0Tools set DOTNET_PATH=%TOOLRUNTIME_DIR%\dotnetcli\ if [%DOTNET_CMD%]==[] set DOTNET_CMD=%DOTNET_PATH%dotnet.exe if [%BUILDTOOLS_SOURCE%]==[] set BUILDTOOLS_SOURCE=https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json -set /P BUILDTOOLS_VERSION=< %~dp0BuildToolsVersion.txt +set /P BUILDTOOLS_VERSION=< "%~dp0BuildToolsVersion.txt" set BUILD_TOOLS_PATH=%PACKAGES_DIR%Microsoft.DotNet.BuildTools\%BUILDTOOLS_VERSION%\lib\ set PROJECT_JSON_PATH=%TOOLRUNTIME_DIR%\%BUILDTOOLS_VERSION% set PROJECT_JSON_FILE=%PROJECT_JSON_PATH%\project.json -set PROJECT_JSON_CONTENTS={ "dependencies": { "Microsoft.DotNet.BuildTools": "%BUILDTOOLS_VERSION%" }, "frameworks": { "dnxcore50": { } } } +set PROJECT_JSON_CONTENTS={ "dependencies": { "Microsoft.DotNet.BuildTools": "%BUILDTOOLS_VERSION%" }, "frameworks": { "netcoreapp1.0": { } } } set BUILD_TOOLS_SEMAPHORE=%PROJECT_JSON_PATH%\init-tools.completed :: if force option is specified then clean the tool runtime and build tools package directory to force it to get recreated @@ -29,40 +29,45 @@ if exist "%BUILD_TOOLS_SEMAPHORE%" ( if exist "%TOOLRUNTIME_DIR%" rmdir /S /Q "%TOOLRUNTIME_DIR%" if NOT exist "%PROJECT_JSON_PATH%" mkdir "%PROJECT_JSON_PATH%" -echo %PROJECT_JSON_CONTENTS% > %PROJECT_JSON_FILE% -echo Running %0 > %INIT_TOOLS_LOG% +echo %PROJECT_JSON_CONTENTS% > "%PROJECT_JSON_FILE%" +echo Running %0 > "%INIT_TOOLS_LOG%" if exist "%DOTNET_CMD%" goto :afterdotnetrestore echo Installing dotnet cli... if NOT exist "%DOTNET_PATH%" mkdir "%DOTNET_PATH%" -set /p DOTNET_VERSION=< %~dp0DotnetCLIVersion.txt +set /p DOTNET_VERSION=< "%~dp0DotnetCLIVersion.txt" set DOTNET_ZIP_NAME=dotnet-dev-win-x64.%DOTNET_VERSION%.zip -set DOTNET_REMOTE_PATH=https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/%DOTNET_VERSION%/%DOTNET_ZIP_NAME% +set DOTNET_REMOTE_PATH=https://dotnetcli.blob.core.windows.net/dotnet/preview/Binaries/%DOTNET_VERSION%/%DOTNET_ZIP_NAME% set DOTNET_LOCAL_PATH=%DOTNET_PATH%%DOTNET_ZIP_NAME% -echo Installing '%DOTNET_REMOTE_PATH%' to '%DOTNET_LOCAL_PATH%' >> %INIT_TOOLS_LOG% -powershell -NoProfile -ExecutionPolicy unrestricted -Command "(New-Object Net.WebClient).DownloadFile('%DOTNET_REMOTE_PATH%', '%DOTNET_LOCAL_PATH%'); Add-Type -Assembly 'System.IO.Compression.FileSystem' -ErrorVariable AddTypeErrors; if ($AddTypeErrors.Count -eq 0) { [System.IO.Compression.ZipFile]::ExtractToDirectory('%DOTNET_LOCAL_PATH%', '%DOTNET_PATH%') } else { (New-Object -com shell.application).namespace('%DOTNET_PATH%').CopyHere((new-object -com shell.application).namespace('%DOTNET_LOCAL_PATH%').Items(),16) }" >> %INIT_TOOLS_LOG% +echo Installing '%DOTNET_REMOTE_PATH%' to '%DOTNET_LOCAL_PATH%' >> "%INIT_TOOLS_LOG%" +powershell -NoProfile -ExecutionPolicy unrestricted -Command "$retryCount = 0; $success = $false; do { try { (New-Object Net.WebClient).DownloadFile('%DOTNET_REMOTE_PATH%', '%DOTNET_LOCAL_PATH%'); $success = $true; } catch { if ($retryCount -ge 6) { throw; } else { $retryCount++; Start-Sleep -Seconds (5 * $retryCount); } } } while ($success -eq $false); Add-Type -Assembly 'System.IO.Compression.FileSystem' -ErrorVariable AddTypeErrors; if ($AddTypeErrors.Count -eq 0) { [System.IO.Compression.ZipFile]::ExtractToDirectory('%DOTNET_LOCAL_PATH%', '%DOTNET_PATH%') } else { (New-Object -com shell.application).namespace('%DOTNET_PATH%').CopyHere((new-object -com shell.application).namespace('%DOTNET_LOCAL_PATH%').Items(),16) }" >> "%INIT_TOOLS_LOG%" if NOT exist "%DOTNET_LOCAL_PATH%" ( echo ERROR: Could not install dotnet cli correctly. See '%INIT_TOOLS_LOG%' for more details. - goto :EOF + exit /b 1 ) :afterdotnetrestore if exist "%BUILD_TOOLS_PATH%" goto :afterbuildtoolsrestore echo Restoring BuildTools version %BUILDTOOLS_VERSION%... -echo Running: "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> %INIT_TOOLS_LOG% -call "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> %INIT_TOOLS_LOG% +echo Running: "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> "%INIT_TOOLS_LOG%" +call "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages %PACKAGES_DIR% --source "%BUILDTOOLS_SOURCE%" >> "%INIT_TOOLS_LOG%" if NOT exist "%BUILD_TOOLS_PATH%init-tools.cmd" ( echo ERROR: Could not restore build tools correctly. See '%INIT_TOOLS_LOG%' for more details. - goto :EOF + exit /b 1 ) :afterbuildtoolsrestore echo Initializing BuildTools ... -echo Running: "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> %INIT_TOOLS_LOG% -call "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> %INIT_TOOLS_LOG% +echo Running: "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> "%INIT_TOOLS_LOG%" +call "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> "%INIT_TOOLS_LOG%" +set INIT_TOOLS_ERRORLEVEL=%ERRORLEVEL% +if not [%INIT_TOOLS_ERRORLEVEL%]==[0] ( + echo ERROR: An error occured when trying to initialize the tools. Please check '%INIT_TOOLS_LOG%' for more details. + exit /b %INIT_TOOLS_ERRORLEVEL% +) :: Create sempahore file echo Done initializing tools. diff --git a/init-tools.sh b/init-tools.sh index 033a652cde5..57564e7827a 100644 --- a/init-tools.sh +++ b/init-tools.sh @@ -12,7 +12,7 @@ __DOTNET_TOOLS_VERSION=$(cat $__scriptpath/DotnetCLIVersion.txt) __BUILD_TOOLS_PATH=$__PACKAGES_DIR/Microsoft.DotNet.BuildTools/$__BUILD_TOOLS_PACKAGE_VERSION/lib __PROJECT_JSON_PATH=$__TOOLRUNTIME_DIR/$__BUILD_TOOLS_PACKAGE_VERSION __PROJECT_JSON_FILE=$__PROJECT_JSON_PATH/project.json -__PROJECT_JSON_CONTENTS="{ \"dependencies\": { \"Microsoft.DotNet.BuildTools\": \"$__BUILD_TOOLS_PACKAGE_VERSION\" }, \"frameworks\": { \"dnxcore50\": { } } }" +__PROJECT_JSON_CONTENTS="{ \"dependencies\": { \"Microsoft.DotNet.BuildTools\": \"$__BUILD_TOOLS_PACKAGE_VERSION\" }, \"frameworks\": { \"netcoreapp1.0\": { } } }" OSName=$(uname -s) case $OSName in @@ -24,14 +24,12 @@ case $OSName in Linux) OS=Linux - source /etc/os-release - if [ "$ID" == "centos" -o "$ID" == "rhel" ]; then - __DOTNET_PKG=dotnet-dev-centos-x64 - elif [ "$ID" == "ubuntu" -o "$ID" == "debian" ]; then - __DOTNET_PKG=dotnet-dev-ubuntu-x64 + if [ ! -e /etc/os-release ]; then + echo "Cannot determine Linux distribution, asuming Ubuntu 14.04." + __DOTNET_PKG=dotnet-dev-ubuntu.14.04-x64 else - echo "Unsupported Linux distribution '$ID' detected. Downloading ubuntu-x64 tools." - __DOTNET_PKG=dotnet-dev-ubuntu-x64 + source /etc/os-release + __DOTNET_PKG="dotnet-dev-$ID.$VERSION_ID-x64" fi ;; @@ -47,7 +45,7 @@ if [ ! -e $__PROJECT_JSON_FILE ]; then echo "Running: $__scriptpath/init-tools.sh" > $__init_tools_log if [ ! -e $__DOTNET_PATH ]; then echo "Installing dotnet cli..." - __DOTNET_LOCATION="https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz" + __DOTNET_LOCATION="https://dotnetcli.blob.core.windows.net/dotnet/preview/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz" # curl has HTTPS CA trust-issues less often than wget, so lets try that first. echo "Installing '${__DOTNET_LOCATION}' to '$__DOTNET_PATH/dotnet.tar'" >> $__init_tools_log which curl > /dev/null 2> /dev/null @@ -55,16 +53,10 @@ if [ ! -e $__PROJECT_JSON_FILE ]; then mkdir -p "$__DOTNET_PATH" wget -q -O $__DOTNET_PATH/dotnet.tar ${__DOTNET_LOCATION} else - curl -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar ${__DOTNET_LOCATION} + curl --retry 10 -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar ${__DOTNET_LOCATION} fi cd $__DOTNET_PATH tar -xf $__DOTNET_PATH/dotnet.tar - if [ -n "$BUILDTOOLS_OVERRIDE_RUNTIME" ]; then - find $__DOTNET_PATH -name *.ni.* | xargs rm 2>/dev/null - cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin - cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin/dnx - cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/runtime/coreclr - fi cd $__scriptpath fi @@ -82,6 +74,10 @@ if [ ! -e $__PROJECT_JSON_FILE ]; then echo "Initializing BuildTools..." echo "Running: $__BUILD_TOOLS_PATH/init-tools.sh $__scriptpath $__DOTNET_CMD $__TOOLRUNTIME_DIR" >> $__init_tools_log $__BUILD_TOOLS_PATH/init-tools.sh $__scriptpath $__DOTNET_CMD $__TOOLRUNTIME_DIR >> $__init_tools_log + if [ "$?" != "0" ]; then + echo "ERROR: An error occured when trying to initialize the tools. Please check '$__init_tools_log' for more details." + exit 1 + fi echo "Done initializing tools." else echo "Tools are already initialized" From 8dcde4fb1cccba5697d3d5f58855d6319033e365 Mon Sep 17 00:00:00 2001 From: Enrico Sada Date: Mon, 27 Jun 2016 19:14:21 +0200 Subject: [PATCH 317/334] let's used .NET Core RTM ( version 1.0.0-preview2-003121 ) --- DotnetCLIVersion.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DotnetCLIVersion.txt b/DotnetCLIVersion.txt index dd7bc318fa7..637c64f4b15 100644 --- a/DotnetCLIVersion.txt +++ b/DotnetCLIVersion.txt @@ -1 +1 @@ -1.0.0-preview2-002733 \ No newline at end of file +1.0.0-preview2-003121 \ No newline at end of file From a2efe03096d2800100b7d5499457c63a92ae9935 Mon Sep 17 00:00:00 2001 From: Enrico Sada Date: Mon, 27 Jun 2016 20:36:29 +0200 Subject: [PATCH 318/334] update deps to .NET Core 1.0 RTM System.Security.Cryptography.Algorithms depends on System.Security.Cryptography.Primitives, removed explicit Microsoft.NETCore.Runtime.CoreCLR 1.0.2 depends on Microsoft.NETCore.Windows.ApiSets 1.0.1, remove explicit System.Reflection.Emit 4.0.1 depends on System.Reflection.Emit.ILGeneration 4.0.1, removed explicit bump from System.Linq.Expressions 4.0.11-rc2-23911 to version 4.1.0 ( 1.0 RTM ) bump from System.Text.RegularExpressions 4.0.12-rc2-24027 to 4.1.0 ( 1.0 RTM ) support osx is 10.11 now, instead of 10.10 update System.Runtime.InteropServices.PInvoke to 4.0.0-rc2-24027 ?? no RTM?? --- src/fsharp/FSharp.Build/project.json | 4 +- ...rosoft.FSharp.Compiler.Host.netcore.nuspec | 11 ++-- .../project.json | 16 +++--- .../Microsoft.FSharp.Compiler.netcore.nuspec | 54 +++++++++---------- src/fsharp/FSharp.Compiler/project.json | 44 ++++++++------- src/fsharp/FSharp.Core/project.json | 54 +++++++++---------- src/fsharp/Fsc/project.json | 12 ++--- .../Microsoft.FSharp.Core.netcore.nuspec | 38 ++++++------- src/fsharp/fsi/project.json | 22 ++++---- 9 files changed, 125 insertions(+), 130 deletions(-) diff --git a/src/fsharp/FSharp.Build/project.json b/src/fsharp/FSharp.Build/project.json index 49e360894f7..40df8833427 100644 --- a/src/fsharp/FSharp.Build/project.json +++ b/src/fsharp/FSharp.Build/project.json @@ -12,11 +12,11 @@ "System.AppContext": "4.1.0-rc2-24027", "System.Diagnostics.Tools": "4.0.1-rc2-24027", "System.Reflection.Primitives": "4.0.1-rc2-24027", - "System.Resources.ResourceManager": "4.0.1-rc2-24027", + "System.Resources.ResourceManager": "4.0.1-rc2-24027" }, "frameworks": { "dnxcore50": { - "imports": "portable-net45+win8", + "imports": "portable-net45+win8" } } } \ No newline at end of file diff --git a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/Microsoft.FSharp.Compiler.Host.netcore.nuspec b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/Microsoft.FSharp.Compiler.Host.netcore.nuspec index c389117159b..db6eb5ef397 100644 --- a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/Microsoft.FSharp.Compiler.Host.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/Microsoft.FSharp.Compiler.Host.netcore.nuspec @@ -3,10 +3,10 @@ Microsoft.FSharp.Compiler.Host.netcore - netcore compatible version of the fsharp compiler fsc.exe. + .NET Core compatible version of the fsharp compiler fsc.exe. Supported Platforms: - - .NET Core (netstandard1.5) + - .NET Core (netstandard1.6) en-US true @@ -16,12 +16,11 @@ $projectUrl$ $tags$ - - - + + + - diff --git a/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json b/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json index 12f15a49c0f..4e1804794a8 100644 --- a/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json +++ b/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json @@ -1,19 +1,19 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Reflection.TypeExtensions": "4.1.0-rc2-24027", - "System.Runtime.Loader": "4.0.0-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "NETStandard.Library": "1.6.0", + "System.Linq.Expressions": "4.1.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Loader": "4.0.0", + "System.Threading.Thread": "4.0.0" }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } diff --git a/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec b/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec index beff3bf51c3..f7fc7c540ae 100644 --- a/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec @@ -3,8 +3,8 @@ Microsoft.FSharp.Compiler.netcore - netcore compatible version of the fsharp compiler fsc.exe. - Supported Platforms: - .NET Core (.netstandard1.5) + .NET Core compatible version of the fsharp compiler fsc.exe. + Supported Platforms: - .NET Core (.netstandard1.6) en-US true @@ -14,37 +14,35 @@ $projectUrl$ $tags$ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + diff --git a/src/fsharp/FSharp.Compiler/project.json b/src/fsharp/FSharp.Compiler/project.json index ac47a5e454c..607931c96ad 100644 --- a/src/fsharp/FSharp.Compiler/project.json +++ b/src/fsharp/FSharp.Compiler/project.json @@ -1,36 +1,34 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", - "System.Collections.Immutable":"1.2.0-rc2-24027", - "System.Diagnostics.Process": "4.1.0-rc2-24027", - "System.Diagnostics.TraceSource": "4.0.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Linq.Queryable": "4.0.1-rc2-24027", - "System.Net.Requests": "4.0.11-rc2-24027", - "System.Reflection.Emit": "4.0.1-rc2-24027", - "System.Reflection.Emit.ILGeneration": "4.0.1-rc2-24027", - "System.Reflection.Metadata": "1.3.0-rc2-24027", - "System.Reflection.TypeExtensions": "4.1.0-rc2-24027", - "System.Runtime.InteropServices": "4.1.0-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "NETStandard.Library": "1.6.0", + "System.Collections.Immutable":"1.2.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Linq.Expressions": "4.1.0", + "System.Linq.Queryable": "4.0.1", + "System.Net.Requests": "4.0.11", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", "System.Runtime.InteropServices.PInvoke": "4.0.0-rc2-24027", - "System.Runtime.Loader": "4.0.0-rc2-24027", - "System.Security.Cryptography.Algorithms": "4.1.0-rc2-24027", - "System.Security.Cryptography.Primitives": "4.0.0-rc2-24027", - "System.Threading.Tasks.Parallel": "4.0.1-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", - "System.Threading.ThreadPool": "4.0.10-rc2-24027", - "Microsoft.DiaSymReader.PortablePdb": "1.0.0-rc-60301", - "Microsoft.DiaSymReader": "1.0.7", + "System.Runtime.Loader": "4.0.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Tasks.Parallel": "4.0.1", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "Microsoft.DiaSymReader.PortablePdb": "1.1.0", + "Microsoft.DiaSymReader": "1.0.8" }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { + "netstandard1.6": { "imports": "portable-net45+win8" } } diff --git a/src/fsharp/FSharp.Core/project.json b/src/fsharp/FSharp.Core/project.json index d3ee8bd7886..dbec75ef1bb 100644 --- a/src/fsharp/FSharp.Core/project.json +++ b/src/fsharp/FSharp.Core/project.json @@ -1,38 +1,38 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "Microsoft.NETCore.Runtime": "1.0.2-rc2-24027", - "System.Collections": "4.0.11-rc2-24027", - "System.Console": "4.0.0-rc2-24027", - "System.Diagnostics.Debug": "4.0.11-rc2-24027", - "System.Diagnostics.Tools": "4.0.1-rc2-24027", - "System.Globalization": "4.0.11-rc2-24027", - "System.IO": "4.1.0-rc2-24027", - "System.Linq": "4.1.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Linq.Queryable": "4.0.1-rc2-24027", - "System.Net.Requests": "4.0.11-rc2-24027", - "System.Reflection": "4.1.0-rc2-24027", - "System.Reflection.Extensions": "4.0.1-rc2-24027", - "System.Resources.ResourceManager":"4.0.1-rc2-24027", - "System.Runtime": "4.1.0-rc2-24027", - "System.Runtime.Extensions": "4.1.0-rc2-24027", - "System.Runtime.Numerics": "4.0.1-rc2-24027", - "System.Text.RegularExpressions": "4.0.12-rc2-24027", - "System.Threading": "4.0.11-rc2-24027", - "System.Threading.Tasks": "4.0.11-rc2-24027", - "System.Threading.Tasks.Parallel": "4.0.1-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", - "System.Threading.ThreadPool": "4.0.10-rc2-24027", - "System.Threading.Timer": "4.0.1-rc2-24027" + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Runtime": "1.0.2", + "System.Collections": "4.0.11", + "System.Console": "4.0.0", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Linq.Queryable": "4.0.1", + "System.Net.Requests": "4.0.11", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager":"4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Parallel": "4.0.1", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "System.Threading.Timer": "4.0.1" }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } diff --git a/src/fsharp/Fsc/project.json b/src/fsharp/Fsc/project.json index 1a1ee3bbd68..230aac3ada0 100644 --- a/src/fsharp/Fsc/project.json +++ b/src/fsharp/Fsc/project.json @@ -1,17 +1,17 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Reflection.Metadata": "1.3.0-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "NETStandard.Library": "1.6.0", + "System.Linq.Expressions": "4.1.0", + "System.Reflection.Metadata": "1.3.0" }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } diff --git a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec b/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec index ddcb33421ab..d62e9eb48a7 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec +++ b/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec @@ -3,8 +3,8 @@ Microsoft.FSharp.Core.netcore - netcore compatible version of the fsharp core library fsharp.core.dll - Supported Platforms: - .NET Core (netstandard1.5) + .NET Core compatible version of the fsharp core library fsharp.core.dll + Supported Platforms: - .NET Core (netstandard1.6) en-US true @@ -15,27 +15,27 @@ $tags$ - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + diff --git a/src/fsharp/fsi/project.json b/src/fsharp/fsi/project.json index 824fba60719..ab1bfc4de17 100644 --- a/src/fsharp/fsi/project.json +++ b/src/fsharp/fsi/project.json @@ -1,22 +1,22 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", - "System.Diagnostics.Process": "4.1.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Reflection.Emit": "4.0.1-rc2-24027", - "System.Reflection.TypeExtensions": "4.1.0-rc2-24027", - "System.Runtime.Loader": "4.0.0-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", - "System.Reflection.Metadata": "1.3.0-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "NETStandard.Library": "1.6.0", + "System.Diagnostics.Process": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Loader": "4.0.0", + "System.Threading.Thread": "4.0.0", + "System.Reflection.Metadata": "1.3.0" }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } From 3cd1705685f1171cd64cce30762e5dd17f4f4653 Mon Sep 17 00:00:00 2001 From: Enrico Sada Date: Mon, 27 Jun 2016 20:45:44 +0200 Subject: [PATCH 319/334] fix tf --- .../Microsoft.FSharp.Core.netcore.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec b/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec index d62e9eb48a7..f4dcefd9a8c 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec +++ b/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec @@ -14,7 +14,7 @@ $projectUrl$ $tags$ - + From eeef150725a8e313db8019fe4a199d31e60f6864 Mon Sep 17 00:00:00 2001 From: KevinRansom Date: Tue, 28 Jun 2016 10:17:29 +0100 Subject: [PATCH 320/334] Update to rtm coreclr libraries --- packages.config | 8 +- src/absil/ilwritepdb.fs | 26 +- .../FSharp.Compiler-proto.fsproj | 8 +- .../Microsoft.FSharp.Compiler.netcore.nuspec | 2 +- .../FSharp.Compiler/FSharp.Compiler.fsproj | 10 +- src/fsharp/FSharp.Compiler/project.json | 2 +- src/fsharp/FSharp.Core.Unittests/project.json | 23 +- src/fsharp/FSharp.Core/project.json | 2 +- .../FSharp.LanguageService.Compiler.fsproj | 8 +- src/fsharp/Fsc/project.json | 2 +- src/fsharp/fsi/project.json | 2 +- tests/BuildTestTools.cmd | 16 +- tests/fsharp/project.json | 60 +- .../bin/System.Reflection.Metadata.dll | Bin 408808 -> 432872 bytes .../bin/System.Reflection.Metadata.xml | 3264 ++++++++++++----- 15 files changed, 2493 insertions(+), 940 deletions(-) diff --git a/packages.config b/packages.config index c8c0d183d1d..f9559ed7b88 100644 --- a/packages.config +++ b/packages.config @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs index cf397a0041c..c0cb29b7766 100644 --- a/src/absil/ilwritepdb.fs +++ b/src/absil/ilwritepdb.fs @@ -9,7 +9,6 @@ open System.IO open System.Reflection open System.Reflection.Metadata open System.Reflection.Metadata.Ecma335 -open System.Reflection.Metadata.Ecma335.Blobs open System.Reflection.PortableExecutable open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL.IL @@ -222,10 +221,10 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) = writer.WriteByte(byte(separator)) for part in name.Split( [| separator |] ) do - let partIndex = MetadataTokens.GetHeapOffset(BlobHandle.op_Implicit(metadata.GetBlobUtf8(part))) + let partIndex = MetadataTokens.GetHeapOffset(BlobHandle.op_Implicit(metadata.GetOrAddBlobUTF8(part))) writer.WriteCompressedInteger(int(partIndex)) - metadata.GetBlob(writer); + metadata.GetOrAddBlob(writer); let corSymLanguageTypeFSharp = System.Guid(0xAB4F38C9u, 0xB6E6us, 0x43baus, 0xBEuy, 0x3Buy, 0x58uy, 0x08uy, 0x0Buy, 0x2Cuy, 0xCCuy, 0xE3uy) let documentIndex = @@ -236,14 +235,14 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) = match checkSum doc.File with | Some (hashAlg, checkSum) -> serializeDocumentName doc.File, - metadata.GetGuid(hashAlg), - metadata.GetBlob(checkSum.ToImmutableArray()), - metadata.GetGuid(corSymLanguageTypeFSharp) + metadata.GetOrAddGuid(hashAlg), + metadata.GetOrAddBlob(checkSum.ToImmutableArray()), + metadata.GetOrAddGuid(corSymLanguageTypeFSharp) | None -> serializeDocumentName doc.File, - metadata.GetGuid(System.Guid.Empty), - metadata.GetBlob(ImmutableArray.Empty), - metadata.GetGuid(corSymLanguageTypeFSharp) + metadata.GetOrAddGuid(System.Guid.Empty), + metadata.GetOrAddBlob(ImmutableArray.Empty), + metadata.GetOrAddGuid(corSymLanguageTypeFSharp) |> metadata.AddDocument index.Add(doc.File, handle) index @@ -332,7 +331,7 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) = previousNonHiddenStartLine <- sps.[i].Line previousNonHiddenStartColumn <- sps.[i].Column - getDocumentHandle singleDocumentIndex, metadata.GetBlob(builder) + getDocumentHandle singleDocumentIndex, metadata.GetOrAddBlob(builder) // Write the scopes let mutable lastLocalVariableHandle = Unchecked.defaultof @@ -347,7 +346,7 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) = scope.StartOffset, scope.EndOffset - scope.StartOffset) |>ignore for localVariable in scope.Locals do - lastLocalVariableHandle <- metadata.AddLocalVariable(LocalVariableAttributes.None, localVariable.Index, metadata.GetString(localVariable.Name)) + lastLocalVariableHandle <- metadata.AddLocalVariable(LocalVariableAttributes.None, localVariable.Index, metadata.GetOrAddString(localVariable.Name)) scope.Children |> Array.iter (writePdbScope false) writePdbScope true minfo.RootScope @@ -358,10 +357,9 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) = | None -> MetadataTokens.MethodDefinitionHandle(0) | Some x -> MetadataTokens.MethodDefinitionHandle(x) - let pdbContentId = ContentId(info.ModuleID, BitConverter.GetBytes(info.Timestamp)) - let serializer = StandaloneDebugMetadataSerializer(metadata, externalRowCounts, entryPoint, false) + let serializer = PortablePdbBuilder(metadata, externalRowCounts, entryPoint, null ) let blobBuilder = new BlobBuilder() - serializer.SerializeMetadata(blobBuilder, (fun builder -> pdbContentId)) |> ignore + serializer.Serialize(blobBuilder) |> ignore reportTime showTimes "PDB: Created" use portablePdbStream = new FileStream(fpdb, FileMode.Create, FileAccess.ReadWrite) diff --git a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj index 7eb20114970..8e5334f9b90 100644 --- a/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj +++ b/src/fsharp/FSharp.Compiler-proto/FSharp.Compiler-proto.fsproj @@ -473,10 +473,10 @@ - ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.0.0-rc-60301\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll - ..\..\..\packages\Microsoft.DiaSymReader.1.0.7\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - ..\..\..\packages\System.Reflection.Metadata.1.3.0-beta-23816\lib\portable-net45+win8\System.Reflection.Metadata.dll - ..\..\..\packages\System.Collections.Immutable.1.2.0-rc3-23805\lib\portable-net45+win8+wp8+wpa81 + ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + ..\..\..\packages\Microsoft.DiaSymReader.1.0.8\lib\portable-net45+win8\Microsoft.DiaSymReader.dll + ..\..\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dll + ..\..\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81 diff --git a/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec b/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec index f7fc7c540ae..b9b73220b89 100644 --- a/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec +++ b/src/fsharp/FSharp.Compiler.netcore.nuget/Microsoft.FSharp.Compiler.netcore.nuspec @@ -25,7 +25,7 @@ - + diff --git a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj index 9ba9ef50d9f..0e8e0e69532 100644 --- a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj +++ b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj @@ -29,7 +29,7 @@ $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci false - false + false @@ -523,10 +523,10 @@ - ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.0.0-rc-60301\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll - ..\..\..\packages\Microsoft.DiaSymReader.1.0.7\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - ..\..\..\packages\System.Reflection.Metadata.1.3.0-beta-23816\lib\portable-net45+win8\System.Reflection.Metadata.dll - ..\..\..\packages\System.Collections.Immutable.1.2.0-rc3-23805\lib\portable-net45+win8+wp8+wpa81 + ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + ..\..\..\packages\Microsoft.DiaSymReader.1.0.8\lib\portable-net45+win8\Microsoft.DiaSymReader.dll + ..\..\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dll + ..\..\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81 diff --git a/src/fsharp/FSharp.Compiler/project.json b/src/fsharp/FSharp.Compiler/project.json index 607931c96ad..65d0f71c296 100644 --- a/src/fsharp/FSharp.Compiler/project.json +++ b/src/fsharp/FSharp.Compiler/project.json @@ -9,7 +9,7 @@ "System.Linq.Queryable": "4.0.1", "System.Net.Requests": "4.0.11", "System.Reflection.Emit": "4.0.1", - "System.Reflection.Metadata": "1.3.0", + "System.Reflection.Metadata": "1.4.1-beta-24227-04", "System.Reflection.TypeExtensions": "4.1.0", "System.Runtime.InteropServices": "4.1.0", "System.Runtime.InteropServices.PInvoke": "4.0.0-rc2-24027", diff --git a/src/fsharp/FSharp.Core.Unittests/project.json b/src/fsharp/FSharp.Core.Unittests/project.json index 2ab29cb86b4..29385c5b8a9 100644 --- a/src/fsharp/FSharp.Core.Unittests/project.json +++ b/src/fsharp/FSharp.Core.Unittests/project.json @@ -1,23 +1,24 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Linq.Queryable": "4.0.1-rc2-24027", - "System.Reflection.Emit": "4.0.1-rc2-24027", - "System.Runtime.Loader": "4.0.0-rc2-24027", - "System.Net.Requests": "4.0.11-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "NETStandard.Library": "1.6.0", + "System.Linq.Expressions": "4.1.0", + "System.Linq.Queryable": "4.0.1", + "System.Net.Requests": "4.0.11", + "System.Reflection.Emit": "4.0.1", + "System.Runtime.Loader": "4.0.0", + "System.Text.RegularExpressions": "4.1.0", "System.Threading.Tasks.Parallel": "4.0.1-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", - "System.Threading.ThreadPool": "4.0.10-rc2-24027", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", }, "runtimes": { "win7-x86": { }, "win7-x64": { }, - "osx.10.10-x64": { }, + "osx.10.11-x64": { }, "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } diff --git a/src/fsharp/FSharp.Core/project.json b/src/fsharp/FSharp.Core/project.json index dbec75ef1bb..baca2d8e8e5 100644 --- a/src/fsharp/FSharp.Core/project.json +++ b/src/fsharp/FSharp.Core/project.json @@ -1,7 +1,7 @@ { "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Runtime": "1.0.2", + "Microsoft.NETCore.Runtime": "1.0.2-rc4-24201-00", "System.Collections": "4.0.11", "System.Console": "4.0.0", "System.Diagnostics.Debug": "4.0.11", diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index bc4892ad7a0..6044b34a6b6 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -582,10 +582,10 @@ - ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.0.0-rc-60301\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll - ..\..\..\packages\Microsoft.DiaSymReader.1.0.7\lib\portable-net45+win8\Microsoft.DiaSymReader.dll - ..\..\..\packages\System.Reflection.Metadata.1.3.0-beta-23816\lib\portable-net45+win8\System.Reflection.Metadata.dll - ..\..\..\packages\System.Collections.Immutable.1.2.0-rc3-23805\lib\portable-net45+win8+wp8+wpa81 + ..\..\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dll + ..\..\..\packages\Microsoft.DiaSymReader.1.0.8\lib\portable-net45+win8\Microsoft.DiaSymReader.dll + ..\..\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dll + ..\..\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81 {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core diff --git a/src/fsharp/Fsc/project.json b/src/fsharp/Fsc/project.json index 230aac3ada0..b246aa367ea 100644 --- a/src/fsharp/Fsc/project.json +++ b/src/fsharp/Fsc/project.json @@ -3,7 +3,7 @@ "Microsoft.NETCore.Platforms": "1.0.1", "NETStandard.Library": "1.6.0", "System.Linq.Expressions": "4.1.0", - "System.Reflection.Metadata": "1.3.0" + "System.Reflection.Metadata": "1.4.1-beta-24227-04" }, "runtimes": { "win7-x86": { }, diff --git a/src/fsharp/fsi/project.json b/src/fsharp/fsi/project.json index ab1bfc4de17..d32dabdd033 100644 --- a/src/fsharp/fsi/project.json +++ b/src/fsharp/fsi/project.json @@ -8,7 +8,7 @@ "System.Reflection.TypeExtensions": "4.1.0", "System.Runtime.Loader": "4.0.0", "System.Threading.Thread": "4.0.0", - "System.Reflection.Metadata": "1.3.0" + "System.Reflection.Metadata": "1.4.1-beta-24227-04" }, "runtimes": { "win7-x86": { }, diff --git a/tests/BuildTestTools.cmd b/tests/BuildTestTools.cmd index 9c220651c84..839be2c6275 100644 --- a/tests/BuildTestTools.cmd +++ b/tests/BuildTestTools.cmd @@ -69,20 +69,20 @@ if '%BUILD_CORECLR%' == '1' ( ) rem deploy x86 version of compiler and dependencies - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy x64 version of compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy linux version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy osx version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.5/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet echo "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y xcopy "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y diff --git a/tests/fsharp/project.json b/tests/fsharp/project.json index 5090c2c45fb..c9d1f44c1a1 100644 --- a/tests/fsharp/project.json +++ b/tests/fsharp/project.json @@ -1,25 +1,49 @@ { "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027", - "NETStandard.Library": "1.5.0-rc2-24027", + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Runtime": "1.0.2-rc4-24201-00", + "NETStandard.Library": "1.6.0", + "System.Collections": "4.0.11", + "System.Collections.Immutable":"1.2.0", + "System.Console": "4.0.0", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.Tools": "4.0.1", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Linq.Queryable": "4.0.1", + "System.Net.Requests": "4.0.11", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Metadata": "1.4.1-beta-24227-04", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.PInvoke": "4.0.0-rc2-24027", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Parallel": "4.0.1", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "System.Threading.Timer": "4.0.1", + + "Microsoft.DiaSymReader.PortablePdb": "1.1.0", + "Microsoft.DiaSymReader": "1.0.8", + "Microsoft.NETCore.Runtime.CoreCLR": "1.0.2-rc2-24027", "Microsoft.NETCore.TestHost": "1.0.0-rc2-24027", "Microsoft.NETCore.ConsoleHost": "1.0.0-rc2-24027", - "System.Collections.Immutable":"1.2.0-rc2-24027", - "System.Diagnostics.Process": "4.1.0-rc2-24027", - "System.Diagnostics.TraceSource": "4.0.0-rc2-24027", - "System.Linq.Expressions": "4.0.11-rc2-24027", - "System.Reflection.Emit": "4.0.1-rc2-24027", - "System.Reflection.Emit.ILGeneration": "4.0.1-rc2-24027", - "System.Reflection.Metadata": "1.3.0-rc2-24027", - "System.Reflection.TypeExtensions": "4.1.0-rc2-24027", - "System.Runtime.InteropServices": "4.1.0-rc2-24027", - "System.Runtime.InteropServices.PInvoke": "4.0.0-rc2-24027", - "System.Runtime.Loader": "4.0.0-rc2-24027", - "System.Security.Cryptography.Algorithms": "4.1.0-rc2-24027", - "System.Security.Cryptography.Primitives": "4.0.0-rc2-24027", - "System.Threading.Thread": "4.0.0-rc2-24027", - "System.Threading.ThreadPool": "4.0.10-rc2-24027" + "System.Reflection.Emit.ILGeneration": "4.0.2", + "System.Security.Cryptography.Primitives": "4.0.1", }, "runtimes": { "win7-x86": { }, @@ -28,6 +52,6 @@ "ubuntu.14.04-x64": { } }, "frameworks": { - "netstandard1.5": { } + "netstandard1.6": { } } } diff --git a/tests/fsharpqa/testenv/bin/System.Reflection.Metadata.dll b/tests/fsharpqa/testenv/bin/System.Reflection.Metadata.dll index cb4cdd3431ca4e308d0c17f3447255babf041999..67c3785946d3fd8183e06efd955178efb5be73f9 100644 GIT binary patch literal 432872 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≥ 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%0D<94 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