GeezerVison is showing github.com — Adding low-level support for numbering styles. by jlovegren0 · Pull Request #582 · python-openxml/python-docx
Conversation
This PR addresses the issue with numbering styles identified on StackOverflow and issues #25 and #122 .
My proposal does not add API support for these issues, but it makes it easier to handle work-arounds for users who are familiar with the numbering system from ISO 29500.
Basically, I just define the following types in the oxml submodule:
CT_NumPicBullet
CT_AbstractNum
CT_LongHexNumber
ST_LongHexNumber
CT_MultiLevelType
ST_MultiLevelType
CT_Lvl
CT_NumFmt
ST_NumberFormat
CT_LevelSuffix
ST_LevelSuffix
CT_LevelText
CT_LvlLegacy
CT_Num
Once these are defined, and the appropriate declarations are added to oxml.__init__ so that the parser can recognize them, a user can use the methods exposed by the xmlchemy submodule.
The maintainer has commented in the past that that lag on creating support for numbering is that the standard itself is very byzantine (I agree 100%) and there are some tough design choices for crafting the API. My PR is basically setting up some very low-level support so that more capable developers can look into addressing this within the API.
I have no experience with Open Source projects so I will need help from other community members for qa/qc and testing of the code. However, I have added a detailed write-up to the documentation (contributor guide, numbering section). I'll also be posting a solution to the SE question.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
…part. Discussing resolution to issues 25 and 122.
|
I cannot understand your meaning,can you give some example?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
jlovegren0
commented
Dec 6, 2018
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
I cannot understand your meaning,can you give some example?
@LilyDreamZhao there's a good example on StackOverflow of the kind of problem that my PR addresses.
https://stackoverflow.com/questions/23446268
Basically, the xmlchemy submodule makes it easy to add and manipulate XML elements, but it requires that the element types be pre-defined. So, for example, the master branch will parse the <w:abstractNum> tag, but it doesn't understand that it's of type CT_AbstractNum, so it's very difficult to make any changes to it within the API. And you need to make changes to it in order to handle numbered and bulleted lists properly.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
It's a good PR but the example file code, doesn't work with your branch.
I don't look numbering.xml for the adding AbstractNum OxmElement but the result is not good :

|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
I haven't had any contact with him about it. I think he hasn't had time
for the project lately, and my PR would take a bit of study to decide on
merging it. Hopefully it gets some attention in the future.
…
On Thu, Mar 26, 2020 at 12:15:23PM -0700, nitinkhosla79 wrote:
@jlovegren0 Do you know if scanny has reviewed this or plans on merging this PR?
@scanny
--
You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHub:
#582 (comment)
--
Jesse Lovegren
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
I haven't had any contact with him about it. I think he hasn't had time for the project lately, and my PR would take a bit of study to decide on merging it. Hopefully it gets some attention in the future.
…
On Thu, Mar 26, 2020 at 12:15:23PM -0700, nitinkhosla79 wrote: @jlovegren0 Do you know if scanny has reviewed this or plans on merging this PR? @scanny -- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: #582 (comment)
-- Jesse Lovegren
@scanny Can you advise on this PR and what all is needed? We can help with testing/regression tests and if anything else is needed, please advise.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
It's a good PR but the example file code, doesn't work with your branch.
I don't look numbering.xml for the adding AbstractNum OxmElement but the result is not good :

@jlovegren0 Do you have a working example to try? Can you please comment on the observation by @Clorel ?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
the example comes from the last post on this topic : https://stackoverflow.com/questions/23446268
I have solved the problem with insert the numbering on the template file docx and manage in low level API the abstractNum/Numbering index with a constant hash index.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
the example comes from the last post on this topic : https://stackoverflow.com/questions/23446268
I have solved the problem with insert the numbering on the template file docx and manage in low level API the abstractNum/Numbering index with a constant hash index.
@Clorel Great to hear! Are you saying that you are able use this API (in this PR and) made further edits to make it work? Would you be able to describe those or add here if @jlovegren0 is ok with that?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
sorry, not this API, the default API from python docx, with the example function "list_number" from : #25.
I don't search why my example doesn't work because ... i didn't understand what these abstractnum were and deadline...
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
sorry, not this API, the default API from python docx, with the example function "list_number" from : #25.
I don't search why my example doesn't work because ... i didn't understand what these abstractnum were and deadline...
@Clorel We tried that and that is not working for us. Infact, if the document is opened in libreoffice it shows nested list correctly but in word, it shows in 1 sequence. What change did you make there?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
"manage in low level API the abstractNum/Numbering index with a constant hash index"
@Clorel Constant hash index - can you elaborate a bit or share a code snipped for same?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
@nitinkhosla79 thanks for following up on this. I ran the code from the SE
post and indeed the document renders properly in LibreOffice, but not in
MS Word. I should add that Google Docs also renders it properly. I don't
know whether that means (a) my solution is slightly off, but LibreOffice
and Google docs are more forgiving; or (b) MS Word departs from ISO 29500
in some way and my solution is correct w/r/t the standrd. My branch has
notes at /docs/dev/analysis/features/numbering.rst that I made at the time
I made the PR (I didn't have a Word license at the time). I'm interested in
a work-around if @Clorel has found one for MS Word.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Clorel
commented
Mar 29, 2020
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
`def set_numbering(doc, par, prev=None, num_fmt_style='none', level=0, suffix_text='%1)', int_start=None):
# https://stackoverflow.com/questions/23446268/python-docx-how-to-restart-list-lettering
# #852
# \!/ USE TEMPLATE NUMBERING.XML EMBEDDED FOR DONT NEED TO CREATE ABSTRACTNUM \!/
# use list_number for default use (abstract 0-9 single bullet and decimal %1.)
# API Low Level with numbering // abstractNum map embedded because can't create abstractNum with python-docx
# Use the map from template for take NumID.
# We need to wait ISSUE #852 integration on PYTHON-DOCX for a best integration
# Get numbering style enum
# https://docs.microsoft.com/fr-fr/dotnet/api/microsoft.office.interop.word.wdnotenumberstyle?view=word-pia
"""
Function like Issue #25
Parameters
----------
doc : docx.document.Document
The document to add the list into.
par : docx.paragraph.Paragraph
The paragraph to turn into a list item.
prev : docx.paragraph.Paragraph or None
The previous paragraph in the list. If specified, the numbering
and styles will be taken as a continuation of this paragraph.
If omitted, a new numbering scheme will be started.
num_fmt_style : style of numbering (bullet, none, decimal, lowerRoman, upperRoman, lowerLetter, upperLetter,
level : int
The level of the paragraph within the outline. If ``prev`` is
set, defaults to the same level as in ``prev``. Otherwise,
defaults to zero.
suffix_text : suffix of numbering " %1. or %1) "
int_start : optionnal, if your reset numbering not starting by 1, you can submit your starting override
"""
def get_abstract_id_from_map_embedded(num_fmt, level_numbering, suffix):
# Default 0-9 (use is single level if you don't want never reset/restart element count)
# 0 abstractNum SingleLevel Decimal %1. Indent 5 Lvl 0
# 1 abstractNum SingleLevel Decimal %1. Indent 4 Lvl 0
# 2 abstractNum SingleLevel Decimal %1. Indent 3 Lvl 0
# 3 abstractNum SingleLevel Decimal %1. Indent 2 Lvl 0
# 4 abstractNum SingleLevel Bullet * Indent 4 Lvl 0
# 5 abstractNum SingleLevel Bullet * Indent 3 Lvl 0
# 6 abstractNum SingleLevel Bullet * Indent 2 Lvl 0
# 7 abstractNum SingleLevel Decimal %1. Indent 1 Lvl 0
# 8 abstractNum SingleLevel Bullet * Indent 1 Lvl 0
# Embedded AbstractNum
# 9 abstractNum multilevel upperRoman %N) Indent/Lvl * N
# 10 abstractNum multilevel decimal %N. Indent/Lvl * N
# 11 abstractNum multilevel decimal %N Indent/Lvl * N
# 12 abstractNum multilevel decimal %N) Indent/Lvl * N
# 13 abstractNum multilevel lowerLetter %N) Indent/Lvl * N
# 14 abstractNum multilevel upperLetter %N) Indent/Lvl * N
# 15 abstractNum multilevel upperLetter %N. Indent/Lvl * N
# 16 abstractNum multilevel Hybrid from Personnal Use
# 17 abstractNum multilevel Hybrid from Personnal Use (2 with true bullet word)
# 18 abstractNum multilevel upperRoman %N. Indent/Lvl * N
# 19 abstractNum multilevel lowerLetter %N. Indent/Lvl * N
# 20 abstractNum multilevel lowerRoman %N. Indent/Lvl * N
# 21 abstractNum multilevel lowerRoman %N) Indent/Lvl * N
# 22 abstractNum multilevel Bullet * Indent/Lvl * N
# 23 abstractNum multilevel none %N Indent/Lvl * N
key_abstract_num = int()
if num_fmt in ['lowerRoman', 'upperRoman', 'lowerLetter', 'upperLetter']:
is_default_suffix = True
if suffix != '%1)':
is_default_suffix = False
# Mapping
if num_fmt == 'lowerRoman':
if is_default_suffix is True:
key_abstract_num = 21
else:
key_abstract_num = 20
elif num_fmt == 'upperRoman':
if is_default_suffix is True:
key_abstract_num = 9
else:
key_abstract_num = 18
elif num_fmt == 'lowerLetter':
if is_default_suffix is True:
key_abstract_num = 13
else:
key_abstract_num = 19
elif num_fmt == 'upperLetter':
if is_default_suffix is True:
key_abstract_num = 15
else:
key_abstract_num = 14
elif num_fmt == 'bullet':
key_abstract_num = 22
"""
# (restart never)
# default embedded template from python-docx
if 0 <= level_numbering <= 3:
# use singleLevel AbstractNum
if level_numbering == 0:
key_abstract_num = 8
elif level_numbering == 1:
key_abstract_num = 6
elif level_numbering == 2:
key_abstract_num = 5
else:
key_abstract_num = 4
else:
# use default Personnal use style for indent the rest
key_abstract_num = 20
"""
elif num_fmt == 'decimal':
if suffix == '%1':
key_abstract_num = 11
"""
# (restart never)
# default embedded template from python-docx
if 0 <= level_numbering <= 4:
# use singleLevel AbstractNum
if level_numbering == 0:
key_abstract_num = 7
elif level_numbering == 1:
key_abstract_num = 3
elif level_numbering == 2:
key_abstract_num = 2
elif level_numbering == 3:
key_abstract_num = 1
else:
key_abstract_num = 0
else:
# use default Personal Use style for indent the rest
key_abstract_num = 20
"""
elif suffix == '%1)': # Default suffix
key_abstract_num = 12
else:
key_abstract_num = 10
elif num_fmt == 'defaultPersonalUse':
# defaultPersonalUse style
key_abstract_num = 17
elif num_fmt == 'none':
# None style
key_abstract_num = 23
else:
key_abstract_num = 22
return key_abstract_num
# Reset list with new numId if need it
if (prev is None or
prev._p.pPr is None or
prev._p.pPr.numPr is None or
prev._p.pPr.numPr.numId is None):
numbering = doc.part.numbering_part.numbering_definitions._numbering
# Compute the abstract ID first by style, then by num
i_num = get_abstract_id_from_map_embedded(num_fmt_style, level, suffix_text)
# Set the concrete numbering based on the abstract numbering ID
num = numbering.add_num(i_num)
# Define the new beginning of numbering count (Default 1)
int_start_override = 1
if int_start is not None:
int_start_override = int_start
# Make sure to override the abstract continuation property
num.add_lvlOverride(ilvl=level).add_startOverride(int_start_override)
# Extract the newly-allocated concrete numbering ID
num = num.numId
else:
# Get the previous concrete numbering ID
num = prev._p.pPr.numPr.numId.val
par._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = num
par._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = level
pass`
and the xml content embedded :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:numbering xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14"> <w:abstractNum w:abstractNumId="0" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7C"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="C310EC42"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1800"/> </w:tabs> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="1" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7D"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="E4089024"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1440"/> </w:tabs> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="2" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7E"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="FB12693A"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber3"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1080"/> </w:tabs> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="3" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7F"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="38441652"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber2"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="720"/> </w:tabs> <w:ind w:left="720" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="4" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF81"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="171AC3A4"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1440"/> </w:tabs> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="5" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF82"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="F3EAFDEC"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet3"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1080"/> </w:tabs> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="6" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF83"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="3D1EFFD4"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet2"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="720"/> </w:tabs> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="7" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF88"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="D0A62B40"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="360"/> </w:tabs> <w:ind w:left="360" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="8" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF89"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="29761A62"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="360"/> </w:tabs> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="9" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="0C647DA1"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="59BA9FDA"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="10" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="13753292"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="BCA24D4E"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="11" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="1A5A15D8"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="5C5242CE"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="12" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="257C4B1F"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="63DAFCC8"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="13" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="3B7F246B"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="96C6BA6C"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="14" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="3E46416B"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="51EC5CD2"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="15" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="51380F66"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="D7B24454"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="16" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="55196267"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="2FD0C538"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%2"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="357" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1077" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="w"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1797" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%7"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="17" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="5BB90EA0"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="98EAB322"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="18" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="5D9B56A1"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="F7F63982"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="19" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="615F4BDB"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="12162188"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="20" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="62051C66"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="CD3624A8"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="21" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="668A7C24"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="A0DA66B6"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="22" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="692B6527"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="02584028"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="23" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="72101706"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="FA98295A"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%1"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:num w:numId="1"> <w:abstractNumId w:val="8"/> </w:num> <w:num w:numId="2"> <w:abstractNumId w:val="6"/> </w:num> <w:num w:numId="3"> <w:abstractNumId w:val="5"/> </w:num> <w:num w:numId="4"> <w:abstractNumId w:val="4"/> </w:num> <w:num w:numId="5"> <w:abstractNumId w:val="7"/> </w:num> <w:num w:numId="6"> <w:abstractNumId w:val="3"/> </w:num> <w:num w:numId="7"> <w:abstractNumId w:val="2"/> </w:num> <w:num w:numId="8"> <w:abstractNumId w:val="1"/> </w:num> <w:num w:numId="9"> <w:abstractNumId w:val="0"/> </w:num> <w:num w:numId="10"> <w:abstractNumId w:val="12"/> </w:num> <w:num w:numId="11"> <w:abstractNumId w:val="10"/> </w:num> <w:num w:numId="12"> <w:abstractNumId w:val="9"/> </w:num> <w:num w:numId="13"> <w:abstractNumId w:val="18"/> </w:num> <w:num w:numId="14"> <w:abstractNumId w:val="20"/> </w:num> <w:num w:numId="15"> <w:abstractNumId w:val="21"/> </w:num> <w:num w:numId="16"> <w:abstractNumId w:val="14"/> </w:num> <w:num w:numId="17"> <w:abstractNumId w:val="15"/> </w:num> <w:num w:numId="18"> <w:abstractNumId w:val="19"/> </w:num> <w:num w:numId="19"> <w:abstractNumId w:val="13"/> </w:num> <w:num w:numId="20"> <w:abstractNumId w:val="23"/> </w:num> <w:num w:numId="21"> <w:abstractNumId w:val="16"/> </w:num> <w:num w:numId="22"> <w:abstractNumId w:val="22"/> </w:num> <w:num w:numId="23"> <w:abstractNumId w:val="17"/> </w:num> <w:num w:numId="24"> <w:abstractNumId w:val="11"/> </w:num> </w:numbering>
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@jlovegren0 Did you get a chance to review that section or if it gave you any clues on whether something is missing for level/restart conditions?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
@nitinkhosla79 I'll have a chance to review it in a few hours. Thanks for
the lead.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
@nitinkhosla79 I think you are referring to Microsoft's publication
MS-OI29500 which lists areas where the Word UA departs from normative ISO
29500 sections. The portion referring to 17.9.10 concerns numbering restart
elements. It is not relevant to the issue we are seeing with the example
code from the SE question. The issue is that Word is treating the
`abstractNum` definition created with python-docx as though its
`multiLevelType` was `singleLevel`. It faithfully applies the number format
for level one, but ignores subsequent levels.
I looked at XML for a multilevel list definition generated by Word. I can't
find any clear discrepancies other than Word defining some optional
elements (tmpl, nsid, tabs and indents). I don't have any ideas about why
the behavior is off.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@Clorel I work with @nitinkhosla79 on the python-docx stuff. we are trying your script and observe that this works correctly for nested numbering however, when using bullets (completely or partly) the nesting does not work. (the list shows up as single indent level list not nested)
have you faced this issue?
also, can you please elaborate further on how to incorporate your numbering.xml file in the script or when saving the file?
when I try to use it, error is shown that word is unable to read, please check contents of the file.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@jlovegren0 (like the above comment) did you face any issue with bulleting or nested/hybridnested numbering+bulleting?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@jlovegren0 Can you point out on why list_number(by @Clorel ) is working? Is it because his abstractnum definition has "multileveltype" defined as "multilevel"?
If you have any pointers on where should we focus on, we can dig deep and explore that area. If we can solve using your APIs it will be great.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
komawar
commented
Apr 8, 2020
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
@jlovegren0 hi again,
I have some questions around usage of abstractnumId (or reuse of the same):
we are trying to use custom style definitions that have color, font, txtFmt, ind, hanging, values. however, restarts, start and hanging aren't what's expected. so, I was trying to create new abstractnumId and new numId associated with them (which are then tied back to styles).
However, to get back all of the style information to new abstract num ID is quite complex. We have to manually get these values and copy them to the new abstract num ID definition
for example: right now I'm using
num_xml = d.part.numbering_part.numbering_definitions._numbering
abs_num = None
for j in num_xml.abstractNum_lst:
if j.abstractNumId == abs_num_elem.abstractNumId:
abs_num = j
st = lvl.add_start()
st.val = abs_num.get_or_add_lvl().get_or_add_start().val
...
...
lvl.add_lvlRestart().val = 1
Would be really great if:
- (Best) we are able to modify the existing abstract num ID so that some of the above information like restart, start, hanging can be specified (other elements too as we see more complex styles)
- or a next better approach could be that we have a copy.deepcopy like functionality for abstract num Ids so that we do not have to copy all the data
Also, if I have to get all the level for an existing abstract numId, can I simply use:
lvl_lst = abs_num.get_or_add_lvl()
for i in lvl_lst:
print (i.ilvl)
Can you point us in the right direction for this?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@komawar I think what needs to be done is to elaborate the definitions in oxml/numbering.py. This takes a bit of care to make sure that it sticks to the style in the base code and is sufficiently "pythonic." I committed one change where you can look up an abstractNum by its definition. I.e.,
>>> d = docx.Document('test.docx')
>>> d.part.numbering_part.element.abstractNum_having_abstractNumId(3)
<CT_AbstractNum '<w:abstractNum>' at 0x7f96432db110>
I'll try to add other methods as time permits. Just let me know what would be most useful.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@jlovegren0 I am trying to look into the styles API on python-docx and the best way to get style appears to be
d.styles.get_by_id(d.styles.get_style_id("List Number", STYP.PARAGRAPH), STYP.PARAGRAPH)
however that fetches _ParagraphStyle object. This is posing some challenges, so what would be the best way to fetch a basedOn value for the style and then fetch that style. I see a method base_style that gives what is required.
class CT_Style(BaseOxmlElement):
name = ZeroOrOne('w:name', successors=_tag_seq[1:])
basedOn = ZeroOrOne('w:basedOn', successors=_tag_seq[3:])
...
...
@property
def basedOn_val(self):
...
@property
def base_style(self):
How do we get this CT_Style style object rather than _ParagraphStyle? or do you recommend a better way to fetch base_style?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
jlovegren0
commented
Apr 10, 2020
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
@komawar _ParagraphStyle is ultimately an instance of ElementProxy. It is aptly named, as it's just a proxy for an lxml element and you can access the lxml representation through its element attribute. So just use (I hard code for clarity)
S = d.styles.get_by_id("ListNumber",1)
e = S.element
Then e is a CT_Style object which is in turn an instance of BaseOxmlElement: an lxml element with some sugar provided by xmlchemy. So you can use the properties provided by xmlchemy as follows:
>>> e.basedOn.val
'Normal'
Note that there are numerous paragraph styles based on "Normal," so it's not possible to get a unique style by its basedOn element.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@komawar One other thing to note when working with paragraph styles is that the .docx OPC container does not contain all of the styles that are visible through the UI. There are built-in styles but the styles.xml file will only contain the ones actually used in the document, I think. The issue is discussed in the base package's documentation.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
alsedev
commented
Jun 17, 2020
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
Hello @jlovegren0 and @komawar, @nitinkhosla79 and all contributing to the MS Word numbering nightmare. I do really appreciate all time you spend to solve these issues. I already read this page conversation and want to say "Thank you all!". I am working on a project and I need to generate several documents based on one template (a simple docx) and restart numbering for each new document (only for "Heading 1" and "Heading 2").
Can you please give some simple guide (python sample) to achieve that? Thank you again.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Hi @jlovegren0 and @komawar ,
Would you please showing me how to run your current nested list example. I am running on the version 0.8.10 and it has this issue. AttributeError: 'CT_Numbering' object has no attribute 'abstractNum_lst'. Would you mind showing me how to fix it. Thank you so much!

|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
@trannhutle the nested list example only works if you install the branch
that the pull request discussed in this thread is based on. As far as I
can tell the developer has abandoned this project.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
What's the current state here? We have just come across this issue and it seems like this has become stale?
|
theonesean and leonkvas reacted with thumbs up emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
What's the current state here? We have just come across this issue and it seems like this has become stale?
Seconded.
@jlovegren0 @scanny -- do we have any updates here?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
I had identified a resolution in my PR, though without any higher-level API
changes. I have not been involved with any development efforts since 2020.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Ridhaa25
commented
Sep 12, 2023
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
Hi @jlovegren0 , @komawar
Thank you for your work on this. I have been working through the code snippets mentioned above. I have been hitting my head against the wall with restarting level 0 numbered list. Do you have a python code snippet that would achieve something like this:
- Some text
1.1 Some text 1
Paragraph or heading section
- Some text
1.1 Some text 1
Any help with this would be GREATLY appreciated.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
msbike
commented
Sep 13, 2023
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
Hi @Ridhaa25,
I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).
class ParagraphExt:
p = None
def __init__(self, p: Paragraph):
self.p = p
def restart_numbering(self):
"""
Restarting the numbering of paragraph
"""
# Getting the abstract number of paragraph
abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val
# Add abstract number to numbering part and reset
num = self.p.part.numbering_part.element.add_num(abstract_num_id)
num.add_lvlOverride(ilvl=0).add_startOverride(1)
# Get or add elements to paragraph
p_pr = self.p._p.get_or_add_pPr()
num_pr = p_pr.get_or_add_numPr()
ilvl = num_pr.get_or_add_ilvl()
ilvl.val = int("0")
num_id = num_pr.get_or_add_numId()
num_id.val = int(num.numId)
To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.
p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()
Hope that will help you.
|
zebulmace, lilixxs, rpradal, and Sandwhich253989 reacted with thumbs up emoji
Ridhaa25, diggity801, zebulmace, catherinetam, GullyBurns, and Sandwhich253989 reacted with heart emoji
All reactions
-
👍
4 reactions
-
❤️
6 reactions
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Hi @msbike
Thanks so much for this. This is exactly what I was looking for. Much appreciated
|
msbike reacted with thumbs up emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Thank you for
Hi @Ridhaa25, I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).
class ParagraphExt:
p = None
def __init__(self, p: Paragraph):
self.p = p
def restart_numbering(self):
"""
Restarting the numbering of paragraph
"""
# Getting the abstract number of paragraph
abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val
# Add abstract number to numbering part and reset
num = self.p.part.numbering_part.element.add_num(abstract_num_id)
num.add_lvlOverride(ilvl=0).add_startOverride(1)
# Get or add elements to paragraph
p_pr = self.p._p.get_or_add_pPr()
num_pr = p_pr.get_or_add_numPr()
ilvl = num_pr.get_or_add_ilvl()
ilvl.val = int("0")
num_id = num_pr.get_or_add_numId()
num_id.val = int(num.numId)
To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.
p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()
Hope that will help you.
Thank you! This is what saved me.
|
msbike reacted with thumbs up emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
@msbike This snippet causes the numbering to reset to 1 on every element...Am I missing something?
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
scanny
commented
Oct 2, 2023
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
@bmoore27 There is some library code by @madphysicist described here and with code here that handles the grisly details of list-numbering. It might be worth looking at and perhaps using via his haggis library or just vendoring into your own code. His work is very solid.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Hi @Ridhaa25, 你好 I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).几个月前我解决了这个问题。我不记得任何细节,但也许以下代码截取会对您有所帮助。我扩展了 Paragraph 类并实现了一个名为 restarting_numbering( )的新方法。
class ParagraphExt:
p = None
def __init__(self, p: Paragraph):
self.p = p
def restart_numbering(self):
"""
Restarting the numbering of paragraph
"""
# Getting the abstract number of paragraph
abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val
# Add abstract number to numbering part and reset
num = self.p.part.numbering_part.element.add_num(abstract_num_id)
num.add_lvlOverride(ilvl=0).add_startOverride(1)
# Get or add elements to paragraph
p_pr = self.p._p.get_or_add_pPr()
num_pr = p_pr.get_or_add_numPr()
ilvl = num_pr.get_or_add_ilvl()
ilvl.val = int("0")
num_id = num_pr.get_or_add_numId()
num_id.val = int(num.numId)
To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.要使用此方法,您需要使用普通的 Paragraph(此处为 p)创建此类的实例并调用该方法。
p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()
Hope that will help you.希望对你有所帮助。
thanks
|
etlweather and lilixxs reacted with thumbs up emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Please consider implementing Ridhaa25's solution to the restart numbering problem. It being an actual feature in word leads me to believe that this would be the fitting place to implement it rather than all of us users' codebases.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Yes this should be implemented. It is foundation functionality.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
please, add this function
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Agreed - why is this not being incorporated? I found it to be highly useful.
…
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 3, 2026
Reviewers
1 more reviewer
komawar
komawar left review comments
Reviewers whose approvals may not affect merge requirements
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|