Repository navigation
Expand file tree
/
Copy pathSetupSendMail.sql
More file actions
334 lines (319 loc) · 79.5 KB
/
Copy pathSetupSendMail.sql
File metadata and controls
334 lines (319 loc) · 79.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
--------------------------------------------------------------------------------------
-- Installs EMAIL.CLRSendMail and EMAIL.SaveProfile in the current database, with the
-- tables they use, replacing an earlier version and keeping its profiles, configurations
-- and logs. Run it in the database you want them in, as a sysadmin: it adds the assembly
-- to the server's trusted assemblies.
--
-- The assembly is UNSAFE: .NET Framework lets SmtpClient use a port other than 25, such as
-- 587, only with full trust, which EXTERNAL_ACCESS lacks. SQL Server runs UNSAFE assemblies
-- on Windows only: SQL Server 2017 or later on Windows, or Azure SQL Managed Instance. On
-- Linux, install SetupHtml.sql and send with Database Mail.
-- Version 1 is the v1-article tag.
--
-- SetupSendMail.sql is generated from SetupSendMail.template.sql by tools/SetupScript; edit the template.
-- Sources: 0e74b813aa52a8708624b3796911a922e1cff5788bcbf3f6dd0a5d28ff162c84
--------------------------------------------------------------------------------------
SET NOCOUNT ON;
GO
--------------------------------------------------------------------------------------
-- Stop here, installing nothing, if the server can't run the assembly
--------------------------------------------------------------------------------------
IF CAST(SERVERPROPERTY('EngineEdition') AS int) = 5
BEGIN
RAISERROR(N'Azure SQL Database doesn''t run CLR assemblies. CLRSendMail needs SQL Server 2017 or later on Windows, or Azure SQL Managed Instance.', 16, 1);
SET NOEXEC ON;
END
ELSE IF ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS int), 0) < 14
BEGIN
RAISERROR(N'CLRSendMail needs SQL Server 2017 or later. For earlier versions, use the v1-article tag of the repository.', 16, 1);
SET NOEXEC ON;
END
ELSE IF IS_SRVROLEMEMBER(N'sysadmin') = 0
BEGIN
RAISERROR(N'SetupSendMail.sql adds the assembly to the server''s trusted assemblies, which needs a member of sysadmin.', 16, 1);
SET NOEXEC ON;
END
ELSE IF EXISTS (SELECT * FROM sys.dm_os_host_info WHERE host_platform = N'Linux')
BEGIN
RAISERROR(N'SQL Server on Linux runs SAFE assemblies only, and CLRSendMail needs UNSAFE. Install SetupHtml.sql and send its HTML with msdb.dbo.sp_send_dbmail.', 16, 1);
SET NOEXEC ON;
END
ELSE IF (SELECT value_in_use FROM sys.configurations WHERE name = N'clr enabled') = 0
PRINT N'CLR is disabled on this server. CLRSendMail is installed, but runs only after: EXEC sp_configure ''clr enabled'', 1; RECONFIGURE;';
GO
--------------------------------------------------------------------------------------
-- Remove an earlier version's code: every routine of the assembly, the assembly, and
-- version 1's database user that owned it. The data stays.
--------------------------------------------------------------------------------------
DECLARE @drop nvarchar(max) =
(
SELECT STRING_AGG(CAST(N'DROP ' + CASE o.type WHEN 'PC' THEN N'PROCEDURE ' ELSE N'FUNCTION ' END
+ QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) + N';' AS nvarchar(max)), NCHAR(10))
FROM sys.assembly_modules AS m
JOIN sys.objects AS o ON o.object_id = m.object_id
JOIN sys.assemblies AS a ON a.assembly_id = m.assembly_id
WHERE a.name = N'SimpleTalk.SQLCLR.SendMail'
);
IF @drop IS NOT NULL
EXEC sys.sp_executesql @drop;
IF EXISTS (SELECT * FROM sys.assemblies WHERE name = N'SimpleTalk.SQLCLR.SendMail')
DROP ASSEMBLY [SimpleTalk.SQLCLR.SendMail];
IF DATABASE_PRINCIPAL_ID(N'UserSqlClrCustomSendMail') IS NOT NULL
DROP USER [UserSqlClrCustomSendMail];
IF OBJECT_ID(N'EMAIL.SaveProfile', N'P') IS NOT NULL
DROP PROCEDURE EMAIL.SaveProfile;
IF SCHEMA_ID(N'EMAIL') IS NULL
EXEC sys.sp_executesql N'CREATE SCHEMA EMAIL';
GO
--------------------------------------------------------------------------------------
-- The tables, as version 1 made them, but for the profiles' credentials
--------------------------------------------------------------------------------------
IF OBJECT_ID(N'EMAIL.Profiles', N'U') IS NULL
CREATE TABLE EMAIL.Profiles
(
ProfileName char(20) NOT NULL CONSTRAINT PK_Email_Profile_ProfileName PRIMARY KEY,
EnableSsl bit NOT NULL DEFAULT 1,
DefaultCred bit NOT NULL DEFAULT 0, -- sign in as the SQL Server service account
HostName nvarchar(255) NOT NULL,
Port int NOT NULL DEFAULT 587,
UserName nvarchar(200) NULL,
Password varbinary(512) NULL, -- ENCRYPTBYCERT(CERT_ID(N'EmailProfiles'), ...)
Domain nvarchar(200) NULL, -- Exchange domain name
DefaultFrom nvarchar(500) NOT NULL, -- default from address
DefaultGroup nvarchar(100) NULL, -- default display name
DeliveryMethod tinyint NOT NULL DEFAULT 0, -- 0: an SMTP server
TimeOut int NOT NULL DEFAULT 100000
);
-- Version 1 kept the user name and password encrypted with a key published with its code:
-- they are moved aside, re-encrypted further down, and dropped
IF EXISTS (SELECT * FROM sys.columns
WHERE object_id = OBJECT_ID(N'EMAIL.Profiles') AND name = N'Password' AND system_type_id <> TYPE_ID(N'varbinary'))
BEGIN
EXEC sp_rename N'EMAIL.Profiles.UserName', N'UserNameV1', N'COLUMN';
EXEC sp_rename N'EMAIL.Profiles.Password', N'PasswordV1', N'COLUMN';
ALTER TABLE EMAIL.Profiles ADD UserName nvarchar(200) NULL, Password varbinary(512) NULL;
END;
IF OBJECT_ID(N'EMAIL.Configurations', N'U') IS NULL
CREATE TABLE EMAIL.Configurations
(
Name char(20) NOT NULL CONSTRAINT PK_Email_Configurations_Name PRIMARY KEY,
MaxFileSize int NOT NULL DEFAULT 1000000,
ProhibitedExtensions nvarchar(50) NOT NULL DEFAULT 'exe,dll,vbs,js',
LoggingLevel tinyint NOT NULL DEFAULT 0, -- 2 logs every message sent
SaveEmails bit NOT NULL DEFAULT 1,
NoPiping bit NOT NULL DEFAULT 1, -- 0 prints "Sent successfully!"
SaveAttachments bit NOT NULL DEFAULT 1,
AttachmentFolders nvarchar(1000) NULL -- folders files may be attached from, semicolon separated
);
IF COL_LENGTH(N'EMAIL.Configurations', N'AttachmentFolders') IS NULL
ALTER TABLE EMAIL.Configurations ADD AttachmentFolders nvarchar(1000) NULL;
IF NOT EXISTS (SELECT * FROM EMAIL.Configurations)
INSERT INTO EMAIL.Configurations (Name) VALUES ('default');
IF OBJECT_ID(N'EMAIL.MonitorLog', N'U') IS NULL
CREATE TABLE EMAIL.MonitorLog
(
ID bigint IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Email_MonitorLog_Id PRIMARY KEY,
[TimeStamp] datetime NOT NULL DEFAULT (GETDATE()),
Source nvarchar(50) NOT NULL,
Type nvarchar(20) NOT NULL,
Message nvarchar(100) NOT NULL,
Data nvarchar(max) NULL
);
IF OBJECT_ID(N'EMAIL.MailItems', N'U') IS NULL
CREATE TABLE EMAIL.MailItems
(
mailitem_id bigint IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Email_MailItems_MailId PRIMARY KEY,
profileName char(20) NULL CONSTRAINT FK_MailItems_Profile REFERENCES EMAIL.Profiles (ProfileName),
configurationName char(20) NULL CONSTRAINT FK_MailItems_Configurations REFERENCES EMAIL.Configurations (Name),
recipients varchar(max) NULL,
copy_recipients varchar(max) NULL,
blind_copy_recipients varchar(max) NULL,
subject nvarchar(255) NULL,
from_address varchar(max) NULL,
reply_to varchar(max) NULL,
body nvarchar(max) NULL,
body_format varchar(20) NULL,
importance varchar(6) NULL,
sensitivity varchar(50) NULL,
file_attachments nvarchar(max) NULL,
last_mod_date datetime NOT NULL DEFAULT (GETDATE()),
last_mod_user sysname NOT NULL DEFAULT (SUSER_SNAME())
);
IF OBJECT_ID(N'EMAIL.MailAttachments', N'U') IS NULL
CREATE TABLE EMAIL.MailAttachments
(
attachment_id bigint IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Email_MailAttachments_AttachmentId PRIMARY KEY,
mailitem_id bigint NOT NULL CONSTRAINT FK_MailAttachments_MailItems REFERENCES EMAIL.MailItems (mailitem_id),
filename nvarchar(512) NOT NULL,
filesize bigint NOT NULL,
attachment varbinary(max) NULL,
last_mod_date datetime NOT NULL DEFAULT (GETDATE()),
last_mod_user sysname NOT NULL DEFAULT (SUSER_SNAME())
);
GO
--------------------------------------------------------------------------------------
-- The certificate the profiles' passwords are encrypted with, protected by the database
-- master key. A master key made here has a random password nobody knows: SQL Server opens
-- it with the service master key. Before moving the database to another server, back the
-- master key up with a password of your own (BACKUP MASTER KEY), or save the profiles
-- again with EMAIL.SaveProfile once it's there.
--------------------------------------------------------------------------------------
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = N'##MS_DatabaseMasterKey##')
BEGIN
DECLARE @password nvarchar(128) = CONVERT(nvarchar(36), NEWID()) + N'aA1!' + CONVERT(nvarchar(36), NEWID());
DECLARE @create nvarchar(max) = N'CREATE MASTER KEY ENCRYPTION BY PASSWORD = ' + QUOTENAME(@password, '''') + N';';
EXEC sys.sp_executesql @create;
PRINT N'Created the database master key, which protects the certificate EmailProfiles.';
END;
IF CERT_ID(N'EmailProfiles') IS NULL
CREATE CERTIFICATE EmailProfiles WITH SUBJECT = N'CLRSendMail profile passwords';
GO
--------------------------------------------------------------------------------------
-- Trust this build of the assembly. SQL Server 2017's "clr strict security" loads only
-- trusted assemblies, and a trusted assembly needs no key, certificate or login.
--
-- Trust that earlier builds needed and no database uses any more is removed:
-- * the hashes of earlier builds of this version
-- * version 1's asymmetric key keySendMail and login SqlClrCustomSendMail, made from a
-- key file published in the repository, so they trusted any assembly signed with it
--------------------------------------------------------------------------------------
DECLARE @hash varbinary(64) = 0x6C989AC5F09ADA58F0EC9DEE36CD231A384944E50A65F898EA24336E67F5662BC8F5B6B6BC3D22ED07F06881C8E8D8A3F02E1429DC14ABA86D7DF84C5E313D33;
-- The builds of the assembly each database has, version 1's signed with the published key
DECLARE @used TABLE (hash varbinary(64), clr_name nvarchar(4000));
DECLARE @sql nvarchar(max) =
(
SELECT STRING_AGG(CAST(N'SELECT HASHBYTES(''SHA2_512'', f.content), a.clr_name COLLATE DATABASE_DEFAULT FROM ' + QUOTENAME(name) + N'.sys.assemblies AS a JOIN '
+ QUOTENAME(name) + N'.sys.assembly_files AS f ON f.assembly_id = a.assembly_id AND f.file_id = 1'
+ N' WHERE a.name = N''SimpleTalk.SQLCLR.SendMail''' AS nvarchar(max)), N' UNION ALL ')
FROM sys.databases
WHERE state = 0 AND HAS_DBACCESS(name) = 1
);
INSERT INTO @used EXEC sys.sp_executesql @sql;
DECLARE @stale nvarchar(max) =
(
SELECT STRING_AGG(CAST(N'EXEC sys.sp_drop_trusted_assembly @hash = ' + CONVERT(nvarchar(max), t.hash, 1) + N';' AS nvarchar(max)), NCHAR(10))
FROM sys.trusted_assemblies AS t
WHERE t.description LIKE N'simpletalk.sqlclr.sendmail,%'
AND t.hash <> @hash
AND NOT EXISTS (SELECT * FROM @used AS u WHERE u.hash = t.hash)
);
IF @stale IS NOT NULL
EXEC sys.sp_executesql @stale;
IF NOT EXISTS (SELECT * FROM sys.trusted_assemblies WHERE hash = @hash)
EXEC sys.sp_add_trusted_assembly @hash = @hash, @description = N'simpletalk.sqlclr.sendmail, version=2.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'SqlClrCustomSendMail')
OR EXISTS (SELECT * FROM master.sys.asymmetric_keys WHERE name = N'keySendMail')
BEGIN
IF EXISTS (SELECT * FROM @used WHERE clr_name NOT LIKE N'%publickeytoken=null%')
PRINT N'Version 1 is still installed in another database, so its key keySendMail and login SqlClrCustomSendMail stay. They trust any assembly signed with a key file anyone can download: run SetupSendMail.sql or CleanUp.sql in that database too.';
ELSE
BEGIN
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'SqlClrCustomSendMail')
DROP LOGIN [SqlClrCustomSendMail];
IF EXISTS (SELECT * FROM master.sys.asymmetric_keys WHERE name = N'keySendMail')
EXEC master.sys.sp_executesql N'DROP ASYMMETRIC KEY [keySendMail];';
PRINT N'Removed version 1''s key keySendMail and login SqlClrCustomSendMail.';
END;
END;
GO
--------------------------------------------------------------------------------------
-- The assembly and its procedure. CLRSendMail runs as the schema's owner, who may decrypt
-- the profiles' passwords: callers need EXECUTE on it, not access to the certificate.
--------------------------------------------------------------------------------------
CREATE ASSEMBLY [SimpleTalk.SQLCLR.SendMail]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01030004719AE10000000000000000E00022200B013000007200000008000000000000469100000020000000A000000000001000200000000200000400000000000000060000000000000000E000000002000000000000030060850000100000100000000010000010000000000000100000000000000000000000F49000004F00000000A00000600400000000000000000000000000000000000000C000000C000000D89000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E746578740000004C710000002000000072000000020000000000000000000000000000200000602E727372630000006004000000A000000006000000740000000000000000000000000000400000402E72656C6F6300000C00000000C0000000020000007A0000000000000000000000000000400000420000000000000000000000000000000028910000000000004800000002000500F83B0000E054000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E02281000000A2A5E02281000000A02178D2D0000012516039C7D010000042A3A02281000000A02037D010000042A3A02281000000A02037D020000042A3A02281000000A02037D030000042A32281100000A026F1200000A2A00001B3004005F00000001000011036F1300000A20FF070000310E031620FF0700006F1400000A1001720100007002731500000A0A066F1600000A72470000701F0C20FF0700006F1700000A036F1800000A281100000A066F1900000ADE0D26DE0A062C06066F1A00000ADC2A00011C0000000044000D51000315000001020027002D54000A000000001B3004009B00000001000011725900007002731500000A0A066F1600000A72240100701F0C1F326F1700000A72340100706F1800000A066F1600000A725A0100701F0C1F146F1700000A036F1800000A066F1600000A72470000701F0C1F646F1700000A041F64280E0000066F1800000A066F1600000A72660100701F0C156F1700000A05252D06267E1B00000A6F1800000A066F1C00000A26DE0A062C06066F1A00000ADC2A000110000002000C008490000A000000001330040051000000000000001D8D3000000125167272010070A22517026F1D00000A6F1E00000AA22518728C010070A22519026F1F00000A280B000006A2251A72AC010070A2251B026F2000000AA2251C72CC010070A2282100000A2A0000001B300400EF0200000200001172D001007002731500000A0B076F1600000A7205060070191F146F1700000A046F1800000A076F1600000A721F060070191F146F1700000A05252D06267E1B00000A6F1800000A076F1600000A72450600701F16156F1700000A036F1F00000A280B0000066F1800000A076F1600000A725D0600701F16156F1700000A036F2200000A280B000006280D0000066F1800000A076F1600000A727D0600701F16156F1700000A036F2300000A280B000006280D0000066F1800000A076F1600000A729B0600701F0C20FF0000006F1700000A036F2000000A6F1800000A076F1600000A72AD0600701F16156F1700000A036F1D00000A6F1E00000A6F1800000A076F1600000A72C70600701F16156F1700000A036F2400000A280B000006280D0000066F1800000A076F1600000A72D90600701F0C156F1700000A036F2500000A6F1800000A076F1600000A72E50600701F161F146F1700000A036F2600000A2D0772FD0600702B0572070700706F1800000A076F1600000A72110700701F161C6F1700000A036F2700000A0C1202FE16180000016F2800000A6F1800000A076F1600000A72290700701F161F326F1700000A036F2900000A72430700706F2A00000A252D06267E1B00000A6F1800000A076F1600000A725B0700701F0C156F1700000A0E04280C000006280D0000066F1800000A076F2B00000AA5390000010ADE0A072C06076F1A00000ADC0E0539DB0000000E046F2C00000A0D38B20000001203282D00000A1304727D07007002731500000A130511056F1600000A72EE080070166F2E00000A068C390000016F1800000A11056F1600000A72020900701F0C20000200006F1700000A11046F2E0000066F1800000A11056F1600000A7216090070166F2E00000A11046F2F0000068E6A8C390000016F1800000A11056F1600000A722A0900701F15156F1700000A11046F2F0000066F1800000A11056F1C00000A26DE0C11052C0711056F1A00000ADC1203282F00000A3A42FFFFFFDE0E1203FE160200001B6F1A00000ADC2A00414C0000020000000C000000F6010000020200000A00000000000000020000003602000090000000C60200000C00000000000000020000001B020000C5000000E00200000E000000000000001B3002004500000003000011733000000A0A026F3100000A0B2B1B076F3200000A0C06086F1E00000A6F3300000A1F3B6F3400000A26076F3500000A2DDDDE0A072C06076F1A00000ADC066F2800000A2A0000000110000002000D002734000A000000001B3002004B00000004000011733000000A0A026F2C00000A0B2B1C1201282D00000A0C06086F2D0000066F3300000A1F3B6F3400000A261201282F00000A2DDBDE0E1201FE160200001B6F1A00000ADC066F2800000A2A000110000002000D002936000E0000000042026F1300000A2C02022A7E1B00000A2A52026F1300000A033002022A0216036F1400000A2A1E027B050000042A2202037D050000042A1E027B060000042A2202037D060000042A1E027B070000042A2202037D070000042A1E027B080000042A2202037D080000042A1E027B090000042A2202037D090000042A1E027B0A0000042A2202037D0A0000042A1E027B0B0000042A2202037D0B0000042A1E027B0C0000042A2202037D0C0000042A1E027B0D0000042A2202037D0D0000042A1E027B0E0000042A2202037D0E0000042A1E027B0F0000042A2202037D0F0000042A1E027B100000042A2202037D100000042A1E027B110000042A2202037D110000042A1E027B120000042A2202037D120000042ADA0272420900707D050000040272440900707D060000040272420900707D0700000402157D1000000402177D1200000402283600000A2A5602283600000A02037D1300000402047D140000042A1E027B130000042A3202282D000006283700000A2A1E027B140000042A0000133005004B00000005000011733800000A0A022D02062A02178D3D00000125161F3B9D6F3900000A0B160C2B2207089A0D096F3A00000A6F1300000A16310C06096F3A00000A6F3B00000A0817580C08078E6932D8062A001B3004005E01000006000011733C00000A0A0228300000060B076F3D00000A2D02062A036F530000060C086F3D00000A2D247270090070036F42000006252D0626729809007072AA090070283E00000A73400000067A076F3F00000A0D38EA0000001203284000000A13041104284100000A2D1772E70A0070110472090B0070283E00000A73400000067A1104284200000A130511050828340000062D1772E70A0070110472350B0070283E00000A73400000067A031105284300000A6F520000062C1772E70A00701104729B0B0070283E00000A73400000067A1105284400000A2D1772E70A0070110472D70B0070283E00000A73400000067A1105734500000A284600000A13061106036F440000066A3124725C0C0070110411068C39000001036F440000068C40000001284700000A73400000067A0611051105284800000A732C0000066F4900000A1203284A00000A3A0AFFFFFFDE0E1203FE160600001B6F1A00000ADC062A00000110000002005100FD4E010E000000001B300500C202000007000011734B00000A25026F15000006252D0726036F5F000006026F17000006252D0726036F6000000628330000066F4C00000A25026F110000066F4D00000A25026F130000066F4E00000A25026F290000066F4F00000A25285000000A6F5100000A25285000000A6F5200000A25285000000A6F5300000A25026F270000066F5400000A25026F230000066F5500000A0A026F0F00000628300000066F3F00000A0B2B1A1201284000000A0C066F1F00000A081428330000066F5600000A1201284A00000A2DDDDE0E1201FE160600001B6F1A00000ADC026F1900000628300000066F3F00000A0B2B1A1201284000000A0D066F2200000A091428330000066F5600000A1201284A00000A2DDDDE0E1201FE160600001B6F1A00000ADC026F1B00000628300000066F3F00000A0B2B1C1201284000000A1304066F2300000A11041428330000066F5600000A1201284A00000A2DDBDE0E1201FE160600001B6F1A00000ADC026F1D00000628300000066F3F00000A0B2B1C1201284000000A1305066F2400000A11051428330000066F5600000A1201284A00000A2DDBDE0E1201FE160600001B6F1A00000ADC066F1F00000A6F5700000A2D0B72090D007073400000067A026F210000062C3C066F2900000A72470D0070066F2400000A6F5700000A16300D066F1D00000A6F1E00000A2B11066F2400000A166F5800000A6F1E00000A6F5900000A026F250000061306110645030000000200000019000000300000002B43066F2900000A7243070070727F0D00706F5900000A2B2C066F2900000A724307007072910D00706F5900000A2B15066F2900000A724307007072A10D00706F5900000A046F2C00000A13072B371207282D00000A1308066F5A00000A11086F2F000006735B00000A11086F2E000006735C00000A25285000000A6F5D00000A6F5E00000A1207282F00000A2DC0DE0E1207FE160200001B6F1A00000ADC062A00000140000002009F0027C6000E000000000200E500270C010E0000000002002B012954010E0000000002007301299C010E0000000002006E0244B2020E000000001B3003004A00000008000011032C20036F3A00000A6F1300000A2C13026F3A00000A03285000000A735F00000A2B0B026F3A00000A736000000A0ADE172672CC0100700272CB0D0070283E00000A73400000067A062A00000110000000000000313100171F0000011B3003003C00000009000011036F3F00000A0A2B161200284000000A0B02071B6F6100000A2C04170CDE1B1200284A00000A2DE1DE0E1200FE160600001B6F1A00000ADC162A082A0110000002000700232A000E000000001B3008001B0200000A00001172030E0070736200000A0A066F6300000A140B0E0F28390000062C0F060E0F283900000628540000062B0528410000060C06027205060070283A00000628630000060D732B000006250372330E0070283A0000066F1000000625042839000006252D062672440900706F12000006250572430E0070283A0000066F14000006250E0428390000066F16000006250E0528390000066F18000006250E0628390000066F1A000006250E0728390000066F1C000006250E0828390000066F1E000006250E0928390000066F20000006250F0A286400000A2D090F0A286500000A2B01166F22000006250E0B16161D72570E007072830E0070283B0000066F24000006250E0C151518722907007072FD0E0070283B0000066F26000006250E0D161618726B0F007072850F0070283B0000066F28000006250F0E286400000A2D090F0E286500000A2B01176F2A000006256F1F000006082831000006130409110428320000061305096F620000061306110528090000060B2864000006110611056F6600000A086F4C0000062D0A72B50F00702806000006086F480000061833110672DB0F007072F30F0070072808000006086F4A0000062C0D06110509081104072836000006DE0C11062C0711066F1A00000ADCDE0C11052C0711056F1A00000ADCDE3813070611076F6700000A072837000006DE26130806722710007011082865000006286800000A072837000006DE0A062C06066F1A00000ADC2A00417C0000020000006D01000059000000C60100000C0000000000000002000000650100006F000000D40100000C000000000000000000000013000000CF010000E2010000120000000D0000020000000013000000CF010000F40100001C00000025000001020000000B00000005020000100200000A000000000000001B300600580000000B0000110203046F57000006056F420000060E04056F4E000006280A000006DE3A0A725B100070066F6700000A286800000A28060000060272CB10007072DB100070066F6700000A721B1100700E05283E00000A2838000006DE002A01100000000000001D1D003A15000001AA027221110070722D110070042C0E03721B11007004283E00000A2B01032838000006020328070000062A001B3004000F00000000000000020304052808000006DE0326DE002A0001100000000000000B0B000315000001AE0F00286900000A2D200F00286A00000A6F3A00000A6F1300000A2C0D0F00286A00000A6F3A00000A2A142A86022839000006252D1726725711007003726D110070283E00000A73400000067A2A000013300400380000000C0000110F00286B00000A2D090F00286C00000A2B01030A060432040605311A72951100700E04068C400000010E05284700000A73400000067A062A1B300600DE0100000D00001172030E0070736200000A0A066F6300000A736D00000A0B72BF11007006731500000A0C086F6E00000A0D2B3E07198D30000001251609166F6F00000A74300000016F3A00000AA2251709176F6F00000A7530000001A2251809186F6F00000A7530000001A26F7000000A096F7100000A2DBADE14092C06096F1A00000ADC082C06086F1A00000ADC076F7200000A130438220100001204287300000A13051105179A2C0B1105179A283D0000062B011413061105189A2C0B1105189A283D0000062B01141307DE477525000001252D0426162B1B13081108751F0000012D0C1108754800000114FE032B011716FE03FE1126723F1200701105169A725B120070283E00000A2806000006DDA8000000722A13007006731500000A130911096F1600000A7267150070191F146F1700000A1105169A6F1800000A11096F1600000A72731500701F0C20C80000006F1700000A1106252D06267E1B00000A6F1800000A11096F1600000A72871500701F0C20800000006F1700000A1107252D06267E1B00000A6F1800000A11096F1C00000A26DE0C11092C0711096F1A00000ADC723F1200701105169A729B150070283E00000A28060000061204287400000A3AD2FEFFFFDE181204FE160900001B6F1A00000ADC062C06066F1A00000ADC2A000041940000020000002A0000004A000000740000000A0000000000000002000000230000005B0000007E0000000A00000000000000010000009E0000002A000000F10000001E000000C8000000020000001C01000077000000930100000C00000000000000020000009000000035010000C50100000E00000000000000020000000B000000C8010000D30100000A000000000000001B300400970000000E000011737500000A0A06722A160070066F7600000A1E5B283E0000066F7700000A067242090070066F7800000A1E5B283E0000066F7900000A02287A00000A0B737B00000A0C08066F7C00000A17737D00000A0D090716078E696F7E00000A096F7F00000A288000000A086F8100000A6F8200000A1304DE1E092C06096F1A00000ADC082C06086F1A00000ADC062C06066F1A00000ADC11042A0001280000020051002576000A00000000020043003D80000A0000000002000600848A000A000000001B300300300000000F000011738300000A0A06288000000A026F8400000A6F8500000A0B120103280100002B070CDE0A062C06066F1A00000ADC082A01100000020006001E24000A000000001E02283600000A2A220203288700000A2A1A73550000062A1E027B1A0000042A2202037D1A0000042A1E027B1B0000042A2202037D1B0000042A1E027B1C0000042A2202037D1C0000042A1E027B1D0000042A2202037D1D0000042A1E027B1E0000042A2202037D1E0000042A1E027B1F0000042A2202037D1F0000042A1E027B200000042A2202037D200000042A1E027B210000042A2202037D210000042A133006005A00000010000011022846000006178D3D00000125161F2C9D6F3900000A0A160B2B3706079A6F3A00000A178D3D00000125161F2E9D6F8800000A03178D3D00000125161F2E9D6F8800000A1B288900000A2C02172A0717580B07068E6932C3162A0000133005008C00000011000011733800000A0A0228500000062D02062A022850000006178D3D00000125161F3B9D6F3900000A0B160C2B5907089A0D096F3A00000A6F1300000A2C44096F3A00000A284200000A13040611047E8A00000A13051205288B00000A1A6F8C00000A2D1711047E8A00000A13051205288B00000A286800000A2B0211046F3B00000A0817580C08078E6932A1062A1B3004004D01000012000011724016007002731500000A0A066F1600000A7267150070191F146F1700000A036F1800000A066F6E00000A0B076F7100000A2D1672700900700372FD170070283E00000A73400000067A0772411800706F8D00000A288E00000A0CD00E000002288F00000A088C40000001289000000A2D17725B18007003088C40000001289100000A73400000067A7355000006250772D51800706F8D00000A74300000016F3A00000A6F43000006250772DF1800706F8D00000AA5400000016F45000006250772F71800706F8D00000A74300000016F4700000625086F49000006250772211900706F8D00000AA5510000016F4B000006250772371900706F8D00000AA5510000016F4D000006250772491900706F8D00000AA5510000016F4F000006250772691900706F8D00000A75300000016F510000060DDE14072C06076F1A00000ADC062C06066F1A00000ADC092A00000041340000020000002C0000000B010000370100000A00000000000000020000000C00000035010000410100000A00000000000000CA022040420F007D1B00000402728D1900707D1C00000402177D1E00000402177D1F00000402177D2000000402283600000A2A00133002005C0000000000000002283600000A02037D2200000402047D2300000402057D24000004020E047D25000004020E057D26000004020E067D27000004020E077D28000004020E087D29000004020E097D2A000004020E0A7D2B000004020E0B7D2C0000042A1E027B220000042A1E027B230000042A1E027B240000042A1E027B250000042A1E027B260000042A1E027B270000042A1E027B280000042A1E027B290000042A1E027B2A0000042A1E027B2B0000042A1E027B2C0000042A133004008700000013000011022858000006022859000006739200000A2502285A0000066F9300000A25166F9400000A250228610000066F9500000A2502285B0000066F9600000A0A02285B0000062D4002285C0000062C380602285E0000062C1902285C00000602285D00000602285E000006739700000A2B1102285C00000602285D000006739800000A6F9900000A062A001B300C00770100001400001172AB19007002731500000A0A066F1600000A7267150070191F146F1700000A036F1800000A066F6E00000A0B076F7100000A2D16723F12007003724C1D0070283E00000A73400000067A0772C21D00706F8D00000A75300000010C082D280772D41D00706F8D00000AA5510000012C1672EC1D00700372281E0070283E00000A73400000067A07724D1F00706F8D00000A288E00000A0D092C17726B1F007003098C40000001289100000A73400000067A07720C2000706F8D00000A74300000016F3A00000A0772242000706F8D00000A74300000010772362000706F8D00000AA5400000010772402000706F8D00000AA5510000010772542000706F8D00000AA55100000107726C2000706F8D00000A75300000010807727E2000706F8D00000A753000000107728C2000706F8D00000A74300000010772A42000706F8D00000A75300000010772BE2000706F8D00000AA54000000173560000061304DE14072C06076F1A00000ADC062C06066F1A00000ADC11042A0041340000020000002C00000034010000600100000A00000000000000020000000C0000005E0100006A0100000A00000000000000133002001F00000015000011289A00000A0A062C150620000C00005F2D0C0620000C000060289B00000A2A00133003002E00000016000011026F6700000A0A026F9C00000A0B2B190672CE200070076F6700000A283E00000A0A076F9C00000A0B072DE4062A000042534A4201000100000000000C00000076342E302E33303331390000000005006C00000040170000237E0000AC1700009015000023537472696E6773000000003C2D0000D420000023555300104E0000100000002347554944000000204E0000C006000023426C6F620000000000000002000001571DA2090908000000FA0133001600000100000055000000100000002C00000065000000700000009C00000005000000B20000001600000004000000240000003A000000090000000100000003000000010000000000670B01000000000006004908FF0F0600CF08FF0F06004607EC0F0F001F10000006009907B0090600B608780D0600F507780D06008208780D06001408780D0600B207780D0600CF07780D06006908780D06006C07780D06001307FF0F0600E308550C06006C12550C06002E07550C06002E13550C0A00ED0D77130A00F60477130A00240E77130E0098050B0B06001C00B8000E004B150B0B5F00CB0F00000E00B50D0B0B0600520FB71406000E00B8000E001F120B0B0E00A8110B0B0600440E550C0A008307960F0A00F50954100A00D60C54100A00310054100E008D130B0B06004A0E550C0A00E70E77130600240F041506003F0C53000600320C041506000A0F04150600C90C550C0E00D90659130600ED08550C0A00C314960F0A00C706960F06000B0A550C0A009E0D77130A00890F77130A00CF066C000A007D0F540E0600BD05550C0600860B550C0A00EC04540E0E008A0D180106002B00550C06000100C50A0600BC0F91110600540A53000600C00E550C0600ED0553000600A50E530006002500550C06009F09B7140E00CB0D0B0B0E009C130B0B0600450C53000600670E550C0A00E00D540E0A00DA0E540E0600FB0D041506005C0C041506002A14550C0600B00C041506006F05041506006F0C04150600D714550C0600E906550C0600C905550C0600D90C550C0E002A050B0B0E00A50A59130E00721459130E00690F59130000000043000000000001000100000110000107B8103D0001000100000110005A07FF0F3D0001000200000110009D08FF0F3D0002000400000110003108FF0F3D0003000500800110002E10360B490004000600800110001C0A360B490005000800000110004014360B490005000F00000110009813360B490013002C00800110007A10360B49001500300080011000430F360B490015003100010010006910360B49001500350001211000120E360B95001600400001010000F90A360BAD001600410000011000660D360B49001A00410000011000F205360B4900220056002600A4107803260052097C032600170D7F035180690A7F030100E60282030100FE03820301009904820301009F0382030100AA01820301003701820301004B0182030100FA0282030100BC0382030100300485030100C00288030100C9047F030100AF048C0301005602850321002202820321001704780351803D058203060664007F035680B70A90035680BF0A90035680C10C900301007A0182030100EB017F0301005603820301003802900301003A0385030100080285030100DD03850301007C03820321007A01820321006A048203210054047F032100700285032100130385032100900182032100600182032100A802820321008B0282032100C7018203210080047F035020000000008618D60F060001005820000000008618D60F940301007020000000008618D60FAA0101007F20000000008618D60F940301008E20000000008618D60F010001009D20000000009600C71399030100AC20000000009600B10F9E0302003421000000009600FB06A5030400EC21000000009600D30EAE0308004C220000000096005D0BB403090094250000000091005F14C5030F00F825000000009100B210CB0310006026000000009100B405D503110071260000000091008A14DA0312008626000000008608780E5D0014008E260000000086087F0E10001400972600000000860835135D0015009F26000000008608411310001500A826000000008608DD145D001600B026000000008608E61410001600B9260000000086082B125D001700C1260000000086083B1210001700CA2600000000860863065D001800D226000000008608730610001800DB2600000000860886005D001900E3260000000086088D0010001900EC260000000086089B005D001A00F426000000008608A30010001A00FD260000000086088D0E5D001B000527000000008608990E10001B000E270000000086089D125D001C001627000000008608B11210001C001F27000000008608D7137E001D002727000000008608EE137A011D0030270000000086081F0DE0031E003827000000008608380D92011E004127000000008608581526001F004927000000008608681501001F0052270000000086083115820020005A270000000086083E158C0120006327000000008608A10B7E0021006B27000000008608AE0B7A0121007427000000008618D60F06002200AB27000000008618D60FE5032200C127000000008608440A5D002400C92700000000860806065D002400D627000000008608B31376022400E0270000000096006413EC03240038280000000096008D12F5032500B429000000009600E60401042700C42C0000000091005C1210042A002C2D000000009100600F17042C00842D000000009600510B21042E0028300000000091000C0955043E009C30000000009100060B68044400C830000000009100240AA5034700F430000000009100000970044B002031000000009100EB0077044C004431000000009100AC057F044E0088310000000096003C108B04540008340000000091001814FA005400D4340000000091002B0A8F0455002035000000008618D60F060057002835000000008618D60F100057003135000000009600CE0C96045800383500000000860806065D00580040350000000081080F0610005800493500000000860811092600590051350000000081082109010059005A350000000086085F115D005A006235000000008108781110005A006B35000000008608E40A9B045B007335000000008108F50AA0045B007C3500000000860841117E005C00843500000000810850117A015C008D35000000008608CA097E005D009535000000008108D7097A015D009E35000000008608D5127E005E00A635000000008108E9127A015E00AF35000000008608D0115D005F00B735000000008108E61110005F00C035000000008600F400A60460002836000000008600F411AB046100C036000000009600D800B30461005038000000008618D60F060063008438000000008118D60FBB046300EC3800000000860806065D006E00F43800000000860869145D006E00FC38000000008608321426006E0004390000000086080C0C7E006E000C39000000008608F0107E006E0014390000000086084D065D006E001C3900000000860850055D006E002439000000008608E60C5D006E002C39000000008608940C5D006E00343900000000860883065D006E003C390000000086088E1426006E0044390000000086006A13CA046E00D839000000009600D800D0046E00903B000000009600CF108B047000BC3B0000000096006605D804700000000100A40500000100FC0C00000200A40500000100FC0C00000200EE0600000300A40500000400780000000100A40500000100FC0C00000200A405000003002406000004003B06000005000D1300000600FD12000001008410000001000D13000001000609000001000609000002007A0A00000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100060900000100590A00000200BF1300000100641400000100C512000002005709000001004C1400000200FE05000003000D1300000100641200000200AD0600000100590A00000200FC1100000100240600000200860E000003004D1300000400EF14000005004B1200000600AD0600000700940000000800AB0000000900571200000A00C51200000B00051400000C00510D00000D00781500000E00841500000F00D90B00001000300600000100FC0C00000200A40500000300FE05000004005709000005000D1300000600030F00000100FC0C00000200A40500000300030F00000100FC0C00000200EE0600000300A40500000400780000000100060900000100060900000200B906000001000609000002008D0B00000300F80C00000400CE1400000500B90600000600A809000001000E01000001000015000002007A0A00000100A405000001000609000001000609000001000609000001000609000001000609000001000609000001000609000001000609000001000D0D00000100FC0C00000200B90600000100B906000002008514000003003B1400000400280C000005002411000006005A06000007005D0500000800F10C00000900A40C00000A009A0600000B00A61400000100FC0C00000200B90600000100D2140900D60F01001100D60F06001900D60F0A002900D60F10003100D60F10003900D60F10004100D60F10004900D60F10005100D60F10005900D60F10006100D60F10006900D60F10007100D60F06008900D60F15000101D60F06007900D60F06007101BE061B0079010B05100081015E0A26008101120A2A00A100D60F3000A100041237008901DD003D00A101FC084800790101054D00A901F3060600B10100095300B90121152600B100820C5800E90013125D00B100780E6100B10035135D00810120136600B1004C006100B1009B006100B10054146100B100DD145D00B100BB0B7E00B100311582009100FF095D00B100C4118700C1014C0C8D00B901C50E92000C00C80F9D001400A713AD008901DD00B2001400AE147E00D900D60F06001C00C80FD1002400A713AD00D9001005E100D9001005E700D901AE147E009100D60F0600E1011806FA002C00D60F060081016413110181017D0C5D002C00DD0018010C00D60F06002C00CD1326008101201339012C00C80F9D003400A713AD00E10101014601E1014D0AFA00E101000DFA00F10119134601F901D60F1000F9015E0A4B01810127134F01F1018E1057010C00DD0018013400AE147E00B100D60F0600B1008B0C7401B10041131000B100E6141000B100CA0B7A0109023A007F01B10083098501B10097098501B1006F098501B1003E158C01B100A41192011C00DD0018011C00CD1326001C004C0C9801C101DD009E01B1007D12A4014101D60FAA011902D60FB00119025E0985013C00DD001801E900D60FC601E900D60F100081018A0AD9019900D60F10003102E10C06001101960B7E001101F2087E0021010B05FB0129018C055D008101201301020901960B7E000901F2085D001901960B7E001901F20810024400D60F0600A100F50E3A0239024C0C40024400DD0018013902D3007E004400C80F9D004C00A713AD004C00AE147E003901D60F060049023F0926004902F814AA0149023109260049025D00AA015102E40957014101D60F06004902DC0F5B024901D60F61022102FB066E024901950A0600090280057F014101D51476020902080A7B025101D60F060009029B108B026902380A910271024B0998022901D60F100081012014AC0281013A11B202E101AE0EC902E901FF095D008101810AD90139024C0CD70251022300DC027902DB05E1025901E100EA0281012713F2022101D60FFF0221011A0C7A0121011705050321019A14010021010A117A019902D60F0C039902D60F9E012101E0101303A902E20B2C03A902F70B32032901310E4003080010004F030E005400540308005C006903080060006E0308006400730327002A00B506290012002E062E000B00FF042E00130008052E001B0027052E00230030052E002B007A052E00330090052E003B007A052E0043009D052E004B00C1052E005300CE052E005B0002062E0063000E0643006B006E0343000A006E03490012002E0663006B006E0363000A006E03630073003A06690012002E0683006B006E0383000A006E03830073006106A10012002E06A1006B006E03A3006B006E03A3000A006E03A30073008806C10012002E06C1006B006E03C30022002E06C3001200AF06E10012002E06E1006B006E03E30022002E06E3001200AF06E4001200340601016B006E0303012200340603011200AF0621016B006E03230122002E0623011200AF0641016B006E0361016B006E03630122002E0663011200AF0681016B006E03830122002E0683011200AF06840112003406A1016B006E03C1016B006E03E00122002E06E0016B006E03E1016B006E03E30122002E06E3011200AF06000222002E0600026B006E0301026B006E0303022200340603021200AF06200222002E0620026B006E0321026B006E03400222002E0640026B006E0341026B006E03490212003406600222002E0660026B006E0361026B006E03800222002E0680026B006E0381026B006E03A0026B006E03C0026B006E03E0026B006E0300036B006E0320036B006E0329031200340640036B006E0341031200340641036B006E03490312002E0660036B006E0361036B006E03690312002E0680036B006E0381036B006E03A0036B006E03A1036B006E03C0036B006E03C1036B006E03E0036B006E03E1036B006E0300046B006E0301046B006E0320046B006E0321041200340621046B006E0340046B006E03410412002E0641046B006E03490412002E0660046B006E03610412002E0661046B006E0380046B006E0381046B006E03840412003406A0046B006E03A1046B006E03A40412003406C0046B006E03C1046B006E03E0046B006E03E1046B006E0300056B006E0301056B006E0320056B006E0321056B006E0340056B006E03410512002E0641056B006E0361056B006E0364051200340681056B006E03A0056B006E03E0056B006E03000622002E06A0067B006E0320072200340680077B006E03000822002E0640082200340640086B006E0360082200340660086B006E0380086B006E03A0086B006E03C0086B006E03C40812003406E0086B006E0300096B006E0320096B006E0340096B006E0360096B006E0380096B006E03A0096B006E03C0096B006E03E0096B006E03000A22003406000A6B006E03200A22003406200A6B006E03E00A22002E06E00A6B006E03000B22002E06000B6B006E03200B6B006E03400B6B006E03600B6B006E03800B6B006E03A00B6B006E03C00B6B006E03E00B22002E06E00B6B006E03000C6B006E03200C6B006E03400C22002E06600C22002E06640C12002E06840C12002E06A00C22002E06640D12002E0621006C00BC00ED00FF001E015D01C101CF01E10107020C0214024C028102A602BB02CC02F9021A03260339030800010009000F000F00120010001A000000A20EDF0400005113DF040000F314DF0400003F12DF040000A106DF0400009800DF040000A700DF0400009D0EDF040000B512DF040000F213E30400003C0DE70400006C15EC0400004F15F0040000D00BE3040000540ADF040000B406DF040000B713F5040000B406DF0400002509EC0400007C11DF040000F90AFA0400005411E3040000DB09E3040000ED12E3040000EA11DF040000B406DF0400008014DF0400003614EC0400001E0CE30400000E11E30400005106DF0400005405DF040000EA0CDF040000980CDF0400008706DF0400009E14EC0402000F000300010010000300020011000500010012000500020013000700010014000700020015000900010016000900020017000B00010018000B00020019000D0001001A000D0002001B000F0001001C000F0002001D00110001001E00110002001F001300010020001300020021001500010022001500020023001700010024001700020025001900010026001900020027001B00010028001B00020029001D0001002A001D0002002D001F0002002E00210002002F002300020042002500010043002500020044002700010045002700020046002900010047002900020048002B00010049002B0002004A002D0001004B002D0002004C002F0001004D002F0002004E00310001004F00310002005000330001005100330002005700350002005800370002005900390002005A003B0002005B003D0002005C003F0002005D00410002005E00430002005F0045000200600047000200610049009600A600C900DA000B014001B801330245020480000002000000000000000000000000001B0B000004000000000000000000000046037D000000000004000000000000000000000046036C00000000000400000000000000000000004603550C000000000D01A2020000000000436F6C6C656374696F6E60310049456E756D657261746F726031004C697374603100546F496E74333200496E7436340053716C496E743136006765745F55544638003C4D6F64756C653E006765745F43430053797374656D2E494F007365745F49560076616C75655F5F0053797374656D2E446174610064617461006D73636F726C6962006765745F4363007365745F4363006D61696C4363006765745F426363007365745F42636300626C696E64436F70795265630053797374656D2E436F6C6C656374696F6E732E47656E657269630052656164004C6F616400416464004973446566696E656400526571756972656400497350726F6869626974656400497350617468526F6F74656400656E637279707465640053797374656D2E436F6C6C656374696F6E732E5370656369616C697A6564003C43633E6B5F5F4261636B696E674669656C64003C4263633E6B5F5F4261636B696E674669656C64003C50617373776F72643E6B5F5F4261636B696E674669656C64003C4E616D653E6B5F5F4261636B696E674669656C64003C557365724E616D653E6B5F5F4261636B696E674669656C64003C446973706C61794E616D653E6B5F5F4261636B696E674669656C64003C44656661756C74446973706C61794E616D653E6B5F5F4261636B696E674669656C64003C4D617846696C6553697A653E6B5F5F4261636B696E674669656C64003C4E6F506970696E673E6B5F5F4261636B696E674669656C64003C506174683E6B5F5F4261636B696E674669656C64003C4C6F6767696E674C6576656C3E6B5F5F4261636B696E674669656C64003C426F647948746D6C3E6B5F5F4261636B696E674669656C64003C456E61626C6553736C3E6B5F5F4261636B696E674669656C64003C44656661756C7446726F6D3E6B5F5F4261636B696E674669656C64003C446F6D61696E3E6B5F5F4261636B696E674669656C64003C44656C69766572794E6F74696669636174696F6E3E6B5F5F4261636B696E674669656C64003C546F3E6B5F5F4261636B696E674669656C64003C5265706C79546F3E6B5F5F4261636B696E674669656C64003C55736544656661756C7443726564656E7469616C733E6B5F5F4261636B696E674669656C64003C53617665456D61696C733E6B5F5F4261636B696E674669656C64003C50726F68696269746564457874656E73696F6E733E6B5F5F4261636B696E674669656C64003C4174746163686D656E74466F6C646572733E6B5F5F4261636B696E674669656C64003C46726F6D416464726573733E6B5F5F4261636B696E674669656C64003C46696C654174746163686D656E74733E6B5F5F4261636B696E674669656C64003C536176654174746163686D656E74733E6B5F5F4261636B696E674669656C64003C5375626A6563743E6B5F5F4261636B696E674669656C64003C436F6E74656E743E6B5F5F4261636B696E674669656C64003C5265717565737452656164526563656970743E6B5F5F4261636B696E674669656C64003C506F72743E6B5F5F4261636B696E674669656C64003C486F73743E6B5F5F4261636B696E674669656C64003C54696D656F75743E6B5F5F4261636B696E674669656C64003C426F64793E6B5F5F4261636B696E674669656C64003C5072696F726974793E6B5F5F4261636B696E674669656C64003C53656E73697469766974793E6B5F5F4261636B696E674669656C64004275696C64004462436F6D6D616E640053716C436F6D6D616E640045786563757465416E6453656E6400417070656E64007365745F44656C69766572794D6574686F6400536D747044656C69766572794D6574686F640056657273696F6E31536563726574576F7264006765745F50617373776F72640070617373776F72640044657363726962650043727970746F53747265616D4D6F6465006765745F556E69636F6465006765745F4D657373616765004D61696C4D657373616765006D65737361676500496E52616E6765004E756C6C61626C650049446973706F7361626C650052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C650046696C65004D61696C50726F66696C650070726F66696C65006765745F4E616D65007365745F4E616D650047657446696C654E616D650070726F66696C654E616D6500636F6E6669674E616D6500636F6E66696775726174696F6E4E616D65006765745F557365724E616D6500757365724E616D65006765745F446973706C61794E616D65007365745F446973706C61794E616D65006765745F44656661756C74446973706C61794E616D650064656661756C74446973706C61794E616D6500646973706C61794E616D65006E616D65006765745F506970650053716C506970650053716C44625479706500536563757269747950726F746F636F6C54797065007479706500446973706F736500577269746500456D62656464656441747472696275746500436F6D70696C657247656E6572617465644174747269627574650041747472696275746555736167654174747269627574650044656275676761626C65417474726962757465004E756C6C61626C6541747472696275746500417373656D626C795469746C654174747269627574650053716C50726F636564757265417474726962757465005461726765744672616D65776F726B41747472696275746500417373656D626C7946696C6556657273696F6E41747472696275746500417373656D626C79496E666F726D6174696F6E616C56657273696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C794465736372697074696F6E4174747269627574650052656653616665747952756C657341747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F70797269676874417474726962757465004E756C6C61626C65436F6E7465787441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650042797465006765745F56616C7565007365745F56616C75650076616C75650053617665006765745F4D617846696C6553697A65007365745F4D617846696C6553697A65006765745F426C6F636B53697A65006765745F4B657953697A6500526573697A6500466C616700636F6E666967007365745F4E616D65456E636F64696E67007365745F48656164657273456E636F64696E67007365745F5375626A656374456E636F64696E67007365745F426F6479456E636F64696E67006D65616E696E670053797374656D2E52756E74696D652E56657273696F6E696E67006765745F4E6F506970696E67007365745F4E6F506970696E670046726F6D426173653634537472696E670053716C537472696E6700546F537472696E6700476574537472696E6700537562737472696E67004D61696C4C6F67005472794C6F67005472756E636174654861736800436F6D7075746548617368006765745F506174680047657446756C6C506174680070617468006765745F4C656E677468004D61784D6573736167654C656E677468006C656E67746800456E647357697468005374617274735769746800466C75736846696E616C426C6F636B004E6574776F726B43726564656E7469616C004D696E696D616C00557375616C0053797374656D2E436F6C6C656374696F6E732E4F626A6563744D6F64656C006765745F4C6F6767696E674C6576656C007365745F4C6F6767696E674C6576656C004661696C0053797374656D2E4E65742E4D61696C0053696D706C6554616C6B2E53514C434C522E53656E644D61696C0053696D706C6554616C6B2E53716C436C722E53656E644D61696C00434C5253656E644D61696C0053617665456D61696C0053696D706C6554616C6B2E53514C434C522E53656E644D61696C2E646C6C0044424E756C6C007768656E4E756C6C006765745F49734E756C6C006765745F426F647948746D6C007365745F426F647948746D6C006765745F4973426F647948746D6C007365745F4973426F647948746D6C00626F647948746D6C006765745F536563757269747950726F746F636F6C007365745F536563757269747950726F746F636F6C006765745F456E61626C6553736C007365745F456E61626C6553736C00656E61626C6553736C0043727970746F53747265616D004D656D6F727953747265616D006765745F4974656D0053797374656D0053796D6D6574726963416C676F726974686D0048617368416C676F726974686D005472696D006765745F46726F6D007365745F46726F6D006765745F44656661756C7446726F6D0064656661756C7446726F6D004943727970746F5472616E73666F726D004D6178696D756D00456E756D004275696C74496E0053716C426F6F6C65616E004F70656E006765745F446F6D61696E00646F6D61696E006D696E00636E6E00476574457874656E73696F6E00657874656E73696F6E0056657273696F6E006765745F44656C69766572794E6F74696669636174696F6E007365745F44656C69766572794E6F74696669636174696F6E0064656C69766572794E6F74696669636174696F6E004D61696C436F6E66696775726174696F6E0053797374656D2E5265666C656374696F6E004E616D6556616C7565436F6C6C656374696F6E0053716C506172616D65746572436F6C6C656374696F6E004D61696C41646472657373436F6C6C656374696F6E004174746163686D656E74436F6C6C656374696F6E004462436F6E6E656374696F6E0053716C436F6E6E656374696F6E0043727970746F67726170686963457863657074696F6E0053656E644D61696C457863657074696F6E0053716C457863657074696F6E006765745F496E6E6572457863657074696F6E00466F726D6174457863657074696F6E0053797374656D2E446174612E436F6D6D6F6E00537472696E67436F6D70617269736F6E006765745F546F007365745F546F006D61696C546F006765745F5265706C79546F007365745F5265706C79546F0046696C65496E666F004469726563746F7279536570617261746F724368617200457865637574655363616C617200486561646572004462446174615265616465720053716C44617461526561646572004578656375746552656164657200686561646572005348413143727970746F5365727669636550726F766964657200547269706C6544455343727970746F5365727669636550726F7669646572004D6573736167654275696C64657200537472696E674275696C64657200496E466F6C6465720053657276696365506F696E744D616E61676572004462506172616D657465720053716C506172616D65746572004D6963726F736F66742E53716C5365727665722E5365727665720052616973654572726F720049456E756D657261746F7200476574456E756D657261746F72002E63746F7200437265617465446563727970746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F64657300506970655574696C6974696573005570677261646556657273696F6E3150726F66696C65730053797374656D2E446174612E53716C54797065730053746F72656450726F6365647572657300416464726573736573006164647265737365730052656164416C6C4279746573004765744279746573004E756C6C61626C65466C616773005061746873004D6963726F736F66742E436F6465416E616C7973697300526571756972654D6F6465726E546C73007365745F43726564656E7469616C73006765745F55736544656661756C7443726564656E7469616C73007365745F55736544656661756C7443726564656E7469616C730075736544656661756C7443726564656E7469616C7300457175616C73006765745F53617665456D61696C73007365745F53617665456D61696C73006765745F50726F68696269746564457874656E73696F6E73007365745F50726F68696269746564457874656E73696F6E730053797374656D2E436F6C6C656374696F6E73007365745F44656C69766572794E6F74696669636174696F6E4F7074696F6E73006765745F48656164657273006765745F4174746163686D656E74466F6C64657273007365745F4174746163686D656E74466F6C6465727300666F6C64657273006765745F506172616D6574657273006765745F41646472657373004D61696C41646472657373006765745F46726F6D41646472657373007365745F46726F6D416464726573730066726F6D41646472657373007265706C794164647265737300616464726573730041747472696275746554617267657473006765745F4174746163686D656E747300526561644174746163686D656E7473006765745F46696C654174746163686D656E7473007365745F46696C654174746163686D656E74730066696C654174746163686D656E7473006765745F536176654174746163686D656E7473007365745F536176654174746163686D656E747300736176654174746163686D656E7473006174746163686D656E74730045786973747300436F6E63617400466F726D6174004F626A656374006765745F5375626A656374007365745F5375626A656374006D61696C5375626A6563740053797374656D2E4E65740053706C697400437265617465436C69656E740053797374656D2E446174612E53716C436C69656E7400536D7470436C69656E740046696C654174746163686D656E74006765745F43757272656E74006765745F436F6E74656E7400636F6E74656E74005072696E74006765745F436F756E74006765745F526571756573745265616452656365697074007365745F526571756573745265616452656365697074007265717565737452656164526563656970740044656372797074005472696D537461727400436F6E76657274006765745F506F727400706F7274004D61696C526571756573740072657175657374006765745F5265706C79546F4C697374006C697374006765745F486F7374004943726564656E7469616C734279486F737400686F737400437574006765745F54696D656F7574007365745F54696D656F75740074696D656F7574004D6F76654E6578740053797374656D2E546578740053716C436F6E74657874006D617800657800546F4172726179006765745F426F6479007365745F426F6479006D61696C426F6479007365745F4B6579006B65790053797374656D2E53656375726974792E43727970746F67726170687900457865637574654E6F6E5175657279006765745F5072696F72697479007365745F5072696F72697479004D61696C5072696F72697479006765745F53656E7369746976697479007365745F53656E73697469766974790073656E7369746976697479006D61696C5072696F72747900004552004100490053004500520052004F00520028004E0027002500730027002C002000310036002C00200031002C00200040006D0065007300730061006700650029003B00011140006D006500730073006100670065000080C949004E005300450052005400200049004E0054004F00200045004D00410049004C002E004D006F006E00690074006F0072004C006F0067002000280053006F0075007200630065002C00200054007900700065002C0020004D006500730073006100670065002C002000440061007400610029002000560041004C0055004500530020002800400073006F0075007200630065002C002000400074007900700065002C00200040006D006500730073006100670065002C0020004000640061007400610029003B00000F400073006F0075007200630065000025530051004C0043004C0052002000730065006E007400200065002D006D00610069006C00010B40007400790070006500000B400064006100740061000019460072006F006D00200020002000200020003A0020002700011F27000D000A0054006F0020002000200020002000200020003A0020002700011F27000D000A005300750062006A00650063007400200020003A0020002700010327000184330A00200020002000200020002000200020002000200020002000200020002000200049004E005300450052005400200049004E0054004F00200045004D00410049004C002E004D00610069006C004900740065006D0073000A00200020002000200020002000200020002000200020002000200020002000200020002000200020002800700072006F00660069006C0065004E0061006D0065002C00200063006F006E00660069006700750072006100740069006F006E004E0061006D0065002C00200072006500630069007000690065006E00740073002C00200063006F00700079005F0072006500630069007000690065006E00740073002C00200062006C0069006E0064005F0063006F00700079005F0072006500630069007000690065006E00740073002C0020007300750062006A006500630074002C000A00200020002000200020002000200020002000200020002000200020002000200020002000200020002000660072006F006D005F0061006400640072006500730073002C0020007200650070006C0079005F0074006F002C00200062006F00640079002C00200062006F00640079005F0066006F0072006D00610074002C00200069006D0070006F007200740061006E00630065002C002000730065006E00730069007400690076006900740079002C002000660069006C0065005F006100740074006100630068006D0065006E007400730029000A0020002000200020002000200020002000200020002000200020002000200020004F0055005400500055005400200049004E005300450052005400450044002E006D00610069006C006900740065006D005F00690064000A002000200020002000200020002000200020002000200020002000200020002000560041004C00550045005300200028004000700072006F00660069006C0065004E0061006D0065002C002000400063006F006E00660069006700750072006100740069006F006E004E0061006D0065002C002000400072006500630069007000690065006E00740073002C002000400063006F007000790052006500630069007000690065006E00740073002C002000400062006300630052006500630069007000690065006E00740073002C00200040007300750062006A006500630074002C000A002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020004000660072006F006D0041006400640072006500730073002C00200040007200650070006C00790054006F002C002000400062006F00640079002C002000400062006F006400790046006F0072006D00610074002C002000400069006D0070006F007200740061006E00630065002C0020004000730065006E00730069007400690076006900740079002C0020004000660069006C0065004100740074006100630068006D0065006E007400730029003B0000194000700072006F00660069006C0065004E0061006D0065000025400063006F006E00660069006700750072006100740069006F006E004E0061006D0065000017400072006500630069007000690065006E0074007300001F400063006F007000790052006500630069007000690065006E0074007300001D400062006300630052006500630069007000690065006E0074007300001140007300750062006A0065006300740000194000660072006F006D004100640064007200650073007300001140007200650070006C00790054006F00000B400062006F00640079000017400062006F006400790046006F0072006D0061007400000954004500580054000009480054004D004C000017400069006D0070006F007200740061006E006300650000194000730065006E00730069007400690076006900740079000017530065006E007300690074006900760069007400790000214000660069006C0065004100740074006100630068006D0065006E007400730000816F0A0020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200049004E005300450052005400200049004E0054004F00200045004D00410049004C002E004D00610069006C004100740074006100630068006D0065006E0074007300200028006D00610069006C006900740065006D005F00690064002C002000660069006C0065006E0061006D0065002C002000660069006C006500730069007A0065002C0020006100740074006100630068006D0065006E00740029000A00200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000560041004C005500450053002000280040006D00610069006C004900740065006D002C0020004000660069006C0065004E0061006D0065002C0020004000660069006C006500530069007A0065002C00200040006100740074006100630068006D0065006E00740029003B00001340006D00610069006C004900740065006D0000134000660069006C0065004E0061006D00650000134000660069006C006500530069007A006500001740006100740074006100630068006D0065006E0074000001002B530051004C0043004C005200200053006500720076006500720020004D006500730073006100670065000027540068006500200063006F006E00660069006700750072006100740069006F006E002000270001116200750069006C0074002D0069006E0001813B2700200061006C006C006F007700730020006E006F0020006100740074006100630068006D0065006E00740073003A00200073006500740020004100740074006100630068006D0065006E00740046006F006C006400650072007300200069006E00200045004D00410049004C002E0043006F006E00660069006700750072006100740069006F006E007300200074006F002000740068006500200066006F006C0064006500720073002000660069006C006500730020006D00610079002000620065002000610074007400610063006800650064002000660072006F006D002C00200061006E0064002000700061007300730020007400680061007400200063006F006E00660069006700750072006100740069006F006E002000610073002000400063006F006E006600690067004E0061006D0065002E00012154006800650020006100740074006100630068006D0065006E00740020002700012B270020006900730020006E006F007400200061002000660075006C006C00200070006100740068002E000165270020006900730020006E006F007400200069006E002000740068006500200063006F006E00660069006700750072006100740069006F006E002700730020004100740074006100630068006D0065006E00740046006F006C0064006500720073002E00013B27002000680061007300200061002000700072006F006800690062006900740065006400200065007800740065006E00730069006F006E002E000180832700200064006F006500730020006E006F0074002000650078006900730074002C0020006F00720020007400680065002000530051004C0020005300650072007600650072002000730065007200760069006300650020006100630063006F0075006E0074002000630061006E002700740020007300650065002000690074002E000180AB54006800650020006100740074006100630068006D0065006E007400200027007B0030007D002700200068006100730020007B0031007D002000620079007400650073002C0020006D006F007200650020007400680061006E002000740068006500200063006F006E00660069006700750072006100740069006F006E002700730020004D0061007800460069006C006500530069007A00650020006F00660020007B0032007D002E00013D40006D00610069006C0054006F00200068006100730020006E006F00200065002D006D00610069006C00200061006400640072006500730073002E00013744006900730070006F0073006900740069006F006E002D004E006F00740069006600690063006100740069006F006E002D0054006F00011150006500720073006F006E0061006C00000F5000720069007600610074006500002943006F006D00700061006E0079002D0043006F006E0066006900640065006E007400690061006C000137270020006900730020006E006F007400200061006E00200065002D006D00610069006C00200061006400640072006500730073002E00012F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D007400720075006500000F40006D00610069006C0054006F00001340006D00610069006C0042006F0064007900002B4000640065006C00690076006500720079004E006F00740069006600690063006100740069006F006E000079300020006E006F006E0065002C002000310020006F006E00200073007500630063006500730073002C002000320020006F006E0020006600610069006C007500720065002C002000340020006F006E002000640065006C00610079002C0020006F0072002000740068006500690072002000730075006D00006D2D00310020006E006F006E0065002C0020003000200050006500720073006F006E0061006C002C0020003100200050007200690076006100740065002C0020003200200043006F006D00700061006E0079002D0043006F006E0066006900640065006E007400690061006C00011940006D00610069006C005000720069006F00720074007900002F300020006E006F0072006D0061006C002C002000310020006C006F0077002C0020003200200068006900670068000025530065006E00740020007300750063006300650073007300660075006C006C0079002100001749006E0066006F0072006D006100740069006F006E00003345002D006D00610069006C0020007300750063006300650073007300660075006C006C0079002000730065006E00740021000133540068006500200065002D006D00610069006C00200077006100730020006E006F0074002000730065006E0074003A002000016F540068006500200065002D006D00610069006C0020007700610073002000730065006E0074002C00200062007500740020006E006F007400200073006100760065006400200069006E00200045004D00410049004C002E004D00610069006C004900740065006D0073003A002000010F5700610072006E0069006E006700003F45002D006D00610069006C0020007700610073002000730065006E0074002C00200062007500740020006E006F007400200073006100760065006400210001050D000A00000B4500720072006F007200002945002D006D00610069006C00200077006100730020006E006F0074002000730065006E0074002100011550006100720061006D0065007400650072002000002720006D007500730074002000620065002000730070006500630069006600690065006400210000297B0030007D0020006900730020007B0031007D003A00200075007300650020007B0032007D002E00007F530045004C004500430054002000500072006F00660069006C0065004E0061006D0065002C00200055007300650072004E0061006D006500560031002C002000500061007300730077006F0072006400560031002000460052004F004D00200045004D00410049004C002E00500072006F00660069006C00650073003B00001B5400680065002000700072006F00660069006C006500200027000180CD27002000680061007300200061002000750073006500720020006E0061006D00650020006F0072002000700061007300730077006F0072006400200074006800610074002000760065007200730069006F006E0020003100200063006F0075006C0064006E00270074002000640065006300720079007000740020006500690074006800650072003A00200073006500740020007400680065006D0020007700690074006800200045004D00410049004C002E005300610076006500500072006F00660069006C0065002E0001823B0A00200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000550050004400410054004500200045004D00410049004C002E00500072006F00660069006C00650073000A00200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000530045005400200055007300650072004E0061006D00650020003D002000400075007300650072004E0061006D0065002C000A002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000500061007300730077006F007200640020003D002000430041005300450020005700480045004E0020004000700061007300730077006F007200640020004900530020004E0055004C004C0020005400480045004E0020004E0055004C004C00200045004C0053004500200045004E0043005200590050005400420059004300450052005400280043004500520054005F004900440028004E00270045006D00610069006C00500072006F00660069006C0065007300270029002C0020004000700061007300730077006F00720064002900200045004E0044000A00200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000570048004500520045002000500072006F00660069006C0065004E0061006D00650020003D00200040006E0061006D0065003B00010B40006E0061006D0065000013400075007300650072004E0061006D00650000134000700061007300730077006F007200640000808D270020006E006F00770020006B00650065007000730020006900740073002000700061007300730077006F0072006400200065006E006300720079007000740065006400200077006900740068002000740068006500200063006500720074006900660069006300610074006500200045006D00610069006C00500072006F00660069006C00650073002E000115530069006D0070006C006500540061006C006B000081BB0A002000200020002000200020002000200020002000200020002000200020002000530045004C00450043005400200054004F005000200028003100290020004E0061006D0065002C0020004D0061007800460069006C006500530069007A0065002C002000500072006F00680069006200690074006500640045007800740065006E00730069006F006E0073002C0020004C006F006700670069006E0067004C006500760065006C002C002000530061007600650045006D00610069006C0073002C0020004E006F0050006900700069006E0067002C00200053006100760065004100740074006100630068006D0065006E00740073002C0020004100740074006100630068006D0065006E00740046006F006C0064006500720073000A002000200020002000200020002000200020002000200020002000200020002000460052004F004D00200045004D00410049004C002E0043006F006E00660069006700750072006100740069006F006E0073000A0020002000200020002000200020002000200020002000200020002000200020005700480045005200450020004E0061006D00650020003D00200040006E0061006D0065003B000043270020006900730020006E006F007400200069006E00200045004D00410049004C002E0043006F006E00660069006700750072006100740069006F006E0073002E0001194C006F006700670069006E0067004C006500760065006C000079540068006500200063006F006E00660069006700750072006100740069006F006E00200027007B0030007D002700200068006100730020004C006F006700670069006E0067004C006500760065006C0020007B0031007D003A002000750073006500200030002C002000310020006F007200200032002E0001094E0061006D00650000174D0061007800460069006C006500530069007A0065000029500072006F00680069006200690074006500640045007800740065006E00730069006F006E0073000015530061007600650045006D00610069006C00730000114E006F0050006900700069006E006700001F53006100760065004100740074006100630068006D0065006E007400730000234100740074006100630068006D0065006E00740046006F006C006400650072007300001D6500780065002C0064006C006C002C007600620073002C006A00730000839F0A002000200020002000200020002000200020002000200020002000200020002000530045004C00450043005400200054004F00500020002800310029002000500072006F00660069006C0065004E0061006D0065002C00200045006E00610062006C006500530073006C002C002000440065006600610075006C00740043007200650064002C00200048006F00730074004E0061006D0065002C00200050006F00720074002C00200055007300650072004E0061006D0065002C000A002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200043004F004E00560045005200540028006E007600610072006300680061007200280032003500360029002C0020004400450043005200590050005400420059004300450052005400280043004500520054005F004900440028004E00270045006D00610069006C00500072006F00660069006C0065007300270029002C002000500061007300730077006F0072006400290029002000410053002000500061007300730077006F00720064002C000A002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200043004100530054002800430041005300450020005700480045004E002000500061007300730077006F007200640020004900530020004E0055004C004C0020005400480045004E0020003000200045004C005300450020003100200045004E004400200041005300200062006900740029002000410053002000480061007300500061007300730077006F00720064002C000A002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200044006F006D00610069006E002C002000440065006600610075006C007400460072006F006D002C002000440065006600610075006C007400470072006F00750070002C002000440065006C00690076006500720079004D006500740068006F0064002C002000540069006D0065004F00750074000A002000200020002000200020002000200020002000200020002000200020002000460052004F004D00200045004D00410049004C002E00500072006F00660069006C00650073000A002000200020002000200020002000200020002000200020002000200020002000570048004500520045002000500072006F00660069006C0065004E0061006D00650020003D00200040006E0061006D0065003B000175270020006900730020006E006F007400200069006E00200045004D00410049004C002E00500072006F00660069006C00650073002E00200041006400640020006900740020007700690074006800200045004D00410049004C002E005300610076006500500072006F00660069006C0065002E000111500061007300730077006F00720064000017480061007300500061007300730077006F0072006400003B5400680065002000700061007300730077006F007200640020006F00660020007400680065002000700072006F00660069006C0065002000270001812327002000630061006E002700740020006200650020006400650063007200790070007400650064003A002000740068006500200063006500720074006900660069006300610074006500200045006D00610069006C00500072006F00660069006C006500730020006900730020006D0069007300730069006E00670020006F0072002000690073006E0027007400200074006800650020006F006E0065002000690074002000770061007300200073006100760065006400200077006900740068002E002000530061007600650020007400680065002000700072006F00660069006C006500200061006700610069006E0020007700690074006800200045004D00410049004C002E005300610076006500500072006F00660069006C0065002E00011D440065006C00690076006500720079004D006500740068006F00640000809F5400680065002000700072006F00660069006C006500200027007B0030007D00270020006800610073002000440065006C00690076006500720079004D006500740068006F00640020007B0031007D003A0020006F006E006C007900200030002C00200061006E00200053004D005400500020007300650072007600650072002C00200069007300200073007500700070006F0072007400650064002E000117500072006F00660069006C0065004E0061006D006500001148006F00730074004E0061006D006500000950006F0072007400001345006E00610062006C006500530073006C000017440065006600610075006C0074004300720065006400001155007300650072004E0061006D006500000D44006F006D00610069006E000017440065006600610075006C007400460072006F006D000019440065006600610075006C007400470072006F0075007000000F540069006D0065004F007500740000032000000000DFF0B92393819B47BA4C65DAE7079FD100042001010803200001052001011111042001010E0520010111410500001280BD0407011251032000080520020E0808062002010E124D0520001280C50A20031280C90E1180CD08042001011C05200101125104061280D904200012750320000E04200012690500010E1D0E1107060A12511161151165011224122412510320000204200011610520001280E10420010E0E0320001C0615125D0112240820001511650113000615116501122404200013000920021280C90E1180CD0C0703126D151271011275127507151280E901127508200015127101130006151271011275052001126D0E052001126D030C0703126D15116501122412240400010E0E0B070415125D010E1D0E080E0515125D010E0620011D0E1D030520010113001A070715125D01122415125D010E15125D010E151165010E0E0E0A0600030E0E0E0E05151165010E040001020E0320000A0700040E0E1C1C1C0500011D050E1607091259151165010E0E0E0E0E081511650112241224052001011275042001010205000012810506200101128105052001011161052001011179052001130008052002010E0E052000128109052001011D05072002011281110E08151280E90112810D0407011275082003010E0E128105090703151165010E0E02072002020E118115190709124D0E123C124015125D011224125912809112341280950520010112590500020E0E0E040701125503070108032000061E070A124D15125D011D0E1251128099151165011D0E1D0E0E0E12809512510615125D011D0E0520001280990420011C0806151165011D0E0E070512809D1D051280A11280A50E05200012812D0C20030112811112812D118131072003011D0508080420001D050520010E1D050907031280A91D051D050520011D050E0620011D051D050910010201101D1E0008030A01050507021D0E080520010E1D03080003020E0E1181150D070615125D010E1D0E080E0E030206030A0704125112809908123C0420011C0E040001081C08000112813D1181410700020212813D1C0600030E0E1C1C050701128091052002010E0806200101118149062003010E0E0E062001011281510B070512511280990E0812400507011180B10500001180B1060001011180B10607020E12809505200012809508B77A5C561934E08904FF07000014530069006D0070006C006500540061006C006B0004000000000401000000040200000003061D0502060502060802060E0206020306117903061161030611380420010105040001010E06000201124D0E08000401124D0E0E0E0500010E125910000601124D12590E0E15125D011224020500010E12690900010E15125D0112240400011C0E0500020E0E080420001179062002010E1D0508000115125D010E0E0B000215125D0112240E123C0E000312591220124015125D01122406000212750E0E090002020E15125D010E3300100111808511808511808511808511808511808511808511808511808511808511808911808D11808D11808D11808911808512000601124D12591240123C15125D0112240E07000301124D0E0E0600010E1180850700020E1180850E0B00060811808D0808080E0E030000010600021D050E08040000123C0420001138052001011138042001020E07200015125D010E070002123C124D0E0E200B010E0E0802020E0E0E0E0E080520001280910700021240124D0E0600010E1280950328000E0328000204280011790328000804280011610428001D0504280011380801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000200000000004901001A2E4E45544672616D65776F726B2C56657273696F6E3D76342E380100540E144672616D65776F726B446973706C61794E616D65122E4E4554204672616D65776F726B20342E38150100104461726B6F204D617274696E6F76696300000C01000752656C6561736500002301001E53656E64696E6720652D6D61696C2066726F6D2053514C2053657276657200000C010007322E302E302E3000003301002E322E302E302B3738376133346237646433613639646534616361373334313363356663356437306361623334633600000B01000653514C434C5200001F01001A53696D706C6554616C6B2E53514C434C522E53656E644D61696C0000050100010000050100020000260100846B0000020054020D416C6C6F774D756C7469706C6500540209496E68657269746564002601004C140000020054020D416C6C6F774D756C7469706C6500540209496E686572697465640026010002000000020054020D416C6C6F774D756C7469706C6500540209496E68657269746564000501000000000801000B00000000000000000000000000000000000000100000000000000000000000000000001C91000000000000000000003691000000200000000000000000000000000000000000000000000028910000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058A00000040400000000000000000000040434000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000002000000000000000200000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00464030000010053007400720069006E006700460069006C00650049006E0066006F00000040030000010030003000300030003000340062003000000056001F00010043006F006D006D0065006E00740073000000530065006E00640069006E006700200065002D006D00610069006C002000660072006F006D002000530051004C0020005300650072007600650072000000000042001100010043006F006D00700061006E0079004E0061006D006500000000004400610072006B006F0020004D0061007200740069006E006F00760069006300000000005E001B000100460069006C0065004400650073006300720069007000740069006F006E0000000000530069006D0070006C006500540061006C006B002E00530051004C0043004C0052002E00530065006E0064004D00610069006C0000000000300008000100460069006C006500560065007200730069006F006E000000000032002E0030002E0030002E00300000005E001F00010049006E007400650072006E0061006C004E0061006D0065000000530069006D0070006C006500540061006C006B002E00530051004C0043004C0052002E00530065006E0064004D00610069006C002E0064006C006C00000000004600110001004C006500670061006C0043006F00700079007200690067006800740000004400610072006B006F0020004D0061007200740069006E006F007600690063000000000066001F0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000530069006D0070006C006500540061006C006B002E00530051004C0043004C0052002E00530065006E0064004D00610069006C002E0064006C006C00000000002E0007000100500072006F0064007500630074004E0061006D00650000000000530051004C0043004C0052000000000082002F000100500072006F006400750063007400560065007200730069006F006E00000032002E0030002E0030002B0037003800370061003300340062003700640064003300610036003900640065003400610063006100370033003400310033006300350066006300350064003700300063006100620033003400630036000000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000032002E0030002E0030002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000C000000483100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = UNSAFE;
GO
CREATE PROCEDURE [EMAIL].[CLRSendMail]
@profileName [nvarchar](20),
@mailTo [nvarchar](max),
@mailSubject [nvarchar](255) = N'SQLCLR Server Message',
@mailBody [nvarchar](max),
@fromAddress [nvarchar](500) = NULL,
@displayName [nvarchar](400) = NULL,
@mailCc [nvarchar](4000) = NULL,
@blindCopyRec [nvarchar](4000) = NULL,
@replyAddress [nvarchar](4000) = NULL,
@fileAttachments [nvarchar](4000) = NULL,
@requestReadReceipt [bit] = 0,
@deliveryNotification [smallint] = 0,
@sensitivity [smallint] = -1,
@mailPriorty [smallint] = 0,
@bodyHtml [bit] = 1,
@configName [nvarchar](20) = NULL
WITH EXECUTE AS OWNER
AS EXTERNAL NAME [SimpleTalk.SQLCLR.SendMail].[SimpleTalk.SqlClr.SendMail.StoredProcedures].[CLRSendMail];
GO
--------------------------------------------------------------------------------------
-- Adds or replaces a profile, with its password encrypted by the certificate EmailProfiles
--------------------------------------------------------------------------------------
CREATE PROCEDURE [EMAIL].[SaveProfile]
@profileName nvarchar(20),
@hostName nvarchar(255),
@defaultFrom nvarchar(500),
@port int = 587,
@enableSsl bit = 1,
@userName nvarchar(200) = NULL,
@password nvarchar(4000) = NULL, -- null keeps the profile's password; N'' removes it
@defaultDisplayName nvarchar(100) = NULL,
@useDefaultCredentials bit = 0,
@domain nvarchar(200) = NULL,
@timeout int = 100000
AS
BEGIN
SET NOCOUNT ON;
IF @profileName IS NULL OR LTRIM(@profileName) = N'' OR @hostName IS NULL OR @defaultFrom IS NULL
BEGIN
RAISERROR(N'@profileName, @hostName and @defaultFrom are required.', 16, 1);
RETURN;
END;
-- A certificate's RSA key encrypts at most 245 bytes when it is 2048 bits long
IF LEN(@password) > 120
BEGIN
RAISERROR(N'@password is longer than 120 characters, the most the certificate EmailProfiles can encrypt.', 16, 1);
RETURN;
END;
DECLARE @encrypted varbinary(512) = CASE WHEN @password IS NULL OR @password = N'' THEN NULL
ELSE ENCRYPTBYCERT(CERT_ID(N'EmailProfiles'), @password) END;
IF @password <> N'' AND @encrypted IS NULL
BEGIN
RAISERROR(N'The password can''t be encrypted: the certificate EmailProfiles is missing. Run SetupSendMail.sql again.', 16, 1);
RETURN;
END;
UPDATE EMAIL.Profiles
SET HostName = @hostName,
Port = @port,
EnableSsl = @enableSsl,
DefaultCred = @useDefaultCredentials,
UserName = @userName,
Password = CASE WHEN @password IS NULL THEN Password ELSE @encrypted END,
Domain = @domain,
DefaultFrom = @defaultFrom,
DefaultGroup = @defaultDisplayName,
DeliveryMethod = 0,
TimeOut = @timeout
WHERE ProfileName = @profileName;
IF @@ROWCOUNT = 0
INSERT INTO EMAIL.Profiles (ProfileName, HostName, Port, EnableSsl, DefaultCred, UserName, Password, Domain, DefaultFrom, DefaultGroup, DeliveryMethod, TimeOut)
VALUES (@profileName, @hostName, @port, @enableSsl, @useDefaultCredentials, @userName, @encrypted, @domain, @defaultFrom, @defaultDisplayName, 0, @timeout);
END;
GO
--------------------------------------------------------------------------------------
-- Version 1's credentials, encrypted with its published key, re-encrypted with the
-- certificate EmailProfiles
--------------------------------------------------------------------------------------
IF COL_LENGTH(N'EMAIL.Profiles', N'PasswordV1') IS NOT NULL
BEGIN
EXEC sys.sp_executesql N'CREATE PROCEDURE EMAIL.UpgradeVersion1Profiles
AS EXTERNAL NAME [SimpleTalk.SQLCLR.SendMail].[SimpleTalk.SqlClr.SendMail.StoredProcedures].[UpgradeVersion1Profiles];';
EXEC sys.sp_executesql N'EXEC EMAIL.UpgradeVersion1Profiles;';
DROP PROCEDURE EMAIL.UpgradeVersion1Profiles;
ALTER TABLE EMAIL.Profiles DROP COLUMN UserNameV1, PasswordV1;
END;
GO
IF OBJECT_ID(N'EMAIL.QueryToHtml') IS NULL
PRINT N'EMAIL.QueryToHtml and EMAIL.ConCatHtml, for HTML bodies, are installed by SetupHtml.sql.';
GO
SET NOEXEC OFF;
GO