October 12, 2017 at 11:12 am
I've got a scenario where it might be almost impossible to change a data type for an existing stored procedure parameter because of the number of other things that would have to change, and the level of effort required to ensure all those changes were made. So I'm wondering if I can create a high-performance ITVF that will split a varchar(max) value into 8K chunks for further splitting using DelimitedSplit8K, at the nearest delimiter so that no chunk exceeds 8,000 characters. Here's what I came up with so far, but I've got CASE statements and I can't seem to wrap my head around getting rid of them, or finding a better way. It doesn't appear to take more than 15.6 milliseconds to run, but from SSMS I assume compile time & row delivery of 8 rows of 8K makes it take at least 2 seconds to complete. So I ran SQL Profiler and it provided a duration of 20 ms, so maybe the code is okay, but I figured I might have missed something easily enough, and that another pair of eyes wouldn't hurt. Here's the code:--CREATE FUNCTION dbo.DelimitedSplitVarcharMax (
DECLARE @pString varchar(max) = '25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003,25023,100,25019,25008,25005,25010,25021,25009,25022,25011,25012,25015,25016,15,57,25017,25018,25007,59,25003',
@pDelimiter char(1) = ','
, @START_DATE AS datetime2(7) = sysdatetime(); -- THIS LINE NOT NEEDED FOR THE FUNCTION
--)
--RETURNS TABLE WITH SCHEMABINDING AS
--RETURN
WITH E1 AS (
SELECT 1 AS N UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2 AS (
SELECT 1 AS N
FROM E1 AS a, E1 AS b
),
E6 AS (
SELECT TOP ((LEN(@pString) / 8000) + 1) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N
FROM E2 AS a, E2 AS b, E2 AS c
),
ALL_STRINGS AS (
SELECT E6.N,
SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA) AS STRING_PART,
LEN(SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA)) + 1 +
CASE SUBSTRING(@pString, LEN(SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA)) + 2, 1) WHEN ',' THEN 1 ELSE 0 END AS START_NEXT
FROM E6
CROSS APPLY (SELECT SUBSTRING(@pString, (E6.N - 1) * 8000, 8000) AS PARTIAL_STRING) AS PS
CROSS APPLY (SELECT LEN(PS.PARTIAL_STRING) - CASE WHEN LEN(@pString) > 8000 THEN CHARINDEX(@pDelimiter, REVERSE(PS.PARTIAL_STRING)) ELSE 0 END AS LAST_COMMA) AS LC
WHERE E6.N = 1
UNION ALL
SELECT E6.N,
SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA) AS STRING_PART,
S.START_NEXT + LEN(SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA)) + 1 +
CASE SUBSTRING(@pString, LEN(SUBSTRING(PS.PARTIAL_STRING, 1, LC.LAST_COMMA)) + 2, 1) WHEN ',' THEN 1 ELSE 0 END AS START_NEXT
FROM ALL_STRINGS AS S
INNER JOIN E6
ON S.N = E6.N - 1
CROSS APPLY (SELECT SUBSTRING(@pString, S.START_NEXT, 8000) AS PARTIAL_STRING) AS PS
CROSS APPLY (SELECT LEN(PS.PARTIAL_STRING) - CASE WHEN S.START_NEXT + 8000 <= LEN(@pString) THEN CHARINDEX(@pDelimiter, REVERSE(PS.PARTIAL_STRING)) ELSE 0 END AS LAST_COMMA) AS LC
WHERE E6.N > 1
AND S.START_NEXT < LEN(@pString)
)
SELECT N AS RowNum, STRING_PART --, LEN(STRING_PART) AS NUM_CHARS, START_NEXT, RIGHT(STRING_PART, 12) AS RIGHT_PART
FROM ALL_STRINGS;
PRINT DATEDIFF(ns, @START_DATE, sysdatetime()) / 1000000000.;
GO
EDIT: Added execution plan.
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
October 12, 2017 at 2:56 pm
No takers, eh? BUMP...
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
October 13, 2017 at 9:45 am
Well, shucks folks... Was hoping someone would at least look closely enough to see if I might have missed an opportunity to make it better. BUMP... Any and all commentary is welcome...
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
October 13, 2017 at 10:01 am
sgmunson - Friday, October 13, 2017 9:45 AMWell, shucks folks... Was hoping someone would at least look closely enough to see if I might have missed an opportunity to make it better. BUMP... Any and all commentary is welcome...
Hi Steve, I'll try to find time for this over the weekend. Sorry it's been missed.
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
October 13, 2017 at 10:09 am
ChrisM@Work - Friday, October 13, 2017 10:01 AMsgmunson - Friday, October 13, 2017 9:45 AMWell, shucks folks... Was hoping someone would at least look closely enough to see if I might have missed an opportunity to make it better. BUMP... Any and all commentary is welcome...Hi Steve, I'll try to find time for this over the weekend. Sorry it's been missed.
Thank you kind sir!
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
October 13, 2017 at 5:17 pm
You're still joining the inline Tally functionality with the blob and, no matter how you swing it, that's still going to be a performance problem. A "nibbler" While Loop will probably prove to be faster for the 8k splits.
I may also be that the doubling in performance that Eirikur Eiriksson came up with as a modification to the DelimitedSplit8K function may make up the performance problems associated with joining to blobs fast enough to handle blobs. Please see PART 1 of his article at the following URL.
http://www.sqlservercentral.com/articles/SQL+Server+2012/106903/
--Jeff Moden
Change is inevitable... Change for the better is not.
October 14, 2017 at 6:27 am
Steve, would something like this work for you? Kinda of "Quirky Splitter"... It decomposed a 335,266 character proc, (the longest text string I that was readily available) start to finish in ~325 ms. (the split/update operation itself was only 46).
The idea is to use the "nibbler" effect but get it at quirky update speeds.
I'm sure there room for improvement, but it's a place to start.
-- SET STATISTICS IO,TIME ON;
-- SET STATISTICS IO,TIME OFF;
SET NOCOUNT ON;
DECLARE @_big_string NVARCHAR(MAX);
SELECT TOP 1
@_big_string = sm.definition
--sm.object_id
FROM
sys.sql_modules sm
WHERE
sm.object_id =539817113
--EXEC dbo.LongPrint @_big_string;
--SELECT LEN(@_big_string)
IF OBJECT_ID('tempdb..#_string_parts', 'U') IS NOT NULL
DROP TABLE #_string_parts;
CREATE TABLE #_string_parts (
segment_id INT NOT NULL PRIMARY KEY CLUSTERED,
segment_text VARCHAR(8000) NULL
);
WITH
cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)),
cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b),
cte_n3 (n) AS (SELECT 1 FROM cte_n2 a CROSS JOIN cte_n2 b),
cte_Tally (n) AS (
SELECT TOP ((LEN(@_big_string) / 6000)) -- allowing extra rows incase they are needed
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
cte_n3 a CROSS JOIN cte_n3 b
)
INSERT #_string_parts (segment_id)
SELECT t.n FROM cte_Tally t;
DECLARE
@_string_finder INT = 0,
@_string_cutter varchar(8000) = '';
UPDATE sp SET
@_string_finder = 8000 - ISNULL(NULLIF(CHARINDEX(CHAR(10)+CHAR(13), REVERSE(SUBSTRING(@_big_string, 1, 8000)), 1), 0), 8000),
@_string_cutter = sp.segment_text = LEFT(@_big_string, @_string_finder),
@_big_string = STUFF(@_big_string, 1, @_string_finder, '')
FROM
#_string_parts sp;
SELECT * FROM #_string_parts sp;
Statistics IO & Time...SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'sysschobjs'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 242, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 15 ms, elapsed time = 2 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 5 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 0, logical reads 111, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 1, logical reads 338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 233, physical reads 0, read-ahead reads 0, lob logical reads 29442, lob physical reads 0, lob read-ahead reads 630.
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 46 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 1, logical reads 45, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 336 ms.
October 14, 2017 at 8:57 am
Jason A. Long - Saturday, October 14, 2017 6:27 AMSteve, would something like this work for you? Kinda of "Quirky Splitter"... It decomposed a 335,266 character proc, (the longest text string I that was readily available) start to finish in ~325 ms. (the split/update operation itself was only 46).
The idea is to use the "nibbler" effect but get it at quirky update speeds.
I'm sure there room for improvement, but it's a place to start.
-- SET STATISTICS IO,TIME ON;
-- SET STATISTICS IO,TIME OFF;SET NOCOUNT ON;
DECLARE @_big_string NVARCHAR(MAX);SELECT TOP 1
@_big_string = sm.definition
--sm.object_id
FROM
sys.sql_modules sm
WHERE
sm.object_id =539817113--EXEC dbo.LongPrint @_big_string;
--SELECT LEN(@_big_string)IF OBJECT_ID('tempdb..#_string_parts', 'U') IS NOT NULL
DROP TABLE #_string_parts;CREATE TABLE #_string_parts (
segment_id INT NOT NULL PRIMARY KEY CLUSTERED,
segment_text VARCHAR(8000) NULL
);WITH
cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)),
cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b),
cte_n3 (n) AS (SELECT 1 FROM cte_n2 a CROSS JOIN cte_n2 b),
cte_Tally (n) AS (
SELECT TOP ((LEN(@_big_string) / 6000)) -- allowing extra rows incase they are needed
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
cte_n3 a CROSS JOIN cte_n3 b
)
INSERT #_string_parts (segment_id)
SELECT t.n FROM cte_Tally t;DECLARE
@_string_finder INT = 0,
@_string_cutter varchar(8000) = '';UPDATE sp SET
@_string_finder = 8000 - ISNULL(NULLIF(CHARINDEX(CHAR(10)+CHAR(13), REVERSE(SUBSTRING(@_big_string, 1, 8000)), 1), 0), 8000),
@_string_cutter = sp.segment_text = LEFT(@_big_string, @_string_finder),
@_big_string = STUFF(@_big_string, 1, @_string_finder, '')
FROM
#_string_parts sp;SELECT * FROM #_string_parts sp;
Statistics IO & Time...
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'sysschobjs'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 242, lob physical reads 0, lob read-ahead reads 0.SQL Server Execution Times:
CPU time = 15 ms, elapsed time = 2 ms.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 5 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 0, logical reads 111, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 1, logical reads 338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 233, physical reads 0, read-ahead reads 0, lob logical reads 29442, lob physical reads 0, lob read-ahead reads 630.SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 46 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Table '#_string_parts______________________________________________________________________________________________________000000002657'. Scan count 1, logical reads 45, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 336 ms.
What an awesome idea. Well done. It does have a bug in it but that doesn't take away from the incredible idea at all. The bug is that it doesn't include the final segment of the code, which also means that it returns nothing when the code is 8K or less in length.
--Jeff Moden
Change is inevitable... Change for the better is not.
October 14, 2017 at 2:44 pm
Jeff Moden - Saturday, October 14, 2017 8:57 AMWhat an awesome idea. Well done. It does have a bug in it but that doesn't take away from the incredible idea at all. The bug is that it doesn't include the final segment of the code, which also means that it returns nothing when the code is 8K or less in length.
Thank you Jeff... You are absolutely correct, It falls flat on it's head when the string isn't long enough to get a row out of the top operator. The following appears to solve it.. (as before, no serious testing has been done on my part)
SELECT TOP (ISNULL(NULLIF((LEN(@_big_string) / 6000), 0), 1)) -- allowing extra rows incase they are needed
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -- ISNULL(NULLIF(..., 0), 1makes sure at least one row is added.
That said, this ended up being my fallback idea. What I really want to do is get single statement that work like the reverse of the following... (not sure it has a common name)
Of course going in reverse causes the current parsed value to get lost in the ether as soon as the next value is lopped off.
Part of my brain seems to think that there's a way to get stay with the tally row where it was parsed. I just haven't got my head around a solution nor have I convinced myself that it's impossible (yet).
If you have any ideas, I'd be very interested in knowing what they are... Same goes for anyone else who has an idea for persisting the parsed values without using multi-statement syntax...
DECLARE @ObjectList NVARCHAR(4000);
SELECT
@ObjectList = CONCAT(@ObjectList, N',
', QUOTENAME(ao.name))
FROM
sys.all_objects ao
WHERE
ao.object_id < 0
ORDER BY
ao.object_id
OFFSET 1 ROWS FETCH NEXT 200 ROWS ONLY;
print( @ObjectList);
October 19, 2017 at 12:30 pm
Nice ideas, folks. Currently, my code runs in ~20 ms (in my environment) when splitting a 61K varchar(max) value into 8 chunks, and at the moment, that's a bit less than half of what the best one appears to just do the split part in, so I'm pretty sure I'll stick with what I have, but perhaps the question to ask now is if anyone used a test rig on my code and measured performance across a rather larger number of values. These values would, in the vast majority of cases, not be coming from column values in a table directly, but would instead be "assembled comma-separated lists" that end up being passed as parameters, and I suspect that could make a difference in how volume on this could be tested.
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
October 19, 2017 at 1:01 pm
sgmunson - Thursday, October 19, 2017 12:30 PMNice ideas, folks. Currently, my code runs in ~20 ms (in my environment) when splitting a 61K varchar(max) value into 8 chunks, and at the moment, that's a bit less than half of what the best one appears to just do the split part in, so I'm pretty sure I'll stick with what I have, but perhaps the question to ask now is if anyone used a test rig on my code and measured performance across a rather larger number of values. These values would, in the vast majority of cases, not be coming from column values in a table directly, but would instead be "assembled comma-separated lists" that end up being passed as parameters, and I suspect that could make a difference in how volume on this could be tested.
Sorry, I just tested against sys.sql_modules.definition.
As far as a solution... If you're handy with C#, maybe start with Adam Machanic's CLR splitter...
October 19, 2017 at 3:45 pm
Jason A. Long - Thursday, October 19, 2017 1:01 PMSorry, I just tested against sys.sql_modules.definition.
As far as a solution... If you're handy with C#, maybe start with Adam Machanic's CLR splitter...
If you decide to go to the CLR route tell me and I can supply a slightly modified version of Adam's CLR that outputs row number and a item if the separator is the last char on the string to split.
October 20, 2017 at 8:04 am
frederico_fonseca - Thursday, October 19, 2017 3:45 PMJason A. Long - Thursday, October 19, 2017 1:01 PMSorry, I just tested against sys.sql_modules.definition.
As far as a solution... If you're handy with C#, maybe start with Adam Machanic's CLR splitter...If you decide to go to the CLR route tell me and I can supply a slightly modified version of Adam's CLR that outputs row number and a item if the separator is the last char on the string to split.
CLR will not be an option in this case.
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)
Viewing 13 posts - 1 through 12 (of 12 total)
You must be logged in to reply to this topic. Login to reply