Option Explicit
Dim this_month_1st As Date '処理月の1日
Dim start_year As Long '集計開始年
Dim start_year_1st As Date
Public Sub 受注実績まとめ()
Dim ws As Worksheet 'ワーク
Dim sh1 As Worksheet '受注
Dim sh2 As Worksheet '実績
Dim sh3 As Worksheet 'まとめ
Dim maxrow As Long
Dim maxcol As Long
Dim lrow As Long
Dim wrow As Long
Dim mrow As Long
Dim yyyy As Long
Dim mm As Long
Dim pkey As String
Dim key As String
Dim col As Long
Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '作業用シートを作成する
Set sh1 = Worksheets("JUTYU")
Set sh2 = Worksheets("JISSEKI")
Set sh3 = Worksheets("まとめ")
Application.ScreenUpdating = False
start_year = sh3.Cells(1, "B").Value
start_year_1st = DateSerial(start_year, 1, 1)
yyyy = Year(sh3.Cells(1, "D").Value)
mm = Month(sh3.Cells(1, "D").Value)
this_month_1st = DateSerial(yyyy, mm, 1)
maxcol = sh3.Cells(2, Columns.Count).End(xlToLeft).Column 'まとめシートの2行目の最終列を求める
sh3.Rows("3:" & Rows.Count).Clear 'まとめシートの3行以降をクリア
'作業用シートへJUTYUシートを転記する
wrow = 1
maxrow = sh1.Cells(Rows.Count, "A").End(xlUp).Row 'JUTYUシート最終行を求める
For lrow = 2 To maxrow
ws.Cells(wrow, "A").Value = sh1.Cells(lrow, "J").Value 'コード1
ws.Cells(wrow, "B").Value = sh1.Cells(lrow, "M").Value 'コード2
ws.Cells(wrow, "C").Value = sh1.Cells(lrow, "C").Value '品名1
ws.Cells(wrow, "D").Value = sh1.Cells(lrow, "L").Value '品名2
ws.Cells(wrow, "E").Value = sh1.Cells(lrow, "A").Value '日付
ws.Cells(wrow, "F").Value = sh1.Cells(lrow, "F").Value '受注数量
wrow = wrow + 1
Next
'続けて、作業用シートへJISSEKIシートを転記する
maxrow = sh2.Cells(Rows.Count, "A").End(xlUp).Row '最終行を求める
For lrow = 2 To maxrow
ws.Cells(wrow, "A").Value = sh2.Cells(lrow, "F").Value 'コード1
ws.Cells(wrow, "C").Value = sh2.Cells(lrow, "B").Value '品名1
ws.Cells(wrow, "D").Value = sh2.Cells(lrow, "E").Value '品名2
ws.Cells(wrow, "E").Value = sh2.Cells(lrow, "A").Value '日付
ws.Cells(wrow, "G").Value = sh2.Cells(lrow, "H").Value '実績数量
wrow = wrow + 1
Next
'作業用シートをソートする(1回のSortで指定可能なキーは3つ迄なので、2回に分けてソートする)
ws.Activate
Range("A1").Sort key1:=Range("D1")
Range("A1").Sort key1:=Range("A1"), key2:=Range("B1"), key3:=Range("C1")
'作業用シートを順に処理し、まとめシートへ転記する
pkey = ""
mrow = -2
For lrow = 1 To wrow - 1
key = ws.Cells(lrow, "A").Value & "|" & ws.Cells(lrow, "B").Value & "|" & ws.Cells(lrow, "C").Value & "|" & ws.Cells(lrow, "D").Value
'コード1、コード2、品名1、品名2の何れかが変われば、グループが変わったことになる
If key <> pkey Then
'グループ変更時の処理
mrow = mrow + 5
'罫線上側
sh3.Range(sh3.Cells(mrow, 1), sh3.Cells(mrow, maxcol)).Borders(xlEdgeTop).LineStyle = xlContinuous
sh3.Cells(mrow, "F").Offset(0, 0).Value = "受注"
sh3.Cells(mrow, "F").Offset(1, 0).Value = "実績"
sh3.Cells(mrow, "F").Offset(2, 0).Value = "内示"
sh3.Cells(mrow, "F").Offset(3, 0).Value = "見込み"
sh3.Cells(mrow, "F").Offset(4, 0).Value = "合計"
sh3.Cells(mrow, "A").Value = ws.Cells(lrow, "A").Value 'コード1
sh3.Cells(mrow, "B").Value = ws.Cells(lrow, "B").Value 'コード2
sh3.Cells(mrow, "D").Value = ws.Cells(lrow, "C").Value '品名1
sh3.Cells(mrow, "E").Value = ws.Cells(lrow, "D").Value '品名2
End If
'受注数量の加算
If ws.Cells(lrow, "F").Value <> "" Then
'受注数量が空白でないなら、日付から加算対象となる列を算出する
col = GetIndex(ws.Cells(lrow, "E").Value, 1)
If col > 0 Then
'加算対象となる列があるなら、その列へ加算する
sh3.Cells(mrow, col).Value = sh3.Cells(mrow, col).Value + ws.Cells(lrow, "F").Value '受注
sh3.Cells(mrow + 4, col).Value = sh3.Cells(mrow + 4, col).Value + ws.Cells(lrow, "F").Value '合計
End If
End If
'実績数量の加算
If ws.Cells(lrow, "G").Value <> "" Then
'実績数量が空白でないなら、日付から加算対象となる列を算出する
col = GetIndex(ws.Cells(lrow, "E").Value, 2)
If col > 0 Then
'加算対象となる列があるなら、その列へ加算する
sh3.Cells(mrow + 1, col).Value = sh3.Cells(mrow + 1, col).Value + ws.Cells(lrow, "G").Value '実績
sh3.Cells(mrow + 4, col).Value = sh3.Cells(mrow + 4, col).Value + ws.Cells(lrow, "G").Value '合計
End If
End If
pkey = key '前回キーを記憶
Next
If mrow > 0 Then
'罫線下側
sh3.Range(sh3.Cells(mrow + 4, 1), sh3.Cells(mrow + 4, maxcol)).Borders(xlEdgeBottom).LineStyle = xlContinuous
End If
'作業用シートを削除(削除時、警告を出さないようにする)
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
sh3.Activate
sh3.Cells(1, 1).Select
MsgBox ("完了")
End Sub
Private Function GetIndex(ByVal data_date As Date, ByVal kind As Long) As Long
Dim data_year As Long
GetIndex = -1
'集計開始年より前は、集計しない
If data_date < start_year_1st Then Exit Function
If kind = 1 Then
'受注の場合、処理月より前の月は処理しない
If data_date < this_month_1st Then Exit Function
Else
'実績の場合、処理月以降の月は処理しない
If data_date >= this_month_1st Then Exit Function
End If
'加算対象列の算出
data_year = Year(data_date)
GetIndex = 6 + (data_year - start_year) * 12 + Month(data_date)
End Function
T3B0aW9uIEV4cGxpY2l0CgpEaW0gdGhpc19tb250aF8xc3QgQXMgRGF0ZSAn5Yem55CG5pyI44GuMeaXpQpEaW0gc3RhcnRfeWVhciBBcyBMb25nICAgICAgJ+mbhuioiOmWi+Wni+W5tApEaW0gc3RhcnRfeWVhcl8xc3QgQXMgRGF0ZQpQdWJsaWMgU3ViIOWPl+azqOWun+e4vuOBvuOBqOOCgSgpCiAgICBEaW0gd3MgQXMgV29ya3NoZWV0ICAgICAn44Ov44O844KvCiAgICBEaW0gc2gxIEFzIFdvcmtzaGVldCAgICAn5Y+X5rOoCiAgICBEaW0gc2gyIEFzIFdvcmtzaGVldCAgICAn5a6f57i+CiAgICBEaW0gc2gzIEFzIFdvcmtzaGVldCAgICAn44G+44Go44KBCiAgICBEaW0gbWF4cm93IEFzIExvbmcKICAgIERpbSBtYXhjb2wgQXMgTG9uZwogICAgRGltIGxyb3cgQXMgTG9uZwogICAgRGltIHdyb3cgQXMgTG9uZwogICAgRGltIG1yb3cgQXMgTG9uZwogICAgRGltIHl5eXkgQXMgTG9uZwogICAgRGltIG1tIEFzIExvbmcKICAgIERpbSBwa2V5IEFzIFN0cmluZwogICAgRGltIGtleSBBcyBTdHJpbmcKICAgIERpbSBjb2wgQXMgTG9uZwogICAgU2V0IHdzID0gV29ya3NoZWV0cy5BZGQoYWZ0ZXI6PVdvcmtzaGVldHMoV29ya3NoZWV0cy5Db3VudCkpICAgICfkvZzmpa3nlKjjgrfjg7zjg4jjgpLkvZzmiJDjgZnjgosKICAgIFNldCBzaDEgPSBXb3Jrc2hlZXRzKCJKVVRZVSIpCiAgICBTZXQgc2gyID0gV29ya3NoZWV0cygiSklTU0VLSSIpCiAgICBTZXQgc2gzID0gV29ya3NoZWV0cygi44G+44Go44KBIikKICAgIEFwcGxpY2F0aW9uLlNjcmVlblVwZGF0aW5nID0gRmFsc2UKICAgIHN0YXJ0X3llYXIgPSBzaDMuQ2VsbHMoMSwgIkIiKS5WYWx1ZQogICAgc3RhcnRfeWVhcl8xc3QgPSBEYXRlU2VyaWFsKHN0YXJ0X3llYXIsIDEsIDEpCiAgICB5eXl5ID0gWWVhcihzaDMuQ2VsbHMoMSwgIkQiKS5WYWx1ZSkKICAgIG1tID0gTW9udGgoc2gzLkNlbGxzKDEsICJEIikuVmFsdWUpCiAgICB0aGlzX21vbnRoXzFzdCA9IERhdGVTZXJpYWwoeXl5eSwgbW0sIDEpCiAgICBtYXhjb2wgPSBzaDMuQ2VsbHMoMiwgQ29sdW1ucy5Db3VudCkuRW5kKHhsVG9MZWZ0KS5Db2x1bW4gICAn44G+44Go44KB44K344O844OI44GuMuihjOebruOBruacgOe1guWIl+OCkuaxguOCgeOCiwogICAgc2gzLlJvd3MoIjM6IiAmIFJvd3MuQ291bnQpLkNsZWFyICAgICfjgb7jgajjgoHjgrfjg7zjg4jjga4z6KGM5Lul6ZmN44KS44Kv44Oq44KiCiAgICAn5L2c5qWt55So44K344O844OI44G4SlVUWVXjgrfjg7zjg4jjgpLou6LoqJjjgZnjgosKICAgIHdyb3cgPSAxCiAgICBtYXhyb3cgPSBzaDEuQ2VsbHMoUm93cy5Db3VudCwgIkEiKS5FbmQoeGxVcCkuUm93ICdKVVRZVeOCt+ODvOODiOacgOe1guihjOOCkuaxguOCgeOCiwogICAgRm9yIGxyb3cgPSAyIFRvIG1heHJvdwogICAgICAgIHdzLkNlbGxzKHdyb3csICJBIikuVmFsdWUgPSBzaDEuQ2VsbHMobHJvdywgIkoiKS5WYWx1ZSAgICAgICAgJ+OCs+ODvOODie+8kQogICAgICAgIHdzLkNlbGxzKHdyb3csICJCIikuVmFsdWUgPSBzaDEuQ2VsbHMobHJvdywgIk0iKS5WYWx1ZSAgICAgICAgJ+OCs+ODvOODie+8kgogICAgICAgIHdzLkNlbGxzKHdyb3csICJDIikuVmFsdWUgPSBzaDEuQ2VsbHMobHJvdywgIkMiKS5WYWx1ZSAgICAgICAgJ+WTgeWQjTEKICAgICAgICB3cy5DZWxscyh3cm93LCAiRCIpLlZhbHVlID0gc2gxLkNlbGxzKGxyb3csICJMIikuVmFsdWUgICAgICAgICflk4HlkI0yCiAgICAgICAgd3MuQ2VsbHMod3JvdywgIkUiKS5WYWx1ZSA9IHNoMS5DZWxscyhscm93LCAiQSIpLlZhbHVlICAgICAgICAn5pel5LuYCiAgICAgICAgd3MuQ2VsbHMod3JvdywgIkYiKS5WYWx1ZSA9IHNoMS5DZWxscyhscm93LCAiRiIpLlZhbHVlICAgICAgICAn5Y+X5rOo5pWw6YePCiAgICAgICAgd3JvdyA9IHdyb3cgKyAxCiAgICBOZXh0CiAgICAn57aa44GR44Gm44CB5L2c5qWt55So44K344O844OI44G4SklTU0VLSeOCt+ODvOODiOOCkui7ouiomOOBmeOCiwogICAgbWF4cm93ID0gc2gyLkNlbGxzKFJvd3MuQ291bnQsICJBIikuRW5kKHhsVXApLlJvdyAn5pyA57WC6KGM44KS5rGC44KB44KLCiAgICBGb3IgbHJvdyA9IDIgVG8gbWF4cm93CiAgICAgICAgd3MuQ2VsbHMod3JvdywgIkEiKS5WYWx1ZSA9IHNoMi5DZWxscyhscm93LCAiRiIpLlZhbHVlICAgICAgICAn44Kz44O844OJ77yRCiAgICAgICAgd3MuQ2VsbHMod3JvdywgIkMiKS5WYWx1ZSA9IHNoMi5DZWxscyhscm93LCAiQiIpLlZhbHVlICAgICAgICAn5ZOB5ZCNMQogICAgICAgIHdzLkNlbGxzKHdyb3csICJEIikuVmFsdWUgPSBzaDIuQ2VsbHMobHJvdywgIkUiKS5WYWx1ZSAgICAgICAgJ+WTgeWQjTIKICAgICAgICB3cy5DZWxscyh3cm93LCAiRSIpLlZhbHVlID0gc2gyLkNlbGxzKGxyb3csICJBIikuVmFsdWUgICAgICAgICfml6Xku5gKICAgICAgICB3cy5DZWxscyh3cm93LCAiRyIpLlZhbHVlID0gc2gyLkNlbGxzKGxyb3csICJIIikuVmFsdWUgICAgICAgICflrp/nuL7mlbDph48KICAgICAgICB3cm93ID0gd3JvdyArIDEKICAgIE5leHQKICAgICfkvZzmpa3nlKjjgrfjg7zjg4jjgpLjgr3jg7zjg4jjgZnjgovvvIgx5Zue44GuU29ydOOBp+aMh+WumuWPr+iDveOBquOCreODvOOBr++8k+OBpOi/hOOBquOBruOBp+OAgTLlm57jgavliIbjgZHjgabjgr3jg7zjg4jjgZnjgovvvIkKICAgIHdzLkFjdGl2YXRlCiAgICBSYW5nZSgiQTEiKS5Tb3J0IGtleTE6PVJhbmdlKCJEMSIpCiAgICBSYW5nZSgiQTEiKS5Tb3J0IGtleTE6PVJhbmdlKCJBMSIpLCBrZXkyOj1SYW5nZSgiQjEiKSwga2V5Mzo9UmFuZ2UoIkMxIikKICAgICfkvZzmpa3nlKjjgrfjg7zjg4jjgpLpoIbjgavlh6bnkIbjgZfjgIHjgb7jgajjgoHjgrfjg7zjg4jjgbjou6LoqJjjgZnjgosKICAgIHBrZXkgPSAiIgogICAgbXJvdyA9IC0yCiAgICBGb3IgbHJvdyA9IDEgVG8gd3JvdyAtIDEKICAgICAgICBrZXkgPSB3cy5DZWxscyhscm93LCAiQSIpLlZhbHVlICYgInwiICYgd3MuQ2VsbHMobHJvdywgIkIiKS5WYWx1ZSAmICJ8IiAmIHdzLkNlbGxzKGxyb3csICJDIikuVmFsdWUgJiAifCIgJiB3cy5DZWxscyhscm93LCAiRCIpLlZhbHVlCiAgICAgICAgJ+OCs+ODvOODie+8keOAgeOCs+ODvOODie+8kuOAgeWTgeWQje+8keOAgeWTgeWQje+8kuOBruS9leOCjOOBi+OBjOWkieOCj+OCjOOBsOOAgeOCsOODq+ODvOODl+OBjOWkieOCj+OBo+OBn+OBk+OBqOOBq+OBquOCiwogICAgICAgIElmIGtleSA8PiBwa2V5IFRoZW4KICAgICAgICAgICAgJ+OCsOODq+ODvOODl+WkieabtOaZguOBruWHpueQhgogICAgICAgICAgICBtcm93ID0gbXJvdyArIDUKICAgICAgICAgICAgJ+e9q+e3muS4iuWBtAogICAgICAgICAgICBzaDMuUmFuZ2Uoc2gzLkNlbGxzKG1yb3csIDEpLCBzaDMuQ2VsbHMobXJvdywgbWF4Y29sKSkuQm9yZGVycyh4bEVkZ2VUb3ApLkxpbmVTdHlsZSA9IHhsQ29udGludW91cwogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkYiKS5PZmZzZXQoMCwgMCkuVmFsdWUgPSAi5Y+X5rOoIgogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkYiKS5PZmZzZXQoMSwgMCkuVmFsdWUgPSAi5a6f57i+IgogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkYiKS5PZmZzZXQoMiwgMCkuVmFsdWUgPSAi5YaF56S6IgogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkYiKS5PZmZzZXQoMywgMCkuVmFsdWUgPSAi6KaL6L6844G/IgogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkYiKS5PZmZzZXQoNCwgMCkuVmFsdWUgPSAi5ZCI6KiIIgogICAgICAgICAgICBzaDMuQ2VsbHMobXJvdywgIkEiKS5WYWx1ZSA9IHdzLkNlbGxzKGxyb3csICJBIikuVmFsdWUgICfjgrPjg7zjg4nvvJEKICAgICAgICAgICAgc2gzLkNlbGxzKG1yb3csICJCIikuVmFsdWUgPSB3cy5DZWxscyhscm93LCAiQiIpLlZhbHVlICAn44Kz44O844OJ77ySCiAgICAgICAgICAgIHNoMy5DZWxscyhtcm93LCAiRCIpLlZhbHVlID0gd3MuQ2VsbHMobHJvdywgIkMiKS5WYWx1ZSAgJ+WTgeWQjTEKICAgICAgICAgICAgc2gzLkNlbGxzKG1yb3csICJFIikuVmFsdWUgPSB3cy5DZWxscyhscm93LCAiRCIpLlZhbHVlICAn5ZOB5ZCNMgogICAgICAgIEVuZCBJZgogICAgICAgICflj5fms6jmlbDph4/jga7liqDnrpcKICAgICAgICBJZiB3cy5DZWxscyhscm93LCAiRiIpLlZhbHVlIDw+ICIiIFRoZW4KICAgICAgICAgICAgJ+WPl+azqOaVsOmHj+OBjOepuueZveOBp+OBquOBhOOBquOCieOAgeaXpeS7mOOBi+OCieWKoOeul+WvvuixoeOBqOOBquOCi+WIl+OCkueul+WHuuOBmeOCiwogICAgICAgICAgICBjb2wgPSBHZXRJbmRleCh3cy5DZWxscyhscm93LCAiRSIpLlZhbHVlLCAxKQogICAgICAgICAgICBJZiBjb2wgPiAwIFRoZW4KICAgICAgICAgICAgICAgICfliqDnrpflr77osaHjgajjgarjgovliJfjgYzjgYLjgovjgarjgonjgIHjgZ3jga7liJfjgbjliqDnrpfjgZnjgosKICAgICAgICAgICAgICAgIHNoMy5DZWxscyhtcm93LCBjb2wpLlZhbHVlID0gc2gzLkNlbGxzKG1yb3csIGNvbCkuVmFsdWUgKyB3cy5DZWxscyhscm93LCAiRiIpLlZhbHVlICAgICAgICAgJ+WPl+azqAogICAgICAgICAgICAgICAgc2gzLkNlbGxzKG1yb3cgKyA0LCBjb2wpLlZhbHVlID0gc2gzLkNlbGxzKG1yb3cgKyA0LCBjb2wpLlZhbHVlICsgd3MuQ2VsbHMobHJvdywgIkYiKS5WYWx1ZSAn5ZCI6KiICiAgICAgICAgICAgIEVuZCBJZgogICAgICAgIEVuZCBJZgogICAgICAgICflrp/nuL7mlbDph4/jga7liqDnrpcKICAgICAgICBJZiB3cy5DZWxscyhscm93LCAiRyIpLlZhbHVlIDw+ICIiIFRoZW4KICAgICAgICAgICAgJ+Wun+e4vuaVsOmHj+OBjOepuueZveOBp+OBquOBhOOBquOCieOAgeaXpeS7mOOBi+OCieWKoOeul+WvvuixoeOBqOOBquOCi+WIl+OCkueul+WHuuOBmeOCiwogICAgICAgICAgICBjb2wgPSBHZXRJbmRleCh3cy5DZWxscyhscm93LCAiRSIpLlZhbHVlLCAyKQogICAgICAgICAgICBJZiBjb2wgPiAwIFRoZW4KICAgICAgICAgICAgICAgICfliqDnrpflr77osaHjgajjgarjgovliJfjgYzjgYLjgovjgarjgonjgIHjgZ3jga7liJfjgbjliqDnrpfjgZnjgosKICAgICAgICAgICAgICAgIHNoMy5DZWxscyhtcm93ICsgMSwgY29sKS5WYWx1ZSA9IHNoMy5DZWxscyhtcm93ICsgMSwgY29sKS5WYWx1ZSArIHdzLkNlbGxzKGxyb3csICJHIikuVmFsdWUgJ+Wun+e4vgogICAgICAgICAgICAgICAgc2gzLkNlbGxzKG1yb3cgKyA0LCBjb2wpLlZhbHVlID0gc2gzLkNlbGxzKG1yb3cgKyA0LCBjb2wpLlZhbHVlICsgd3MuQ2VsbHMobHJvdywgIkciKS5WYWx1ZSAn5ZCI6KiICiAgICAgICAgICAgIEVuZCBJZgogICAgICAgIEVuZCBJZgogICAgICAgIHBrZXkgPSBrZXkgICfliY3lm57jgq3jg7zjgpLoqJjmhrYKICAgIE5leHQKICAgIElmIG1yb3cgPiAwIFRoZW4KICAgICAgICAn572r57ea5LiL5YG0CiAgICAgICAgc2gzLlJhbmdlKHNoMy5DZWxscyhtcm93ICsgNCwgMSksIHNoMy5DZWxscyhtcm93ICsgNCwgbWF4Y29sKSkuQm9yZGVycyh4bEVkZ2VCb3R0b20pLkxpbmVTdHlsZSA9IHhsQ29udGludW91cwogICAgRW5kIElmCiAgICAn5L2c5qWt55So44K344O844OI44KS5YmK6Zmk77yI5YmK6Zmk5pmC44CB6K2m5ZGK44KS5Ye644GV44Gq44GE44KI44GG44Gr44GZ44KL77yJCiAgICBBcHBsaWNhdGlvbi5EaXNwbGF5QWxlcnRzID0gRmFsc2UKICAgIHdzLkRlbGV0ZQogICAgQXBwbGljYXRpb24uRGlzcGxheUFsZXJ0cyA9IFRydWUKICAgIEFwcGxpY2F0aW9uLlNjcmVlblVwZGF0aW5nID0gVHJ1ZQogICAgc2gzLkFjdGl2YXRlCiAgICBzaDMuQ2VsbHMoMSwgMSkuU2VsZWN0CiAgICBNc2dCb3ggKCLlrozkuoYiKQpFbmQgU3ViCgpQcml2YXRlIEZ1bmN0aW9uIEdldEluZGV4KEJ5VmFsIGRhdGFfZGF0ZSBBcyBEYXRlLCBCeVZhbCBraW5kIEFzIExvbmcpIEFzIExvbmcKICAgIERpbSBkYXRhX3llYXIgQXMgTG9uZwogICAgR2V0SW5kZXggPSAtMQogICAgJ+mbhuioiOmWi+Wni+W5tOOCiOOCiuWJjeOBr+OAgembhuioiOOBl+OBquOBhAogICAgSWYgZGF0YV9kYXRlIDwgc3RhcnRfeWVhcl8xc3QgVGhlbiBFeGl0IEZ1bmN0aW9uCiAgICBJZiBraW5kID0gMSBUaGVuCiAgICAgICAgJ+WPl+azqOOBruWgtOWQiOOAgeWHpueQhuaciOOCiOOCiuWJjeOBruaciOOBr+WHpueQhuOBl+OBquOBhAogICAgICAgIElmIGRhdGFfZGF0ZSA8IHRoaXNfbW9udGhfMXN0IFRoZW4gRXhpdCBGdW5jdGlvbgogICAgRWxzZQogICAgICAgICflrp/nuL7jga7loLTlkIjjgIHlh6bnkIbmnIjku6XpmY3jga7mnIjjga/lh6bnkIbjgZfjgarjgYQKICAgICAgICBJZiBkYXRhX2RhdGUgPj0gdGhpc19tb250aF8xc3QgVGhlbiBFeGl0IEZ1bmN0aW9uCiAgICBFbmQgSWYKICAgICfliqDnrpflr77osaHliJfjga7nrpflh7oKICAgIGRhdGFfeWVhciA9IFllYXIoZGF0YV9kYXRlKQogICAgR2V0SW5kZXggPSA2ICsgKGRhdGFfeWVhciAtIHN0YXJ0X3llYXIpICogMTIgKyBNb250aChkYXRhX2RhdGUpCkVuZCBGdW5jdGlvbgoK