呵呵
代码如下:
1
using
System;
2
using
System.Text;
3
using
System.Runtime.InteropServices;
4![None.gif](/Images/OutliningIndicators/None.gif)
5
namespace
JillZhang.Security
6![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7
public enum Store
8![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
9
USE_NACHINE_STORE=1,USE_USER_STORE
10
};
11
public class DataProtector
12![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
13
14
[DllImport("Crypt32.dll",SetLastError=true,CharSet=System.Runtime.InteropServices.CharSet.Auto)]
15
private static extern bool CryptProtectData
16
(
17
ref DATA_BLOB pDataIn,
18
String szDataDecr,
19
ref DATA_BLOB pOptionEntropy,
20
IntPtr pvReserved,
21
ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct,
22
int dwFlags,
23
ref DATA_BLOB pDataOut
24
);
25![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
[DllImport("Crypt32.dll",SetLastError=true,CharSet=System.Runtime.InteropServices.CharSet.Auto)]
27
private static extern bool CryptUnprotectData
28
(
29
ref DATA_BLOB pDataIn,
30
String szDataDecr,
31
ref DATA_BLOB pOptionEntropy,
32
IntPtr pvReserved,
33
ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct,
34
int dwFlags,
35
ref DATA_BLOB pDataOut
36
);
37![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
38
[DllImport("kernel32.dll",CharSet=System.Runtime.InteropServices.CharSet.Auto)]
39
private unsafe static extern int FormatMessage
40
(
41
int dwFlags,
42
ref IntPtr lpSource,
43
int dwMessageId,
44
int dwLanguageId,
45
ref String lpBuffer,
46
int nSize,
47
IntPtr *Arguments
48
);
49
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
50
internal struct DATA_BLOB
51![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
52
public int cbData;
53
public IntPtr pbData;
54
}
55
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
56
internal struct CRYPTPROTECT_PROMPTSTRUCT
57![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
public int cbSize;
59
public int dwPromptFlags;
60
public IntPtr hwndApp;
61
public String szPrompt;
62
}
63
static private IntPtr NullPtr=((IntPtr)((int)(0)));
64
private const int CRYPTPROTECT_UI_FORBIDDEN=0x1;
65
private const int CRYPTPROTECT_LOCAL_MACHINE=0x4;
66
67
private Store store;
68
public DataProtector(Store tempStore)
69![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
70
store=tempStore;
71
}
72
public byte[] Encrypt(byte[] plainText,byte[] optionalEntropy)
73![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
74
bool reVal=false;
75
DATA_BLOB plainTextBlob = new DATA_BLOB();
76
DATA_BLOB cipherTextBlob=new DATA_BLOB();
77
DATA_BLOB entropyBlob = new DATA_BLOB();
78
CRYPTPROTECT_PROMPTSTRUCT prompt=new CRYPTPROTECT_PROMPTSTRUCT();
79
InitPromptstruct(ref prompt);
80
int dwFlags;
81
try
82![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
83
try
84![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
85
int byteSize=plainText.Length;
86
plainTextBlob.pbData=Marshal.AllocHGlobal(byteSize);
87
if(IntPtr.Zero==plainTextBlob.pbData)
88![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
89
throw new Exception("Unable to allocate plaintext buffer:");
90
}
91
plainTextBlob.cbData=byteSize;
92
Marshal.Copy(plainText,0,plainTextBlob.pbData,byteSize);
93
}
94
catch(Exception ex)
95![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
96
throw new Exception("Exception marshalling data.:"+ex.Message);
97
}
98
if(Store.USE_NACHINE_STORE==store)
99![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
100
//计算机存储区
101
dwFlags=CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
102
if(null==optionalEntropy)
103![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
104
optionalEntropy=new byte[0];
105
}
106
try
107![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
108
int byteSize=optionalEntropy.Length;
109
entropyBlob.pbData=Marshal.AllocHGlobal(optionalEntropy.Length);
110
if(IntPtr.Zero==entropyBlob.pbData)
111![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
112
throw new Exception("Unable to allocate entropy data buffer.");
113
}
114
Marshal.Copy(optionalEntropy,0,entropyBlob.pbData,byteSize);
115
entropyBlob.cbData=byteSize;
116
}
117
catch(Exception ex)
118![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
119
throw new Exception("Exception entropy marshalling data."+ex.Message);
120
}
121
}
122
else
123![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
124
dwFlags=CRYPTPROTECT_UI_FORBIDDEN;
125
}
126
reVal=CryptProtectData(ref plainTextBlob,"",ref entropyBlob,IntPtr.Zero,ref prompt,dwFlags,ref cipherTextBlob);
127
if(false == reVal)
128![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
129
throw new Exception("Encryption failed."+GetErrorMessage(Marshal.GetLastWin32Error()));
130
}
131
}
132
catch(Exception ex)
133![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
134
throw new Exception("Exception encrypting:"+ex.Message);
135
}
136
byte[] cipherText = new byte[cipherTextBlob.cbData];
137
Marshal.Copy(cipherTextBlob.pbData,cipherText,0,cipherTextBlob.cbData);
138
return cipherText;
139
}
140
public byte[] Decrypt(byte[] ciperText,byte[] optionalEntropy)
141![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
142
bool reVal=false;
143
DATA_BLOB plainTextBlob=new DATA_BLOB();
144
DATA_BLOB cipherBlob=new DATA_BLOB();
145
CRYPTPROTECT_PROMPTSTRUCT prompt=new CRYPTPROTECT_PROMPTSTRUCT();
146
InitPromptstruct(ref prompt);
147
try
148![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
149
try
150![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
151
int cipherTextSize=ciperText.Length;
152
cipherBlob.pbData=Marshal.AllocHGlobal(cipherTextSize);
153
if(IntPtr.Zero==cipherBlob.pbData)
154![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
155
throw new Exception("unable to allocate cipherText buffer.");
156
}
157
cipherBlob.cbData=cipherTextSize;
158
Marshal.Copy(ciperText,0,cipherBlob.pbData,cipherBlob.cbData);
159
}
160
catch(Exception ex)
161![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
162
throw new Exception("Exception marshalling data."+ex.Message);
163
}
164
DATA_BLOB entropyBlob=new DATA_BLOB();
165
int dwFlags;
166
if(Store.USE_NACHINE_STORE==store)
167![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
168
dwFlags=CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
169
if(null==optionalEntropy)
170![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
171
optionalEntropy=new byte[0];
172
}
173
try
174![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
175
int byteSize=optionalEntropy.Length;
176
entropyBlob.pbData=Marshal.AllocHGlobal(byteSize);
177
if(IntPtr.Zero==entropyBlob.pbData)
178![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
179
throw new Exception("Unable to allocate entropy buffer.");
180
}
181
entropyBlob.cbData=byteSize;
182
Marshal.Copy(optionalEntropy,0,entropyBlob.pbData,byteSize);
183
}
184
catch(Exception ex)
185![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
186
throw new Exception("Exception entropy marshalling data."+ex.Message);
187
}
188
}
189
else
190![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
191
dwFlags=CRYPTPROTECT_UI_FORBIDDEN;
192
}
193
reVal=CryptUnprotectData(ref cipherBlob,null,ref entropyBlob,IntPtr.Zero,ref prompt,dwFlags,ref plainTextBlob);
194
if(false==reVal)
195![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
196
throw new Exception("Decryption failed."+GetErrorMessage(Marshal.GetLastWin32Error()));
197
}
198
if(IntPtr.Zero!=cipherBlob.pbData)
199![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
200
Marshal.FreeHGlobal(cipherBlob.pbData);
201
}
202
if(IntPtr.Zero!=entropyBlob.pbData)
203![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
204
Marshal.FreeHGlobal(entropyBlob.pbData);
205
}
206
207
}
208
catch(Exception ex)
209![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
210
throw new Exception("Exception decrypting."+ex.Message);
211
}
212
byte[] plainText=new byte[plainTextBlob.cbData];
213
Marshal.Copy(plainTextBlob.pbData,plainText,0,plainTextBlob.cbData);
214
return plainText;
215
}
216![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
217
private void InitPromptstruct(ref CRYPTPROTECT_PROMPTSTRUCT ps)
218![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
219
ps.cbSize=Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT));
220
ps.dwPromptFlags=0;
221
ps.hwndApp=NullPtr;
222
ps.szPrompt=null;
223
}
224
private unsafe static String GetErrorMessage(int errorCode)
225![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
226
int FORMAT_MESSAGE_ALLOCATE_BUFFER=0x00000100;
227
int FORMAT_MESSAGE_IGNORE_INSERTS=0x00000200;
228
int FORMAT_MESSAGE_FROM_SYSTEM=0x00001000;
229
int messageSize=255;
230
String lpMsgBuf="";
231
int dwFlags=FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS;
232
IntPtr ptrlpSource=new IntPtr();
233
IntPtr ptrArgument=new IntPtr();
234
int retVal=FormatMessage(dwFlags,ref ptrlpSource,errorCode,0,ref lpMsgBuf,messageSize,&ptrArgument);
235
if(0==retVal)
236![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
237
throw new Exception("Failed to format message for error code"+errorCode+".");
238
}
239
return lpMsgBuf;
240
}
241![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
242
}
243
}
244
![None.gif](/Images/OutliningIndicators/None.gif)
2
![None.gif](/Images/OutliningIndicators/None.gif)
3
![None.gif](/Images/OutliningIndicators/None.gif)
4
![None.gif](/Images/OutliningIndicators/None.gif)
5
![None.gif](/Images/OutliningIndicators/None.gif)
6
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
7
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
8
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
9
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
10
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
12
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
13
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
14
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
15
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
16
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
19
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
21
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
22
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
24
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
25
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
28
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
29
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
30
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
31
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
32
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
34
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
35
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
36
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
37
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
38
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
39
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
40
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
41
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
42
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
43
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
44
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
46
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
47
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
48
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
49
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
50
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
51
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
52
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
53
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
54
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
56
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
57
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
58
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
59
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
60
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
61
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
62
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
64
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
65
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
66
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
67
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
68
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
69
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
70
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
71
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
72
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
73
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
74
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
75
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
76
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
77
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
78
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
79
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
80
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
81
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
82
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
83
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
84
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
85
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
86
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
87
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
88
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
89
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
90
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
91
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
92
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
93
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
94
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
95
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
96
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
97
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
98
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
99
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
100
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
101
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
102
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
103
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
104
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
105
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
107
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
108
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
109
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
110
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
111
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
112
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
113
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
114
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
115
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
116
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
117
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
118
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
119
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
120
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
121
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
122
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
123
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
124
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
125
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
126
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
127
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
128
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
129
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
130
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
131
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
132
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
133
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
134
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
135
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
136
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
137
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
138
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
139
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
140
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
141
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
142
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
143
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
144
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
145
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
146
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
147
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
148
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
149
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
150
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
151
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
152
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
153
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
154
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
155
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
156
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
157
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
158
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
159
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
160
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
161
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
162
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
163
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
164
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
165
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
166
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
167
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
168
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
169
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
170
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
171
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
172
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
173
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
174
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
175
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
176
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
177
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
178
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
179
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
180
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
181
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
182
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
183
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
184
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
185
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
186
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
187
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
188
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
189
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
190
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
191
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
192
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
193
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
194
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
195
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
196
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
197
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
198
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
199
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
200
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
201
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
202
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
203
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
204
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
205
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
206
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
207
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
208
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
209
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
210
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
211
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
212
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
213
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
214
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
215
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
216
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
217
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
218
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
219
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
220
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
221
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
222
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
223
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
224
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
225
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
226
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
227
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
228
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
229
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
230
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
231
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
232
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
233
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
234
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
235
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
236
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
237
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
238
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
239
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
240
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
241
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
242
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
243
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
244
![None.gif](/Images/OutliningIndicators/None.gif)